quarchpy 2.2.12.dev1__py2.py3-none-any.whl → 2.2.13__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1696) hide show
  1. quarchpy/__pycache__/__init__.cpython-310.pyc +0 -0
  2. quarchpy/__pycache__/_version.cpython-310.pyc +0 -0
  3. quarchpy/__pycache__/connection.cpython-310.pyc +0 -0
  4. quarchpy/__pycache__/install_qps.cpython-310.pyc +0 -0
  5. quarchpy/_version.py +1 -1
  6. quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.qfg +196 -196
  7. quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v4.000 c1.3.qfg +198 -198
  8. quarchpy/config_files/Cable_Modules/QTL1253-02 - Mini SAS Module Config v3.5 c1.3.qfg +196 -196
  9. quarchpy/config_files/Cable_Modules/QTL1253-02 - Mini SAS Module Config v4.000 c1.3.qfg +198 -198
  10. quarchpy/config_files/Cable_Modules/QTL1253-xx - Mini SAS Module Config v4.003 c1.6.qfg +197 -197
  11. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v3.5 c1.2.qfg +188 -188
  12. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v4.000 c1.2.qfg +190 -190
  13. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v4.100 c1.3.qfg +189 -189
  14. quarchpy/config_files/Cable_Modules/QTL1292-xx - SFP+ Cable Pull Module Config v4.000 c1.1.qfg +154 -154
  15. quarchpy/config_files/Cable_Modules/QTL1309-04 - USB 3.0 Module Config v4.003 c1.2.qfg +187 -187
  16. quarchpy/config_files/Cable_Modules/QTL1309-xx - USB 3.0 Module Config v3.5 c1.1.qfg +187 -187
  17. quarchpy/config_files/Cable_Modules/QTL1309-xx - USB 3.0 Module Config v4.000 c1.1.qfg +188 -188
  18. quarchpy/config_files/Cable_Modules/QTL1366-xx - QSFP Cable Pull Module Config v4.000 c1.1.qfg +209 -209
  19. quarchpy/config_files/Cable_Modules/QTL1383-xx - eSATAp Module Config v4.000 c1.3.qfg +190 -190
  20. quarchpy/config_files/Cable_Modules/QTL1521-02 - Mini SAS HD Module Config v4.000 c1.1.qfg +210 -210
  21. quarchpy/config_files/Cable_Modules/QTL1521-03 - Mini SAS HD Module Config v4.000 c1.1.qfg +210 -210
  22. quarchpy/config_files/Cable_Modules/QTL1521-05 - Mini SAS HD Module Config v4.005 c1.1.qfg +209 -209
  23. quarchpy/config_files/Cable_Modules/QTL1521-05 - Mini SAS HD Module Config v4.007 c1.2.qfg +209 -209
  24. quarchpy/config_files/Cable_Modules/QTL1521-xx - Mini SAS HD Module Config v4.003 c1.5.qfg +209 -209
  25. quarchpy/config_files/Cable_Modules/QTL1663-xx - Quad QSFP Cable Pull Module Config v4.000 c1.1.qfg +308 -308
  26. quarchpy/config_files/Cable_Modules/QTL1675-05 - Mini SAS HD Module w Triggering Config v4.007 c1.3.qfg +211 -211
  27. quarchpy/config_files/Cable_Modules/QTL1675-xx - Mini SAS HD Module w Triggering Config v4.000 c1.1.qfg +210 -210
  28. quarchpy/config_files/Cable_Modules/QTL1917-xx - Dual SFP+ Cable Pull Module Config v4.000 c1.1.qfg +174 -174
  29. quarchpy/config_files/Cable_Modules/QTL1971-01 - USB TypeC Module Config v4.000 c1.1.qfg +203 -203
  30. quarchpy/config_files/Cable_Modules/QTL1971-02 - USB TypeC Module Config v4.000 c1.1.qfg +203 -203
  31. quarchpy/config_files/Cable_Modules/QTL2022-xx - RJ-45 Cable Module Config v4.104 c1.3.QFG +189 -189
  32. quarchpy/config_files/Cable_Modules/QTL2058-xx - External PCIe Module Config v4.001 c1.1.qfg +209 -209
  33. quarchpy/config_files/Cable_Modules/QTL2138-01 - SFP28 Cable Pull Module Config v4.000 c1.1.qfg +154 -154
  34. quarchpy/config_files/Cable_Modules/QTL2146-01 - Gen4 OCuLink Cable Module Config v4.001 c1.1.qfg +212 -212
  35. quarchpy/config_files/Cable_Modules/QTL2162-01 - 24G mini SAS HD Cable Break Module Config v4.000 c1.qfg +209 -209
  36. quarchpy/config_files/Cable_Modules/QTL2171-01 - QSFP28 Cable Module Config v4.000 c1.qfg +198 -198
  37. quarchpy/config_files/Cable_Modules/QTL2171-02 - QSFP28 Cable Module Config v4.000 c1.qfg +198 -198
  38. quarchpy/config_files/Cable_Modules/QTL2341-01 - Gen4 External PCIe Cable Module v4.000.qfg +209 -209
  39. quarchpy/config_files/Cable_Modules/QTL2602-xx - Multiprotocol Link Breaker.qfg +178 -178
  40. quarchpy/config_files/Cable_Modules/QTL2834-xx - -48V DC Breaker Module v5.000 c1.0.qfg +177 -177
  41. quarchpy/config_files/Card_Modules/QTL1069-xx - SBB 2.0 Module Config v3.5 c1.1.qfg +366 -366
  42. quarchpy/config_files/Card_Modules/QTL1630-01 - PCIe Card Module v4.000 c1.0.qfg +280 -280
  43. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.004 c1.2.qfg +283 -283
  44. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.005 c1.2.qfg +283 -283
  45. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.100 c1.4.qfg +284 -284
  46. quarchpy/config_files/Card_Modules/QTL1630-04 - PCIe Card Module Config v4.001 c1.1.qfg +287 -287
  47. quarchpy/config_files/Card_Modules/QTL1630-04 - PCIe Card Module Config v4.004 c1.2.qfg +287 -287
  48. quarchpy/config_files/Card_Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.004 c1.2.qfg +284 -284
  49. quarchpy/config_files/Card_Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.006 c1.3.qfg +285 -285
  50. quarchpy/config_files/Card_Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.001 c1.1.qfg +286 -286
  51. quarchpy/config_files/Card_Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.004 c1.2.qfg +288 -288
  52. quarchpy/config_files/Card_Modules/QTL1688-04 - PCIe Card Module w Triggering Config v4.005 c1.5.qfg +288 -288
  53. quarchpy/config_files/Card_Modules/QTL1688-05 - PCIe Card Module w Triggering Config v4.005 c1.qfg +288 -288
  54. quarchpy/config_files/Card_Modules/QTL1848-01 - PCIe Lite Card Module Config v4.000.qfg +122 -122
  55. quarchpy/config_files/Card_Modules/QTL1848-02 - PCIe Lite Card Module Config v4.000.qfg +134 -134
  56. quarchpy/config_files/Card_Modules/QTL1919-01 - PCIe x8 Card Module Config v4.001 c1.4.qfg +247 -247
  57. quarchpy/config_files/Card_Modules/QTL1920-01 - PCIe x8 Card Module w Triggering Config v4.000 c1.3.qfg +247 -247
  58. quarchpy/config_files/Card_Modules/QTL2019-xx - M.2 Horizontal Card Module Config v4.002 c1.1.qfg +219 -219
  59. quarchpy/config_files/Card_Modules/QTL2034-xx - M.2 M-Key Vertical Module Config v4.001 c1.1.qfg +221 -221
  60. quarchpy/config_files/Card_Modules/QTL2067-xx - PCIe SFF Module Config v4.000 c1.1.qfg +248 -248
  61. quarchpy/config_files/Card_Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.006 c1.4.qfg +256 -256
  62. quarchpy/config_files/Card_Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.007 c1.4.qfg +256 -256
  63. quarchpy/config_files/Card_Modules/QTL2073-01 - GEN3 PCIe Lite Card Module Config v4.001.qfg +134 -134
  64. quarchpy/config_files/Card_Modules/QTL2073-01 - PCIe Lite Card Module Config v4.000.qfg +134 -134
  65. quarchpy/config_files/Card_Modules/QTL2074-01 - GEN3 PCIe HS Card Module v4.005 c1.4.qfg +287 -287
  66. quarchpy/config_files/Card_Modules/QTL2074-01 - PCIe Card Module Config CurrentLimit v4.004 c1.2.qfg +287 -287
  67. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.1.qfg +287 -287
  68. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.3.qfg +277 -277
  69. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v5.000 c1.4.qfg +277 -277
  70. quarchpy/config_files/Card_Modules/QTL2094-01 - Sanblaze Dualport Riser Card Config v4.001 c1.1.qfg +223 -223
  71. quarchpy/config_files/Card_Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.000 c1.1.qfg +287 -287
  72. quarchpy/config_files/Card_Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.4.qfg +277 -277
  73. quarchpy/config_files/Card_Modules/QTL2135-xx - PCIe GEN4 Card Module w Triggering Config - Inrush Limit v4.001 c1.4.qfg +277 -277
  74. quarchpy/config_files/Card_Modules/QTL2161-01 - EDSFF x8 Module Config v4.000 c1.1.qfg +210 -210
  75. quarchpy/config_files/Card_Modules/QTL2171-xx - EDSFF x8 Module w Triggering Config 4.001 c1.1.qfg +213 -213
  76. quarchpy/config_files/Card_Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.000 c1.1.qfg +218 -218
  77. quarchpy/config_files/Card_Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.005 c1.5.qfg +218 -218
  78. quarchpy/config_files/Card_Modules/QTL2272-01 - GEN4 EDSFF x8 Module Config v4.000 c1.1.qfg +211 -211
  79. quarchpy/config_files/Card_Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.000 c1.1.qfg +212 -212
  80. quarchpy/config_files/Card_Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.002 c1.2.qfg +212 -212
  81. quarchpy/config_files/Card_Modules/QTL2318-01 - SANBlaze U.2 Rack Riser Card Config v4.000 c1.1.qfg +218 -218
  82. quarchpy/config_files/Card_Modules/QTL2322-03 - GEN4 M.2 M-Key Vertical Breaker Module Config v5.001 c1.3.qfg +220 -220
  83. quarchpy/config_files/Card_Modules/QTL2322-xx - GEN4 M.2 M-Key Vertical Breaker Module Config v5.000 c1.1.qfg +208 -208
  84. quarchpy/config_files/Card_Modules/QTL2334-xx - Gen4 EDSFF x4 Card Module Config v4.000 c1.1.qfg +187 -187
  85. quarchpy/config_files/Card_Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.000 c1.1.qfg +189 -189
  86. quarchpy/config_files/Card_Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.001 c1.2.qfg +190 -190
  87. quarchpy/config_files/Card_Modules/QTL2357-xx - PCIe GEN5 Card Module Config v5.000 c1.1.qfg +282 -282
  88. quarchpy/config_files/Card_Modules/QTL2358-xx - PCIe GEN5 Card Module w Triggering Config v5.000 c1.1.qfg +283 -283
  89. quarchpy/config_files/Card_Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.000 c1.1.qfg +215 -215
  90. quarchpy/config_files/Card_Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.001 c1.2.qfg +217 -217
  91. quarchpy/config_files/Card_Modules/QTL2395-01 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.000 c1.1.qfg +208 -208
  92. quarchpy/config_files/Card_Modules/QTL2395-02 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.qfg +220 -220
  93. quarchpy/config_files/Card_Modules/QTL2395-03 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.qfg +220 -220
  94. quarchpy/config_files/Card_Modules/QTL2396-xx - PCIe GEN5 Card Module w inrush Config v5.000 c1.1.qfg +282 -282
  95. quarchpy/config_files/Card_Modules/QTL2403-xx - Gen4 PCIe Lite Module Config v4.000.qfg +135 -135
  96. quarchpy/config_files/Card_Modules/QTL2515-xx - PCIe GEN4 Card Module w Triggering - Inrush Limit Config v4.001 c1.3.qfg +277 -277
  97. quarchpy/config_files/Card_Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.000.qfg +130 -130
  98. quarchpy/config_files/Card_Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.003.qfg +137 -137
  99. quarchpy/config_files/Card_Modules/QTL2658-xx - Gen5 PCIe Lite Module w Inrush Config v4.000.qfg +130 -130
  100. quarchpy/config_files/Card_Modules/QTL2661-xx - GEN5 PCIe U.3 Breaker Config w Triggering v5.000 c1.1.qfg +229 -229
  101. quarchpy/config_files/Card_Modules/QTL2662-xx - GEN5 PCIe U.3 Breaker Config v5.000 c1.1.qfg +228 -228
  102. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.000.qfg +230 -230
  103. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.001 c1.2.qfg +233 -233
  104. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker v5.000 c1.1.qfg +230 -230
  105. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker +Triggering Config v5.000.qfg +230 -230
  106. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering Config v5.001 c1.2.qfg +233 -233
  107. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering v5.000 c1.1.qfg +230 -230
  108. quarchpy/config_files/Card_Modules/QTL2766-xx - GEN4 EDSFF E1 x8 Breaker Config v5.000.qfg +253 -253
  109. quarchpy/config_files/Card_Modules/QTL2767-xx - GEN4 EDSFF E3 x8 Breaker Config v5.000.qfg +253 -253
  110. quarchpy/config_files/Card_Modules/QTL2768-xx - GEN4 EDSFF E3 2T x8 Breaker Config v5.000.qfg +253 -253
  111. quarchpy/config_files/Card_Modules/QTL2776-xx - GEN4 EDSFF E1 x8 Breaker +Triggering Config v5.000.qfg +253 -253
  112. quarchpy/config_files/Card_Modules/QTL2777-xx - GEN4 EDSFF E3 x8 Breaker +Triggering Config v5.000.qfg +253 -253
  113. quarchpy/config_files/Card_Modules/QTL2778-xx - GEN4 EDSFF E3 2T x8 Breaker +Triggering Config v5.000.qfg +253 -253
  114. quarchpy/config_files/Card_Modules/QTL2798-xx - PCIe GEN5 Card Module w Triggering w Inrush Limit Config v5.000 c1.1.qfg +283 -283
  115. quarchpy/config_files/Card_Modules/QTL2804-xx - GEN5 MCIO x4 to U.2 Breaker Config v5.000 c1.1.qfg +234 -234
  116. quarchpy/config_files/Card_Modules/QTL2805-xx - GEN5 MCIO x4 to U.2 Breaker + Triggering Config v5.000 c1.1.qfg +234 -234
  117. quarchpy/config_files/Card_Modules/QTL2814-xx - GEN5 AIC to U.2 Breaker + Triggering Config v5.000 c1.1 .qfg +233 -233
  118. quarchpy/config_files/Card_Modules/QTL2892-xx - GEN5 EDSFF E1 x4 Breaker.qfg +233 -233
  119. quarchpy/config_files/Card_Modules/QTL2925-xx - GEN5 EDSFF E1 x4 Breaker +Triggering.qfg +233 -233
  120. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v3.5 c1.5.qfg +198 -198
  121. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v4.000 c1.5.qfg +200 -200
  122. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v4.006 c1.8.qfg +199 -199
  123. quarchpy/config_files/Drive_Modules/QTL1215-xx - Lite Module Config v3.50.qfg +118 -118
  124. quarchpy/config_files/Drive_Modules/QTL1215-xx - Lite Module Config v4.000.qfg +118 -118
  125. quarchpy/config_files/Drive_Modules/QTL1301-xx - HS Lite Module Config v3.50.qfg +129 -129
  126. quarchpy/config_files/Drive_Modules/QTL1301-xx - HS Lite Module Config v4.000.qfg +129 -129
  127. quarchpy/config_files/Drive_Modules/QTL1429-01 - EMC HS Lite Module Config v4.000.qfg +129 -129
  128. quarchpy/config_files/Drive_Modules/QTL1429-02 - EMC HS Lite Module Config v4.002.qfg +120 -120
  129. quarchpy/config_files/Drive_Modules/QTL1623-03 - 12G HS Lite Module Config v4.001.qfg +128 -128
  130. quarchpy/config_files/Drive_Modules/QTL1623-04 - 12G HS Lite Module Config v4.001.qfg +128 -128
  131. quarchpy/config_files/Drive_Modules/QTL1680-xx - SCA2 Lite Module Config v4.001.qfg +135 -135
  132. quarchpy/config_files/Drive_Modules/QTL1689-01 - 12G HS Module Config v4.001 c1.1.qfg +199 -199
  133. quarchpy/config_files/Drive_Modules/QTL1689-04 - 12G HS Module Config v4.002 c1.1.qfg +196 -196
  134. quarchpy/config_files/Drive_Modules/QTL1689-05 - 12G HS Module Config v4.002 c1.1.qfg +196 -196
  135. quarchpy/config_files/Drive_Modules/QTL1743-02 - PCIe SFF Module Config v4.003 c1.3.qfg +222 -222
  136. quarchpy/config_files/Drive_Modules/QTL1743-02 - PCIe SFF Module Config v4.006 c1.4.qfg +213 -213
  137. quarchpy/config_files/Drive_Modules/QTL1743-xx - PCIe SFF Module Config v4.000 c1.1.qfg +221 -221
  138. quarchpy/config_files/Drive_Modules/QTL1753-xx - 12G Lite Module Config v4.000.qfg +116 -116
  139. quarchpy/config_files/Drive_Modules/QTL1921-01 - EMC 12G HS Lite Module Config v4.000.qfg +120 -120
  140. quarchpy/config_files/Drive_Modules/QTL2207-01 - GEN 4 PCIe U.2 Drive Module.qfg +217 -217
  141. quarchpy/config_files/Drive_Modules/QTL2207-02 - GEN 4 PCIe U.2 Drive Module v5.000.qfg +220 -220
  142. quarchpy/config_files/Drive_Modules/QTL2207-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.qfg +221 -221
  143. quarchpy/config_files/Drive_Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module v4.001.qfg +219 -219
  144. quarchpy/config_files/Drive_Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module.qfg +219 -219
  145. quarchpy/config_files/Drive_Modules/QTL2245-01 - GEN 4 PCIe U.3 HS Drive Module v4.000.qfg +223 -223
  146. quarchpy/config_files/Drive_Modules/QTL2245-xx - GEN 4 PCIe U.3 HS Drive Module.qfg +229 -229
  147. quarchpy/config_files/Drive_Modules/QTL2266-01 - GEN 4 PCIe SFF HS Drive Module Triggering.qfg +219 -219
  148. quarchpy/config_files/Drive_Modules/QTL2266-02 - GEN 4 PCIe SFF HS Drive Module Triggering v4.002.qfg +220 -220
  149. quarchpy/config_files/Drive_Modules/QTL2266-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.qfg +221 -221
  150. quarchpy/config_files/Drive_Modules/QTL2266-XX - GEN 4 PCIe SFF HS Drive Module Triggering.qfg +219 -219
  151. quarchpy/config_files/Drive_Modules/QTL2270-01 - GEN 4 PCIe U.3 HS Drive Module Triggering v4.000.qfg +225 -225
  152. quarchpy/config_files/Drive_Modules/QTL2270-xx - GEN 4 PCIe U.3 HS Drive Module Triggering.qfg +230 -230
  153. quarchpy/config_files/Drive_Modules/QTL2542-02 - 24G SAS Drive Breaker Module v5.001.qfg +194 -194
  154. quarchpy/config_files/Drive_Modules/QTL2542-xx - 24G SAS Drive Breaker v5.000 c1.1.qfg +194 -194
  155. quarchpy/config_files/Drive_Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.000 c1.1.qfg +195 -195
  156. quarchpy/config_files/Drive_Modules/QTL2602-xx - Multiprotocol Link Breaker.qfg +178 -178
  157. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.000.qfg +227 -227
  158. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.001.qfg +227 -227
  159. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.003.qfg +227 -227
  160. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.007.qfg +229 -229
  161. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.000.qfg +228 -228
  162. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.001.qfg +228 -228
  163. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.003.qfg +228 -228
  164. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module v5.007.qfg +230 -230
  165. quarchpy/config_files/Drive_Modules/QTL2661-xx - Gen5 U.3 Drive Module + Triggering v5.000.qfg +229 -229
  166. quarchpy/config_files/Drive_Modules/QTL2662-xx - Gen5 PCIe U.3 Drive Module v5.000.qfg +228 -228
  167. quarchpy/config_files/Drive_Modules/QTL2757-xx - Gen5 SFF Lite Breaker Module Config v4.000.qfg +140 -140
  168. quarchpy/config_files/Drive_Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.qfg +253 -253
  169. quarchpy/config_files/Drive_Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker v5.001.qfg +234 -234
  170. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.001.qfg +234 -234
  171. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.002.qfg +253 -253
  172. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.qfg +253 -253
  173. quarchpy/config_files/Drive_Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker v5.001 c1.2.qfg +230 -230
  174. quarchpy/config_files/Drive_Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker with Triggering v5.002 c1.3.qfg +253 -253
  175. quarchpy/config_files/Drive_Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker with Triggering v5.001 c1.2.qfg +230 -230
  176. quarchpy/config_files/Drive_Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker with Triggering v5.002 c1.3.qfg +253 -253
  177. quarchpy/config_files/Drive_Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.001.qfg +233 -233
  178. quarchpy/config_files/Drive_Modules/Standard Drive Module Config v3.5 c1.1.qfg +171 -171
  179. quarchpy/config_files/Power_Margining/HD/QTL1944-xx - HD Power Module v5.000.qfg +123 -123
  180. quarchpy/config_files/Power_Margining/HD/QTL1944-xx - HD Power Module v5.003.qfg +124 -124
  181. quarchpy/config_files/Power_Margining/HD/QTL1995-xx - x6 HD Power Module v5.002.qfg +122 -122
  182. quarchpy/config_files/Power_Margining/HD/QTL1995-xx - x6 HD Power Module v5.003.qfg +123 -123
  183. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v5.002.qfg +122 -122
  184. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v5.003.qfg +123 -123
  185. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v6.000.qfg +124 -124
  186. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.101.qfg +78 -78
  187. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.200.qfg +80 -80
  188. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.201.qfg +82 -82
  189. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Test Power Margining Module v4.004.qfg +73 -73
  190. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.101.qfg +78 -78
  191. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.200.qfg +80 -80
  192. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.201.qfg +82 -82
  193. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.105.qfg +78 -78
  194. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.200.qfg +80 -80
  195. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.201.qfg +82 -82
  196. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.105.qfg +78 -78
  197. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.200.qfg +80 -80
  198. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.201.qfg +82 -82
  199. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.000.qfg +80 -80
  200. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.200.qfg +81 -81
  201. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.202.qfg +87 -87
  202. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.210.qfg +88 -88
  203. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.211.qfg +121 -121
  204. quarchpy/config_files/Power_Margining/XLC/QTL1824-03 - Power Margining Module V2 - Triggering v4.213.qfg +121 -121
  205. quarchpy/config_files/Power_Margining/XLC/QTL1847-01 - Power Margining Module V2 v4.213.qfg +121 -121
  206. quarchpy/config_files/Switch_Modules/QTL1390-xx - 4-8 SATA MUX Module Config v4.002.qfg +186 -186
  207. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.002.qfg +147 -147
  208. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.003.qfg +147 -147
  209. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.100.qfg +147 -147
  210. quarchpy/config_files/Switch_Modules/QTL1449-xx - 1-8 PCIe MUX Module Config v4.000.qfg +145 -145
  211. quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4.003 c1.6.qfg +194 -194
  212. quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4.006 c1.8.qfg +193 -193
  213. quarchpy/config_files/Switch_Modules/QTL1530-xx - 1-8 DP MUX Module Config v4.000.qfg +145 -145
  214. quarchpy/config_files/Switch_Modules/QTL1564-xx - 12 Port Mini SAS HD MUX Module Config v4.000.qfg +184 -184
  215. quarchpy/config_files/Switch_Modules/QTL1584-xx - 1-4 ExpressCard MUX Module Config v4.000.qfg +81 -81
  216. quarchpy/config_files/__pycache__/__init__.cpython-310.pyc +0 -0
  217. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-310.pyc +0 -0
  218. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-310.pyc +0 -0
  219. quarchpy/connection_specific/__pycache__/__init__.cpython-310.pyc +0 -0
  220. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-310.pyc +0 -0
  221. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-310.pyc +0 -0
  222. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-310.pyc +0 -0
  223. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-310.pyc +0 -0
  224. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-310.pyc +0 -0
  225. quarchpy/connection_specific/__pycache__/connection_USB.cpython-310.pyc +0 -0
  226. quarchpy/connection_specific/__pycache__/mDNS.cpython-310.pyc +0 -0
  227. quarchpy/connection_specific/connection_QIS.py +1033 -1386
  228. quarchpy/connection_specific/connection_USB.py +1 -3
  229. quarchpy/connection_specific/jdk_jres/__pycache__/__init__.cpython-310.pyc +0 -0
  230. quarchpy/connection_specific/jdk_jres/__pycache__/fix_permissions.cpython-310.pyc +0 -0
  231. quarchpy/connection_specific/jdk_jres/fix_permissions.py +69 -69
  232. quarchpy/connection_specific/mDNS.py +3 -6
  233. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-310.pyc +0 -0
  234. quarchpy/connection_specific/serial/__pycache__/serialposix.cpython-310.pyc +0 -0
  235. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-310.pyc +0 -0
  236. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-310.pyc +0 -0
  237. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-310.pyc +0 -0
  238. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-310.pyc +0 -0
  239. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_linux.cpython-310.pyc +0 -0
  240. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_posix.cpython-310.pyc +0 -0
  241. quarchpy/connection_specific/usb_libs/usb1.py +2360 -2360
  242. quarchpy/debug/SystemTest.py +22 -9
  243. quarchpy/debug/__pycache__/SystemTest.cpython-310.pyc +0 -0
  244. quarchpy/debug/__pycache__/__init__.cpython-310.pyc +0 -0
  245. quarchpy/debug/__pycache__/versionCompare.cpython-310.pyc +0 -0
  246. quarchpy/device/__init__.py +7 -1
  247. quarchpy/device/__pycache__/__init__.cpython-310.pyc +0 -0
  248. quarchpy/device/__pycache__/device.cpython-310.pyc +0 -0
  249. quarchpy/device/__pycache__/device_fixture_idn_info.cpython-310.pyc +0 -0
  250. quarchpy/device/__pycache__/device_idn_info.cpython-310.pyc +0 -0
  251. quarchpy/device/__pycache__/device_network_info.cpython-310.pyc +0 -0
  252. quarchpy/device/__pycache__/discovered_device.cpython-310.pyc +0 -0
  253. quarchpy/device/__pycache__/packet_processing.cpython-310.pyc +0 -0
  254. quarchpy/device/__pycache__/quarchArray.cpython-310.pyc +0 -0
  255. quarchpy/device/__pycache__/quarchPPM.cpython-310.pyc +0 -0
  256. quarchpy/device/__pycache__/quarchQPS.cpython-310.pyc +0 -0
  257. quarchpy/device/__pycache__/scanDevices.cpython-310.pyc +0 -0
  258. quarchpy/device/device_fixture_idn_info.py +8 -0
  259. quarchpy/device/device_idn_info.py +100 -0
  260. quarchpy/device/device_network_info.py +18 -0
  261. quarchpy/device/discovered_device.py +150 -0
  262. quarchpy/device/packet_processing.py +87 -0
  263. quarchpy/device/quarchPPM.py +3 -6
  264. quarchpy/device/scanDevices.py +81 -40
  265. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-310.pyc +0 -0
  266. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-310.pyc +0 -0
  267. quarchpy/disk_test/__pycache__/__init__.cpython-310.pyc +0 -0
  268. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-310.pyc +0 -0
  269. quarchpy/docs/CHANGES.rst +466 -452
  270. quarchpy/docs/Makefile +20 -20
  271. quarchpy/docs/_build/html/.buildinfo +4 -4
  272. quarchpy/docs/_build/html/CHANGES.html +660 -660
  273. quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +439 -439
  274. quarchpy/docs/_build/html/_sources/index.rst.txt +23 -23
  275. quarchpy/docs/_build/html/_sources/readme.rst.txt +41 -41
  276. quarchpy/docs/_build/html/_sources/source/modules.rst.txt +7 -7
  277. quarchpy/docs/_build/html/_sources/source/quarchpy.calibration.rst.txt +78 -78
  278. quarchpy/docs/_build/html/_sources/source/quarchpy.config_files.rst.txt +22 -22
  279. quarchpy/docs/_build/html/_sources/source/quarchpy.connection_specific.rst.txt +76 -76
  280. quarchpy/docs/_build/html/_sources/source/quarchpy.debug.rst.txt +38 -38
  281. quarchpy/docs/_build/html/_sources/source/quarchpy.device.rst.txt +54 -54
  282. quarchpy/docs/_build/html/_sources/source/quarchpy.disk_test.rst.txt +126 -126
  283. quarchpy/docs/_build/html/_sources/source/quarchpy.fio.rst.txt +30 -30
  284. quarchpy/docs/_build/html/_sources/source/quarchpy.iometer.rst.txt +22 -22
  285. quarchpy/docs/_build/html/_sources/source/quarchpy.qis.rst.txt +22 -22
  286. quarchpy/docs/_build/html/_sources/source/quarchpy.qps.rst.txt +22 -22
  287. quarchpy/docs/_build/html/_sources/source/quarchpy.rst.txt +50 -50
  288. quarchpy/docs/_build/html/_sources/source/quarchpy.user_interface.rst.txt +22 -22
  289. quarchpy/docs/_build/html/_sources/source/quarchpy.utilities.rst.txt +22 -22
  290. quarchpy/docs/_build/html/_static/alabaster.css +662 -662
  291. quarchpy/docs/_build/html/_static/basic.css +913 -913
  292. quarchpy/docs/_build/html/_static/custom.css +1 -1
  293. quarchpy/docs/_build/html/_static/doctools.js +149 -149
  294. quarchpy/docs/_build/html/_static/documentation_options.js +12 -12
  295. quarchpy/docs/_build/html/_static/jquery-3.4.1.js +10598 -10598
  296. quarchpy/docs/_build/html/_static/jquery.js +2 -2
  297. quarchpy/docs/_build/html/_static/language_data.js +192 -192
  298. quarchpy/docs/_build/html/_static/pygments.css +83 -83
  299. quarchpy/docs/_build/html/_static/searchtools.js +632 -632
  300. quarchpy/docs/_build/html/_static/sphinx_highlight.js +154 -154
  301. quarchpy/docs/_build/html/_static/underscore-1.3.1.js +999 -999
  302. quarchpy/docs/_build/html/_static/underscore.js +5 -5
  303. quarchpy/docs/_build/html/genindex.html +1626 -1626
  304. quarchpy/docs/_build/html/index.html +214 -214
  305. quarchpy/docs/_build/html/py-modindex.html +300 -300
  306. quarchpy/docs/_build/html/readme.html +137 -137
  307. quarchpy/docs/_build/html/search.html +123 -123
  308. quarchpy/docs/_build/html/source/changelog.html +739 -739
  309. quarchpy/docs/_build/html/source/licenses.html +181 -181
  310. quarchpy/docs/_build/html/source/modules.html +222 -222
  311. quarchpy/docs/_build/html/source/quarchpy.calibration.html +147 -147
  312. quarchpy/docs/_build/html/source/quarchpy.config_files.html +136 -136
  313. quarchpy/docs/_build/html/source/quarchpy.connection_specific.html +729 -729
  314. quarchpy/docs/_build/html/source/quarchpy.debug.html +251 -251
  315. quarchpy/docs/_build/html/source/quarchpy.device.html +1165 -1165
  316. quarchpy/docs/_build/html/source/quarchpy.disk_test.html +220 -220
  317. quarchpy/docs/_build/html/source/quarchpy.fio.html +218 -218
  318. quarchpy/docs/_build/html/source/quarchpy.html +715 -715
  319. quarchpy/docs/_build/html/source/quarchpy.iometer.html +271 -271
  320. quarchpy/docs/_build/html/source/quarchpy.qis.html +640 -640
  321. quarchpy/docs/_build/html/source/quarchpy.qps.html +186 -186
  322. quarchpy/docs/_build/html/source/quarchpy.user_interface.html +278 -278
  323. quarchpy/docs/_build/html/source/quarchpy.utilities.html +211 -211
  324. quarchpy/docs/_build/html/source/readme.html +147 -147
  325. quarchpy/docs/conf.py +56 -56
  326. quarchpy/docs/index.rst +23 -23
  327. quarchpy/docs/make.bat +35 -35
  328. quarchpy/docs/readme.rst +41 -41
  329. quarchpy/docs/source/modules.rst +7 -7
  330. quarchpy/docs/source/quarchpy.calibration.rst +78 -78
  331. quarchpy/docs/source/quarchpy.config_files.rst +22 -22
  332. quarchpy/docs/source/quarchpy.connection_specific.rst +76 -76
  333. quarchpy/docs/source/quarchpy.debug.rst +38 -38
  334. quarchpy/docs/source/quarchpy.device.rst +54 -54
  335. quarchpy/docs/source/quarchpy.disk_test.rst +126 -126
  336. quarchpy/docs/source/quarchpy.fio.rst +30 -30
  337. quarchpy/docs/source/quarchpy.iometer.rst +22 -22
  338. quarchpy/docs/source/quarchpy.qis.rst +22 -22
  339. quarchpy/docs/source/quarchpy.qps.rst +22 -22
  340. quarchpy/docs/source/quarchpy.rst +50 -50
  341. quarchpy/docs/source/quarchpy.user_interface.rst +22 -22
  342. quarchpy/docs/source/quarchpy.utilities.rst +22 -22
  343. quarchpy/fio/HIDEtest_performance_class.py +533 -533
  344. quarchpy/fio/__pycache__/FIO_interface.cpython-310.pyc +0 -0
  345. quarchpy/fio/__pycache__/__init__.cpython-310.pyc +0 -0
  346. quarchpy/install_qps.py +347 -0
  347. quarchpy/iometer/__pycache__/__init__.cpython-310.pyc +0 -0
  348. quarchpy/iometer/__pycache__/{gen_iometer_template.cpython-312.pyc → gen_iometer_template.cpython-310.pyc} +0 -0
  349. quarchpy/iometer/__pycache__/iometerFuncs.cpython-310.pyc +0 -0
  350. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-310.pyc +0 -0
  351. quarchpy/qis/__pycache__/__init__.cpython-310.pyc +0 -0
  352. quarchpy/qis/__pycache__/qisFuncs.cpython-310.pyc +0 -0
  353. quarchpy/qis/qisFuncs.py +8 -21
  354. quarchpy/qps/__pycache__/__init__.cpython-310.pyc +0 -0
  355. quarchpy/qps/__pycache__/qpsFuncs.cpython-310.pyc +0 -0
  356. quarchpy/qps/qpsFuncs.py +17 -10
  357. quarchpy/run.py +85 -51
  358. quarchpy/user_interface/__pycache__/__init__.cpython-310.pyc +0 -0
  359. quarchpy/user_interface/__pycache__/user_interface.cpython-310.pyc +0 -0
  360. quarchpy/utilities/__pycache__/TestCenter.cpython-310.pyc +0 -0
  361. quarchpy/utilities/__pycache__/TimeValue.cpython-310.pyc +0 -0
  362. quarchpy/utilities/__pycache__/__init__.cpython-310.pyc +0 -0
  363. {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dist-info}/METADATA +491 -475
  364. quarchpy-2.2.13.dist-info/RECORD +477 -0
  365. {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dist-info}/WHEEL +1 -1
  366. quarchpy/.idea/.gitignore +0 -3
  367. quarchpy/.idea/inspectionProfiles/Project_Default.xml +0 -46
  368. quarchpy/.idea/inspectionProfiles/profiles_settings.xml +0 -6
  369. quarchpy/.idea/misc.xml +0 -7
  370. quarchpy/.idea/quarchpy.iml +0 -7
  371. quarchpy/.idea/vcs.xml +0 -6
  372. quarchpy/.idea/workspace.xml +0 -63
  373. quarchpy/__pycache__/__init__.cpython-311.pyc +0 -0
  374. quarchpy/__pycache__/__init__.cpython-312.pyc +0 -0
  375. quarchpy/__pycache__/__init__.cpython-313.pyc +0 -0
  376. quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
  377. quarchpy/__pycache__/_version.cpython-312.pyc +0 -0
  378. quarchpy/__pycache__/_version.cpython-313.pyc +0 -0
  379. quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
  380. quarchpy/__pycache__/connection.cpython-312.pyc +0 -0
  381. quarchpy/__pycache__/connection.cpython-313.pyc +0 -0
  382. quarchpy/__pycache__/run.cpython-311.pyc +0 -0
  383. quarchpy/__pycache__/run.cpython-312.pyc +0 -0
  384. quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
  385. quarchpy/config_files/__pycache__/__init__.cpython-312.pyc +0 -0
  386. quarchpy/config_files/__pycache__/__init__.cpython-313.pyc +0 -0
  387. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
  388. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-312.pyc +0 -0
  389. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-313.pyc +0 -0
  390. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/Material-Icons-license.txt +0 -51
  391. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/argparse4j-LICENSE.txt +0 -23
  392. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/com.sun.istack-license.html +0 -59
  393. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/commons-io-LICENSE-2.0.txt +0 -202
  394. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/controlsfx-license.txt +0 -29
  395. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.activation-license.html +0 -59
  396. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.xml.bind-api-license.html +0 -59
  397. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-LICENSE.txt +0 -202
  398. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-NOTICE.txt +0 -239
  399. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/QTL1995-02.XML +0 -280
  400. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/QTL1999-02.XML +0 -292
  401. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/QTL2312-01.XML +0 -193
  402. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.xml +0 -597
  403. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1253-01 - Mini SAS Module Config v4.000 c1.3.xml +0 -597
  404. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1253-02 - Mini SAS Module Config v3.5 c1.3.xml +0 -597
  405. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1253-02 - Mini SAS Module Config v4.000 c1.3.xml +0 -597
  406. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1253-xx - Mini SAS Module Config v4.003 c1.6.xml +0 -599
  407. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v3.5 c1.2.xml +0 -533
  408. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v4.000 c1.2.xml +0 -533
  409. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v4.100 c1.3.xml +0 -535
  410. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1292-xx - SFP+ Cable Pull Module Config v4.000 c1.1.xml +0 -449
  411. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1309-04 - USB 3.0 Module Config v4.003 c1.2.xml +0 -530
  412. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1309-xx - USB 3.0 Module Config v3.5 c1.1.xml +0 -528
  413. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1309-xx - USB 3.0 Module Config v4.000 c1.1.xml +0 -528
  414. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1366-xx - QSFP Cable Pull Module Config v4.000 c1.1.xml +0 -684
  415. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1383-xx - eSATAp Module Config v4.000 c1.3.xml +0 -542
  416. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1521-02 - Mini SAS HD Module Config v4.000 c1.1.xml +0 -670
  417. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1521-03 - Mini SAS HD Module Config v4.000 c1.1.xml +0 -670
  418. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1521-05 - Mini SAS HD Module Config v4.005 c1.1.xml +0 -672
  419. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1521-05 - Mini SAS HD Module Config v4.007 c1.2.xml +0 -672
  420. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1521-xx - Mini SAS HD Module Config v4.003 c1.5.xml +0 -672
  421. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1663-xx - Quad QSFP Cable Pull Module Config v4.000 c1.1.xml +0 -1523
  422. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1675-05 - Mini SAS HD Module w Triggering Config v4.007 c1.3.xml +0 -673
  423. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1675-xx - Mini SAS HD Module w Triggering Config v4.000 c1.1.xml +0 -673
  424. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1917-xx - Dual SFP+ Cable Pull Module Config v4.000 c1.1.xml +0 -614
  425. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1971-01 - USB TypeC Module Config v4.000 c1.1.xml +0 -637
  426. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL1971-02 - USB TypeC Module Config v4.000 c1.1.xml +0 -641
  427. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2022-xx - RJ-45 Cable Module Config v4.104 c1.3.xml +0 -535
  428. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2058-xx - External PCIe Module Config v4.001 c1.1.xml +0 -696
  429. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2138-01 - SFP28 Cable Pull Module Config v4.000 c1.1.xml +0 -449
  430. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2146-01 - Gen4 OCuLink Cable Module Config v4.001 c1.1.xml +0 -718
  431. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2162-01 - 24G mini SAS HD Cable Break Module Config v4.000 c1.xml +0 -672
  432. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2171-01 - QSFP28 Cable Module Config v4.000 c1.xml +0 -583
  433. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2171-02 - QSFP28 Cable Module Config v4.000 c1.xml +0 -583
  434. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2341-01 - Gen4 External PCIe Cable Module v4.000.xml +0 -625
  435. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2602-xx - Multiprotocol Link Breaker.xml +0 -414
  436. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL2834-xx - -48V DC Breaker Module v5.000 c1.0.xml +0 -374
  437. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Cable Modules/QTL3000-xx - RJ-45 Cable Module v5.000 c1.4.xml +0 -539
  438. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1069-xx - SBB 2.0 Module Config v3.5 c1.1.xml +0 -1614
  439. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1630-01 - PCIe Card Module v4.000 c1.0.xml +0 -1271
  440. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.004 c1.2.xml +0 -1289
  441. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.005 c1.2.xml +0 -1289
  442. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.100 c1.4.xml +0 -1290
  443. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1630-04 - PCIe Card Module Config v4.001 c1.1.xml +0 -1297
  444. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1630-04 - PCIe Card Module Config v4.004 c1.2.xml +0 -1301
  445. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.004 c1.2.xml +0 -1290
  446. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.006 c1.3.xml +0 -1291
  447. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.001 c1.1.xml +0 -1298
  448. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.004 c1.2.xml +0 -1302
  449. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1688-04 - PCIe Card Module w Triggering Config v4.005 c1.5.xml +0 -1307
  450. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1688-05 - PCIe Card Module w Triggering Config v4.005 c1.xml +0 -1307
  451. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1848-01 - PCIe Lite Card Module Config v4.000.xml +0 -219
  452. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1848-02 - PCIe Lite Card Module Config v4.000.xml +0 -286
  453. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1919-01 - PCIe x8 Card Module Config v4.001 c1.4.xml +0 -965
  454. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL1920-01 - PCIe x8 Card Module w Triggering Config v4.000 c1.3.xml +0 -966
  455. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2019-xx - M.2 Horizontal Card Module Config v4.002 c1.1.xml +0 -703
  456. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2034-xx - M.2 M-Key Vertical Module Config v4.001 c1.1.xml +0 -737
  457. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2067-xx - PCIe SFF Module Config v4.000 c1.1.xml +0 -971
  458. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.006 c1.4.xml +0 -1020
  459. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.007 c1.4.xml +0 -1022
  460. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2073-01 - GEN3 PCIe Lite Card Module Config v4.001.xml +0 -286
  461. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2073-01 - PCIe Lite Card Module Config v4.000.xml +0 -286
  462. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2074-01 - GEN3 PCIe HS Card Module v4.005 c1.4.xml +0 -1301
  463. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2074-01 - PCIe Card Module Config CurrentLimit v4.004 c1.2.xml +0 -1301
  464. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.1.xml +0 -1307
  465. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.3.xml +0 -1212
  466. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v5.000 c1.4.xml +0 -1212
  467. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2094-01 - Sanblaze Dualport Riser Card Config v4.001 c1.1.xml +0 -773
  468. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.000 c1.1.xml +0 -1306
  469. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.4.xml +0 -1211
  470. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2135-xx - PCIe GEN4 Card Module w Triggering Config - Inrush Limit v4.001 c1.4.xml +0 -1211
  471. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2161-01 - EDSFF x8 Module Config v4.000 c1.1.xml +0 -773
  472. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2171-xx - EDSFF x8 Module w Triggering Config 4.001 c1.1.xml +0 -785
  473. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.000 c1.1.xml +0 -715
  474. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.005 c1.5.xml +0 -715
  475. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2272-01 - GEN4 EDSFF x8 Module Config v4.000 c1.1.xml +0 -771
  476. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.000 c1.1.xml +0 -666
  477. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.002 c1.2.xml +0 -666
  478. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2318-01 - SANBlaze U.2 Rack Riser Card Config v4.000 c1.1.xml +0 -715
  479. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2322-03 - GEN4 M.2 M-Key Vertical Breaker Module Config v5.001 c1.3.xml +0 -738
  480. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2322-xx - GEN4 M.2 M-Key Vertical Breaker Module Config v5.000 c1.1.xml +0 -637
  481. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2334-xx - Gen4 EDSFF x4 Card Module Config v4.000 c1.1.xml +0 -615
  482. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.000 c1.1.xml +0 -621
  483. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.001 c1.2.xml +0 -624
  484. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2357-xx - PCIe GEN5 Card Module Config v5.000 c1.1.xml +0 -1242
  485. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2358-xx - PCIe GEN5 Card Module w Triggering Config v5.000 c1.1.xml +0 -1250
  486. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.000 c1.1.xml +0 -682
  487. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.001 c1.2.xml +0 -698
  488. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2395-01 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.000 c1.1.xml +0 -647
  489. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2395-02 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.xml +0 -742
  490. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2395-03 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.xml +0 -742
  491. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2396-xx - PCIe GEN5 Card Module w inrush Config v5.000 c1.1.xml +0 -1242
  492. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2403-xx - Gen4 PCIe Lite Module Config v4.000.xml +0 -293
  493. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2515-xx - PCIe GEN4 Card Module w Triggering - Inrush Limit Config v4.001 c1.3.xml +0 -1212
  494. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.000.xml +0 -259
  495. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.003.xml +0 -288
  496. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2658-xx - Gen5 PCIe Lite Module w Inrush Config v4.000.xml +0 -259
  497. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2661-xx - GEN5 PCIe U.3 Breaker Config w Triggering v5.000 c1.1.xml +0 -813
  498. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2662-xx - GEN5 PCIe U.3 Breaker Config v5.000 c1.1.xml +0 -801
  499. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.000.xml +0 -741
  500. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.001 c1.2.xml +0 -799
  501. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.002 c1.4.xml +0 -743
  502. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker v5.000 c1.1.xml +0 -741
  503. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker +Triggering Config v5.000.xml +0 -742
  504. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering Config v5.001 c1.2.xml +0 -800
  505. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering v5.000 c1.1.xml +0 -742
  506. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2766-xx - GEN4 EDSFF E1 x8 Breaker Config v5.000.xml +0 -982
  507. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2767-xx - GEN4 EDSFF E3 x8 Breaker Config v5.000.xml +0 -982
  508. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2768-xx - GEN4 EDSFF E3 2T x8 Breaker Config v5.000.xml +0 -982
  509. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2776-xx - GEN4 EDSFF E1 x8 Breaker +Triggering Config v5.000.xml +0 -983
  510. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2777-xx - GEN4 EDSFF E3 x8 Breaker +Triggering Config v5.000.xml +0 -983
  511. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2778-xx - GEN4 EDSFF E3 2T x8 Breaker +Triggering Config v5.000.xml +0 -983
  512. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2798-xx - PCIe GEN5 Card Module w Triggering w Inrush Limit Config v5.000 c1.1.xml +0 -1250
  513. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2804-xx - GEN5 MCIO x4 to U.2 Breaker Config v5.000 c1.1.xml +0 -813
  514. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2805-xx - GEN5 MCIO x4 to U.2 Breaker + Triggering Config v5.000 c1.1.xml +0 -814
  515. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker v5.002 c1.3.xml +0 -871
  516. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2814-xx - GEN5 AIC to U.2 Breaker + Triggering Config v5.000 c1.1 .xml +0 -807
  517. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker + Triggering Config v5.002 c1.3.xml +0 -872
  518. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2892-xx - GEN5 EDSFF E1 x4 Breaker.xml +0 -799
  519. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2901-xx - GEN5 M.2 M-Key Horizontal Breaker Config v5.000 c1.1.xml +0 -753
  520. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2902-xx - GEN5 M.2 M-Key Horizontal Breaker w Triggering Config v5.000 c1.1.xml +0 -762
  521. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2902-xx- -Gen5 M.2 Horizontal Breaker +Triggering Config 5.000 c1.1.xml +0 -762
  522. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2925-xx - GEN5 EDSFF E1 x4 Breaker +Triggering.xml +0 -800
  523. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Card Modules/QTL2954-01 - fake delete.xml +0 -947
  524. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1177-xx - HS Module Config v3.5 c1.5.xml +0 -592
  525. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1177-xx - HS Module Config v4.000 c1.5.xml +0 -592
  526. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1177-xx - HS Module Config v4.006 c1.8.xml +0 -594
  527. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1215-xx - Lite Module Config v3.50.xml +0 -203
  528. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1215-xx - Lite Module Config v4.000.xml +0 -203
  529. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1301-xx - HS Lite Module Config v3.50.xml +0 -281
  530. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1301-xx - HS Lite Module Config v4.000.xml +0 -281
  531. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1429-01 - EMC HS Lite Module Config v4.000.xml +0 -281
  532. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1429-02 - EMC HS Lite Module Config v4.002.xml +0 -234
  533. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1623-03 - 12G HS Lite Module Config v4.001.xml +0 -266
  534. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1623-04 - 12G HS Lite Module Config v4.001.xml +0 -266
  535. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1680-xx - SCA2 Lite Module Config v4.001.xml +0 -333
  536. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1689-01 - 12G HS Module Config v4.001 c1.1.xml +0 -594
  537. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1689-04 - 12G HS Module Config v4.002 c1.1.xml +0 -580
  538. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1689-05 - 12G HS Module Config v4.002 c1.1.xml +0 -579
  539. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1743-02 - PCIe SFF Module Config v4.003 c1.3.xml +0 -794
  540. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1743-02 - PCIe SFF Module Config v4.006 c1.4.xml +0 -698
  541. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1743-xx - PCIe SFF Module Config v4.000 c1.1.xml +0 -789
  542. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1753-xx - 12G Lite Module Config v4.000.xml +0 -192
  543. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL1921-01 - EMC 12G HS Lite Module Config v4.000.xml +0 -233
  544. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2207-01 - GEN 4 PCIe U.2 Drive Module.xml +0 -733
  545. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2207-02 - GEN 4 PCIe U.2 Drive Module v5.000.xml +0 -753
  546. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2207-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.xml +0 -763
  547. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module v4.001.xml +0 -751
  548. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module.xml +0 -746
  549. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2245-01 - GEN 4 PCIe U.3 HS Drive Module v4.000.xml +0 -789
  550. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2245-xx - GEN 4 PCIe U.3 HS Drive Module.xml +0 -823
  551. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2266-01 - GEN 4 PCIe SFF HS Drive Module Triggering.xml +0 -743
  552. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2266-02 - GEN 4 PCIe SFF HS Drive Module Triggering v4.002.xml +0 -758
  553. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2266-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.xml +0 -764
  554. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2266-XX - GEN 4 PCIe SFF HS Drive Module Triggering.xml +0 -747
  555. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2270-01 - GEN 4 PCIe U.3 HS Drive Module Triggering v4.000.xml +0 -798
  556. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2270-xx - GEN 4 PCIe U.3 HS Drive Module Triggering.xml +0 -835
  557. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2542-02 - 24G SAS Drive Breaker Module v5.001.xml +0 -530
  558. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2542-xx - 24G SAS Drive Breaker v5.000 c1.1.xml +0 -530
  559. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.000 c1.1.xml +0 -539
  560. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.001 c1.3.xml +0 -539
  561. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2602-xx - Multiprotocol Link Breaker.xml +0 -414
  562. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.000.xml +0 -792
  563. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.001.xml +0 -792
  564. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.003.xml +0 -793
  565. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.007.xml +0 -816
  566. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.008.xml +0 -818
  567. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.000.xml +0 -801
  568. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.001.xml +0 -801
  569. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.003.xml +0 -802
  570. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module v5.007.xml +0 -825
  571. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2661-xx - Gen5 U.3 Drive Module + Triggering v5.000.xml +0 -813
  572. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2662-xx - Gen5 PCIe U.3 Drive Module v5.000.xml +0 -801
  573. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2757-xx - Gen5 SFF Lite Breaker Module Config v4.000.xml +0 -272
  574. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.xml +0 -818
  575. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker v5.001.xml +0 -813
  576. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.001.xml +0 -814
  577. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.002.xml +0 -819
  578. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.xml +0 -819
  579. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.001.xml +0 -799
  580. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.002.xml +0 -801
  581. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2940-xx - Gen5 EDSFF E3 x8 Breaker v5.000.xml +0 -1105
  582. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/QTL2941-xx - Gen5 EDSFF E3 x8 Breaker +Triggering v5.000.xml +0 -1106
  583. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Drive Modules/Standard Drive Module Config v3.5 c1.1.xml +0 -463
  584. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Switch Modules/QTL1490-xx - SATA Keyed HS Module Config v4.003 c1.6.xml +0 -555
  585. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/breaker/Switch Modules/QTL1490-xx - SATA Keyed HS Module Config v4.006 c1.8.xml +0 -557
  586. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/colors/default-colors.properties +0 -64
  587. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/colors/qtl2789-colors.properties +0 -2
  588. quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/default.xml +0 -292
  589. quarchpy/connection_specific/QPS/win-amd64/InstallType.dat +0 -1
  590. quarchpy/connection_specific/QPS/win-amd64/Power-Studio-QuickStart.pdf +0 -0
  591. quarchpy/connection_specific/QPS/win-amd64/QuarchPowerStudio.properties.xml +0 -1091
  592. quarchpy/connection_specific/QPS/win-amd64/app.jar +0 -0
  593. quarchpy/connection_specific/QPS/win-amd64/app.properties +0 -6
  594. quarchpy/connection_specific/QPS/win-amd64/commandLineOptions.txt +0 -17
  595. quarchpy/connection_specific/QPS/win-amd64/license.txt +0 -1
  596. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/com.sun.istack-license.html +0 -59
  597. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/dorkbox-LICENSE.Apachev2 +0 -218
  598. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-APACHE-2.0 +0 -202
  599. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-LGPL-3.0 +0 -165
  600. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.activation-license.html +0 -59
  601. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.xml.bind-api-license.html +0 -59
  602. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/javassist-License.html +0 -381
  603. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jmdns-LICENSE.txt +0 -202
  604. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jna-AL2.0 +0 -177
  605. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/kotlin-stdlib-LICENSE-2.0.txt +0 -202
  606. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-LICENSE.txt +0 -202
  607. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-NOTICE.txt +0 -239
  608. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/slf4j-LICENSE.txt +0 -24
  609. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/usb4java-LICENSE.md +0 -20
  610. quarchpy/connection_specific/QPS/win-amd64/qis/Comms.properties.xml +0 -102
  611. quarchpy/connection_specific/QPS/win-amd64/qis/QuarchInstrumentServer.properties.xml +0 -12
  612. quarchpy/connection_specific/QPS/win-amd64/qis/README.txt +0 -39
  613. quarchpy/connection_specific/QPS/win-amd64/qis/disableterminal.txt +0 -0
  614. quarchpy/connection_specific/QPS/win-amd64/qis/help.txt +0 -650
  615. quarchpy/connection_specific/QPS/win-amd64/qis/license.txt +0 -1
  616. quarchpy/connection_specific/QPS/win-amd64/qis/qis-NoGUI.bat +0 -3
  617. quarchpy/connection_specific/QPS/win-amd64/qis/qis-NoGUI.sh +0 -6
  618. quarchpy/connection_specific/QPS/win-amd64/qis/qis.bat +0 -3
  619. quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
  620. quarchpy/connection_specific/QPS/win-amd64/qis/qis.sh +0 -2
  621. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/CInterface-2.5.jar +0 -0
  622. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/Collections-2.4.jar +0 -0
  623. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/Desktop-1.1.jar +0 -0
  624. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/Executor-3.13.jar +0 -0
  625. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/JNA-1.2.jar +0 -0
  626. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/OS-1.8.jar +0 -0
  627. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.1.jar +0 -0
  628. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/SystemTray-4.4.jar +0 -0
  629. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/TorridonCommon-1.2.2.jar +0 -0
  630. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/Updates-1.1.jar +0 -0
  631. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/Utilities-1.46.jar +0 -0
  632. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/istack-commons-runtime-3.0.11.jar +0 -0
  633. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jakarta.activation-api-2.1.0.jar +0 -0
  634. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jakarta.xml.bind-api-4.0.0.jar +0 -0
  635. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/javassist-3.29.2-GA.jar +0 -0
  636. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jaxb-core-4.0.0.jar +0 -0
  637. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jaxb-runtime-4.0.0.jar +0 -0
  638. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.6.0.jar +0 -0
  639. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jna-jpms-5.12.1.jar +0 -0
  640. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jna-platform-jpms-5.12.1.jar +0 -0
  641. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/kotlin-stdlib-1.9.21.jar +0 -0
  642. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/netty-all-4.1.43.Final.jar +0 -0
  643. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/slf4j-api-2.0.9.jar +0 -0
  644. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/slf4j-simple-2.0.9.jar +0 -0
  645. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar +0 -0
  646. quarchpy/connection_specific/QPS/win-amd64/qis/resources/QuarchIcon_128x128.png +0 -0
  647. quarchpy/connection_specific/QPS/win-amd64/qis/resources/QuarchIcon_16x16.png +0 -0
  648. quarchpy/connection_specific/QPS/win-amd64/qis/resources/QuarchIcon_256x256.png +0 -0
  649. quarchpy/connection_specific/QPS/win-amd64/qis/resources/QuarchIcon_32x32.png +0 -0
  650. quarchpy/connection_specific/QPS/win-amd64/qis/resources/QuarchIcon_64x64.png +0 -0
  651. quarchpy/connection_specific/QPS/win-amd64/qis/resources/filters/Example.txt +0 -36
  652. quarchpy/connection_specific/QPS/win-amd64/qis/resources/filters/iec_filters.xml +0 -17
  653. quarchpy/connection_specific/QPS/win-amd64/qis/resources/org/usb4java/darwin-x86-64/libusb4java.dylib +0 -0
  654. quarchpy/connection_specific/QPS/win-amd64/qis/resources/org/usb4java/linux-aarch64/libusb4java.so +0 -0
  655. quarchpy/connection_specific/QPS/win-amd64/qis/resources/org/usb4java/linux-arm/libusb4java.so +0 -0
  656. quarchpy/connection_specific/QPS/win-amd64/qis/resources/org/usb4java/linux-x86/libusb4java.so +0 -0
  657. quarchpy/connection_specific/QPS/win-amd64/qis/resources/org/usb4java/linux-x86-64/libusb4java.so +0 -0
  658. quarchpy/connection_specific/QPS/win-amd64/qis/resources/org/usb4java/win32-x86/libusb4java.dll +0 -0
  659. quarchpy/connection_specific/QPS/win-amd64/qis/resources/org/usb4java/win32-x86-64/libusb4java.dll +0 -0
  660. quarchpy/connection_specific/QPS/win-amd64/qis.properties.xml +0 -11
  661. quarchpy/connection_specific/QPS/win-amd64/qps-command-reference.html +0 -339
  662. quarchpy/connection_specific/QPS/win-amd64/qps.jar +0 -0
  663. quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
  664. quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.1.jar +0 -0
  665. quarchpy/connection_specific/QPS/win-amd64/qps_lib/argparse4j-0.9.0.jar +0 -0
  666. quarchpy/connection_specific/QPS/win-amd64/qps_lib/commons-io-2.19.0.jar +0 -0
  667. quarchpy/connection_specific/QPS/win-amd64/qps_lib/controlsfx-11.2.2.jar +0 -0
  668. quarchpy/connection_specific/QPS/win-amd64/qps_lib/gson-2.13.1.jar +0 -0
  669. quarchpy/connection_specific/QPS/win-amd64/qps_lib/guava-33.4.8-jre.jar +0 -0
  670. quarchpy/connection_specific/QPS/win-amd64/qps_lib/istack-commons-runtime-3.0.11.jar +0 -0
  671. quarchpy/connection_specific/QPS/win-amd64/qps_lib/jakarta.activation-api-2.1.0.jar +0 -0
  672. quarchpy/connection_specific/QPS/win-amd64/qps_lib/jakarta.xml.bind-api-4.0.0.jar +0 -0
  673. quarchpy/connection_specific/QPS/win-amd64/qps_lib/jaxb-core-4.0.0.jar +0 -0
  674. quarchpy/connection_specific/QPS/win-amd64/qps_lib/jaxb-runtime-4.0.0.jar +0 -0
  675. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-base-24.0.1-linux-aarch64.jar +0 -0
  676. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-controls-24.0.1-linux-aarch64.jar +0 -0
  677. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-fxml-24.0.1-linux-aarch64.jar +0 -0
  678. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-graphics-24.0.1-linux-aarch64.jar +0 -0
  679. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-swing-24.0.1-linux-aarch64.jar +0 -0
  680. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-base-24.0.1-linux.jar +0 -0
  681. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-controls-24.0.1-linux.jar +0 -0
  682. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-fxml-24.0.1-linux.jar +0 -0
  683. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-graphics-24.0.1-linux.jar +0 -0
  684. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-swing-24.0.1-linux.jar +0 -0
  685. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-base-24.0.1-mac-aarch64.jar +0 -0
  686. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-controls-24.0.1-mac-aarch64.jar +0 -0
  687. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-fxml-24.0.1-mac-aarch64.jar +0 -0
  688. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-graphics-24.0.1-mac-aarch64.jar +0 -0
  689. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-swing-24.0.1-mac-aarch64.jar +0 -0
  690. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-base-24.0.1-mac.jar +0 -0
  691. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-controls-24.0.1-mac.jar +0 -0
  692. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-fxml-24.0.1-mac.jar +0 -0
  693. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-graphics-24.0.1-mac.jar +0 -0
  694. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-swing-24.0.1-mac.jar +0 -0
  695. quarchpy/connection_specific/QPS/win-amd64/qps_lib/netty-all-4.1.43.Final.jar +0 -0
  696. quarchpy/connection_specific/QPS/win-amd64/qps_lib/qutils-1.0.jar +0 -0
  697. quarchpy/connection_specific/QPS/win-amd64/qps_lib/txw2-4.0.0.jar +0 -0
  698. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-base-24.0.1-win.jar +0 -0
  699. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-controls-24.0.1-win.jar +0 -0
  700. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-fxml-24.0.1-win.jar +0 -0
  701. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-graphics-24.0.1-win.jar +0 -0
  702. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-swing-24.0.1-win.jar +0 -0
  703. quarchpy/connection_specific/QPS/win-amd64/resources/InstallBanner.bmp +0 -0
  704. quarchpy/connection_specific/QPS/win-amd64/resources/QPS.icns +0 -0
  705. quarchpy/connection_specific/QPS/win-amd64/resources/QPS.ico +0 -0
  706. quarchpy/connection_specific/QPS/win-amd64/resources/QPS.png +0 -0
  707. quarchpy/connection_specific/QPS/win-amd64/resources/QuarchIcon_128x128.png +0 -0
  708. quarchpy/connection_specific/QPS/win-amd64/resources/QuarchIcon_16x16.png +0 -0
  709. quarchpy/connection_specific/QPS/win-amd64/resources/QuarchIcon_256x256.png +0 -0
  710. quarchpy/connection_specific/QPS/win-amd64/resources/QuarchIcon_32x32.png +0 -0
  711. quarchpy/connection_specific/QPS/win-amd64/resources/QuarchIcon_64x64.png +0 -0
  712. quarchpy/connection_specific/QPS/win-amd64/resources/profiles/3_PHASE_PAM_AC_DEFAULT.rcf +0 -533
  713. quarchpy/connection_specific/QPS/win-amd64/resources/profiles/3_PHASE_PAM_AC_DEFAULT.scf +0 -90
  714. quarchpy/connection_specific/QPS/win-amd64/resources/profiles/3_PHASE_PAM_AC_FULL.rcf +0 -830
  715. quarchpy/connection_specific/QPS/win-amd64/resources/profiles/3_PHASE_PAM_AC_FULL.scf +0 -144
  716. quarchpy/connection_specific/QPS/win-amd64/resources/profiles/PAM_EXAMPLE_CONFIG.rcf +0 -193
  717. quarchpy/connection_specific/QPS/win-amd64/scriptCommands.txt +0 -1179
  718. quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +0 -42
  719. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-311.pyc +0 -0
  720. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-312.pyc +0 -0
  721. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-313.pyc +0 -0
  722. quarchpy/connection_specific/__pycache__/__init__.cpython-311.pyc +0 -0
  723. quarchpy/connection_specific/__pycache__/__init__.cpython-312.pyc +0 -0
  724. quarchpy/connection_specific/__pycache__/__init__.cpython-313.pyc +0 -0
  725. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
  726. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-312.pyc +0 -0
  727. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-313.pyc +0 -0
  728. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-311.pyc +0 -0
  729. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-312.pyc +0 -0
  730. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-313.pyc +0 -0
  731. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-311.pyc +0 -0
  732. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-312.pyc +0 -0
  733. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-313.pyc +0 -0
  734. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-311.pyc +0 -0
  735. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-312.pyc +0 -0
  736. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-313.pyc +0 -0
  737. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-311.pyc +0 -0
  738. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-312.pyc +0 -0
  739. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-313.pyc +0 -0
  740. quarchpy/connection_specific/__pycache__/connection_USB.cpython-311.pyc +0 -0
  741. quarchpy/connection_specific/__pycache__/connection_USB.cpython-312.pyc +0 -0
  742. quarchpy/connection_specific/__pycache__/connection_USB.cpython-313.pyc +0 -0
  743. quarchpy/connection_specific/__pycache__/mDNS.cpython-311.pyc +0 -0
  744. quarchpy/connection_specific/__pycache__/mDNS.cpython-312.pyc +0 -0
  745. quarchpy/connection_specific/__pycache__/mDNS.cpython-313.pyc +0 -0
  746. quarchpy/connection_specific/jdk_jres/__pycache__/__init__.cpython-313.pyc +0 -0
  747. quarchpy/connection_specific/jdk_jres/__pycache__/fix_permissions.cpython-313.pyc +0 -0
  748. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/java +0 -0
  749. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jfr +0 -0
  750. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jrunscript +0 -0
  751. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jwebserver +0 -0
  752. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/keytool +0 -0
  753. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/rmiregistry +0 -0
  754. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/jaxp-strict.properties.template +0 -123
  755. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/jaxp.properties +0 -200
  756. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/logging.properties +0 -63
  757. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/jmxremote.access +0 -79
  758. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/jmxremote.password.template +0 -115
  759. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/management.properties +0 -326
  760. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/net.properties +0 -162
  761. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/sdp/sdp.conf.template +0 -30
  762. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/java.security +0 -1517
  763. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/README.txt +0 -54
  764. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +0 -6
  765. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +0 -14
  766. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +0 -13
  767. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +0 -6
  768. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +0 -6
  769. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/sound.properties +0 -39
  770. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +0 -37
  771. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +0 -27
  772. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/LICENSE +0 -347
  773. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/aes.md +0 -36
  774. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/asm.md +0 -36
  775. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/c-libutl.md +0 -35
  776. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/cldr.md +0 -100
  777. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/icu.md +0 -93
  778. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/public_suffix.md +0 -399
  779. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/siphash.md +0 -150
  780. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/unicode.md +0 -269
  781. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +0 -37
  782. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +0 -27
  783. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/LICENSE +0 -347
  784. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +0 -37
  785. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +0 -27
  786. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/LICENSE +0 -347
  787. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +0 -37
  788. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +0 -27
  789. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/LICENSE +0 -347
  790. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/colorimaging.md +0 -7
  791. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/freetype.md +0 -649
  792. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/giflib.md +0 -46
  793. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +0 -103
  794. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/jpeg.md +0 -77
  795. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/lcms.md +0 -103
  796. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/libpng.md +0 -215
  797. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/mesa3d.md +0 -134
  798. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/pipewire.md +0 -41
  799. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/xwd.md +0 -34
  800. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +0 -37
  801. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +0 -27
  802. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/LICENSE +0 -347
  803. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +0 -37
  804. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +0 -27
  805. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/LICENSE +0 -347
  806. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +0 -37
  807. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +0 -27
  808. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/LICENSE +0 -347
  809. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  810. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +0 -27
  811. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/LICENSE +0 -347
  812. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +0 -37
  813. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +0 -27
  814. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/LICENSE +0 -347
  815. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +0 -37
  816. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +0 -27
  817. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/LICENSE +0 -347
  818. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +0 -37
  819. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +0 -27
  820. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/LICENSE +0 -347
  821. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  822. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +0 -27
  823. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/LICENSE +0 -347
  824. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +0 -37
  825. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +0 -27
  826. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/LICENSE +0 -347
  827. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +0 -37
  828. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +0 -27
  829. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/LICENSE +0 -347
  830. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +0 -37
  831. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +0 -27
  832. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/LICENSE +0 -347
  833. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +0 -37
  834. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +0 -27
  835. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/LICENSE +0 -347
  836. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +0 -37
  837. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +0 -27
  838. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/LICENSE +0 -347
  839. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/pcsclite.md +0 -57
  840. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +0 -37
  841. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +0 -27
  842. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/LICENSE +0 -347
  843. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +0 -37
  844. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +0 -27
  845. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +0 -347
  846. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +0 -37
  847. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +0 -27
  848. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +0 -347
  849. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +0 -37
  850. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +0 -27
  851. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/LICENSE +0 -347
  852. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/bcel.md +0 -219
  853. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/dom.md +0 -77
  854. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/jcup.md +0 -31
  855. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/schema10part1.md +0 -51
  856. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/schema10part2.md +0 -50
  857. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xalan.md +0 -255
  858. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xerces.md +0 -229
  859. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml10.md +0 -57
  860. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +0 -150
  861. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml11.md +0 -68
  862. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +0 -60
  863. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xmlspec.md +0 -63
  864. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xmlxsd.md +0 -43
  865. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +0 -37
  866. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +0 -27
  867. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +0 -347
  868. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +0 -227
  869. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +0 -37
  870. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +0 -27
  871. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +0 -347
  872. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +0 -37
  873. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +0 -27
  874. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/LICENSE +0 -347
  875. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +0 -37
  876. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +0 -27
  877. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +0 -347
  878. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +0 -76
  879. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +0 -46
  880. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +0 -37
  881. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +0 -27
  882. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +0 -347
  883. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +0 -37
  884. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +0 -27
  885. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +0 -347
  886. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +0 -32
  887. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +0 -37
  888. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +0 -27
  889. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +0 -347
  890. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +0 -37
  891. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +0 -27
  892. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +0 -347
  893. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/sleef.md +0 -439
  894. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +0 -37
  895. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +0 -27
  896. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +0 -347
  897. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +0 -37
  898. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +0 -27
  899. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +0 -347
  900. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +0 -37
  901. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +0 -27
  902. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/LICENSE +0 -347
  903. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +0 -37
  904. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +0 -27
  905. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +0 -347
  906. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +0 -37
  907. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +0 -27
  908. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/LICENSE +0 -347
  909. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/cldr.md +0 -100
  910. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +0 -31
  911. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +0 -37
  912. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +0 -27
  913. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/LICENSE +0 -347
  914. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +0 -37
  915. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +0 -27
  916. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +0 -347
  917. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +0 -37
  918. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +0 -27
  919. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +0 -347
  920. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +0 -37
  921. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +0 -27
  922. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +0 -347
  923. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  924. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +0 -27
  925. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +0 -347
  926. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +0 -37
  927. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +0 -27
  928. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/LICENSE +0 -347
  929. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +0 -37
  930. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +0 -27
  931. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +0 -347
  932. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +0 -37
  933. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +0 -27
  934. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/LICENSE +0 -347
  935. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +0 -37
  936. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +0 -27
  937. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +0 -347
  938. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +0 -37
  939. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +0 -27
  940. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +0 -347
  941. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +0 -37
  942. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +0 -27
  943. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +0 -347
  944. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +0 -37
  945. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +0 -27
  946. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +0 -347
  947. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +0 -37
  948. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +0 -27
  949. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +0 -347
  950. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +0 -37
  951. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +0 -27
  952. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +0 -347
  953. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/classlist +0 -1587
  954. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jexec +0 -0
  955. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jfr/default.jfc +0 -1152
  956. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jfr/profile.jfc +0 -1151
  957. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  958. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jspawnhelper +0 -0
  959. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jvm.cfg +0 -2
  960. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt.so +0 -0
  961. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt_headless.so +0 -0
  962. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt_xawt.so +0 -0
  963. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libdt_socket.so +0 -0
  964. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libextnet.so +0 -0
  965. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libfontmanager.so +0 -0
  966. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libfreetype.so +0 -0
  967. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libinstrument.so +0 -0
  968. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2gss.so +0 -0
  969. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2pcsc.so +0 -0
  970. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2pkcs11.so +0 -0
  971. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjaas.so +0 -0
  972. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjava.so +0 -0
  973. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavajpeg.so +0 -0
  974. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjawt.so +0 -0
  975. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjdwp.so +0 -0
  976. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjimage.so +0 -0
  977. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjli.so +0 -0
  978. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsig.so +0 -0
  979. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsound.so +0 -0
  980. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsvml.so +0 -0
  981. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/liblcms.so +0 -0
  982. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement.so +0 -0
  983. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement_agent.so +0 -0
  984. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement_ext.so +0 -0
  985. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmlib_image.so +0 -0
  986. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libnet.so +0 -0
  987. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libnio.so +0 -0
  988. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprefs.so +0 -0
  989. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/librmi.so +0 -0
  990. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsctp.so +0 -0
  991. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsimdsort.so +0 -0
  992. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsplashscreen.so +0 -0
  993. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsyslookup.so +0 -0
  994. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libverify.so +0 -0
  995. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libzip.so +0 -0
  996. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/modules +0 -0
  997. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/psfont.properties.ja +0 -119
  998. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/psfontj2d.properties +0 -323
  999. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/blocked.certs +0 -39
  1000. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/cacerts +0 -0
  1001. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/public_suffix_list.dat +0 -0
  1002. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/server/libjsig.so +0 -0
  1003. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/server/libjvm.so +0 -0
  1004. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/tzdb.dat +0 -0
  1005. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/release +0 -2
  1006. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/java +0 -0
  1007. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jfr +0 -0
  1008. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jrunscript +0 -0
  1009. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jwebserver +0 -0
  1010. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/keytool +0 -0
  1011. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/rmiregistry +0 -0
  1012. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/jaxp-strict.properties.template +0 -123
  1013. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/jaxp.properties +0 -200
  1014. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/logging.properties +0 -63
  1015. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/jmxremote.access +0 -79
  1016. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/jmxremote.password.template +0 -115
  1017. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/management.properties +0 -326
  1018. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/net.properties +0 -162
  1019. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/java.security +0 -1518
  1020. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/README.txt +0 -54
  1021. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +0 -6
  1022. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +0 -14
  1023. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +0 -13
  1024. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +0 -6
  1025. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +0 -6
  1026. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/sound.properties +0 -39
  1027. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +0 -37
  1028. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +0 -27
  1029. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/LICENSE +0 -347
  1030. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/aes.md +0 -36
  1031. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/asm.md +0 -36
  1032. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/c-libutl.md +0 -35
  1033. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/cldr.md +0 -100
  1034. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/icu.md +0 -93
  1035. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/public_suffix.md +0 -399
  1036. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/siphash.md +0 -150
  1037. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/unicode.md +0 -269
  1038. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +0 -37
  1039. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +0 -27
  1040. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/LICENSE +0 -347
  1041. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +0 -37
  1042. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +0 -27
  1043. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/LICENSE +0 -347
  1044. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +0 -37
  1045. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +0 -27
  1046. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/LICENSE +0 -347
  1047. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/colorimaging.md +0 -7
  1048. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/freetype.md +0 -649
  1049. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/giflib.md +0 -46
  1050. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +0 -103
  1051. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/jpeg.md +0 -77
  1052. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/lcms.md +0 -103
  1053. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/libpng.md +0 -215
  1054. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/mesa3d.md +0 -134
  1055. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/pipewire.md +0 -41
  1056. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/xwd.md +0 -34
  1057. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +0 -37
  1058. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +0 -27
  1059. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/LICENSE +0 -347
  1060. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +0 -37
  1061. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +0 -27
  1062. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/LICENSE +0 -347
  1063. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +0 -37
  1064. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +0 -27
  1065. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/LICENSE +0 -347
  1066. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  1067. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +0 -27
  1068. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/LICENSE +0 -347
  1069. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +0 -37
  1070. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +0 -27
  1071. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/LICENSE +0 -347
  1072. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +0 -37
  1073. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +0 -27
  1074. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/LICENSE +0 -347
  1075. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +0 -37
  1076. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +0 -27
  1077. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/LICENSE +0 -347
  1078. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  1079. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +0 -27
  1080. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/LICENSE +0 -347
  1081. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +0 -37
  1082. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +0 -27
  1083. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/LICENSE +0 -347
  1084. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +0 -37
  1085. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +0 -27
  1086. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/LICENSE +0 -347
  1087. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +0 -37
  1088. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +0 -27
  1089. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/LICENSE +0 -347
  1090. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +0 -37
  1091. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +0 -27
  1092. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/LICENSE +0 -347
  1093. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +0 -37
  1094. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +0 -27
  1095. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/LICENSE +0 -347
  1096. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/pcsclite.md +0 -57
  1097. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +0 -37
  1098. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +0 -27
  1099. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/LICENSE +0 -347
  1100. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +0 -37
  1101. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +0 -27
  1102. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +0 -347
  1103. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +0 -37
  1104. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +0 -27
  1105. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +0 -347
  1106. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +0 -37
  1107. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +0 -27
  1108. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/LICENSE +0 -347
  1109. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/bcel.md +0 -219
  1110. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/dom.md +0 -77
  1111. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/jcup.md +0 -31
  1112. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/schema10part1.md +0 -51
  1113. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/schema10part2.md +0 -50
  1114. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xalan.md +0 -255
  1115. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xerces.md +0 -229
  1116. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml10.md +0 -57
  1117. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +0 -150
  1118. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml11.md +0 -68
  1119. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +0 -60
  1120. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xmlspec.md +0 -63
  1121. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xmlxsd.md +0 -43
  1122. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +0 -37
  1123. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +0 -27
  1124. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +0 -347
  1125. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +0 -227
  1126. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +0 -37
  1127. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +0 -27
  1128. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +0 -347
  1129. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +0 -37
  1130. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +0 -27
  1131. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/LICENSE +0 -347
  1132. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +0 -37
  1133. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +0 -27
  1134. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +0 -347
  1135. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +0 -76
  1136. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +0 -46
  1137. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +0 -37
  1138. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +0 -27
  1139. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +0 -347
  1140. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +0 -37
  1141. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +0 -27
  1142. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +0 -347
  1143. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +0 -32
  1144. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +0 -37
  1145. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +0 -27
  1146. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +0 -347
  1147. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +0 -37
  1148. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +0 -27
  1149. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +0 -347
  1150. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +0 -37
  1151. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +0 -27
  1152. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +0 -347
  1153. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +0 -37
  1154. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +0 -27
  1155. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +0 -347
  1156. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +0 -37
  1157. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +0 -27
  1158. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/LICENSE +0 -347
  1159. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +0 -37
  1160. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +0 -27
  1161. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +0 -347
  1162. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +0 -37
  1163. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +0 -27
  1164. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/LICENSE +0 -347
  1165. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/cldr.md +0 -100
  1166. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +0 -31
  1167. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +0 -37
  1168. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +0 -27
  1169. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/LICENSE +0 -347
  1170. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +0 -37
  1171. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +0 -27
  1172. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +0 -347
  1173. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +0 -37
  1174. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +0 -27
  1175. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +0 -347
  1176. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +0 -37
  1177. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +0 -27
  1178. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +0 -347
  1179. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  1180. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +0 -27
  1181. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +0 -347
  1182. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +0 -37
  1183. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +0 -27
  1184. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/LICENSE +0 -347
  1185. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +0 -37
  1186. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +0 -27
  1187. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +0 -347
  1188. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +0 -37
  1189. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +0 -27
  1190. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/LICENSE +0 -347
  1191. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +0 -37
  1192. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +0 -27
  1193. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +0 -347
  1194. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +0 -37
  1195. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +0 -27
  1196. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +0 -347
  1197. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +0 -37
  1198. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +0 -27
  1199. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +0 -347
  1200. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +0 -37
  1201. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +0 -27
  1202. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +0 -347
  1203. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +0 -37
  1204. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +0 -27
  1205. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +0 -347
  1206. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +0 -37
  1207. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +0 -27
  1208. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +0 -347
  1209. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/classlist +0 -1589
  1210. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/fontconfig.bfc +0 -0
  1211. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/fontconfig.properties.src +0 -258
  1212. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jfr/default.jfc +0 -1152
  1213. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jfr/profile.jfc +0 -1151
  1214. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  1215. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jspawnhelper +0 -0
  1216. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jvm.cfg +0 -2
  1217. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libawt.dylib +0 -0
  1218. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libawt_lwawt.dylib +0 -0
  1219. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libdt_socket.dylib +0 -0
  1220. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libextnet.dylib +0 -0
  1221. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libfontmanager.dylib +0 -0
  1222. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libfreetype.dylib +0 -0
  1223. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libinstrument.dylib +0 -0
  1224. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2gss.dylib +0 -0
  1225. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2pcsc.dylib +0 -0
  1226. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2pkcs11.dylib +0 -0
  1227. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjaas.dylib +0 -0
  1228. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjava.dylib +0 -0
  1229. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavajpeg.dylib +0 -0
  1230. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjawt.dylib +0 -0
  1231. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjdwp.dylib +0 -0
  1232. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjimage.dylib +0 -0
  1233. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjli.dylib +0 -0
  1234. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjsig.dylib +0 -0
  1235. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjsound.dylib +0 -0
  1236. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/liblcms.dylib +0 -0
  1237. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement.dylib +0 -0
  1238. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement_agent.dylib +0 -0
  1239. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement_ext.dylib +0 -0
  1240. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmlib_image.dylib +0 -0
  1241. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libnet.dylib +0 -0
  1242. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libnio.dylib +0 -0
  1243. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosx.dylib +0 -0
  1244. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxapp.dylib +0 -0
  1245. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxkrb5.dylib +0 -0
  1246. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxsecurity.dylib +0 -0
  1247. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxui.dylib +0 -0
  1248. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprefs.dylib +0 -0
  1249. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/librmi.dylib +0 -0
  1250. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libsplashscreen.dylib +0 -0
  1251. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libsyslookup.dylib +0 -0
  1252. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libverify.dylib +0 -0
  1253. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libzip.dylib +0 -0
  1254. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/modules +0 -0
  1255. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/psfont.properties.ja +0 -119
  1256. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/psfontj2d.properties +0 -323
  1257. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/blocked.certs +0 -39
  1258. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/cacerts +0 -0
  1259. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/public_suffix_list.dat +0 -0
  1260. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/server/libjsig.dylib +0 -0
  1261. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/server/libjvm.dylib +0 -0
  1262. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/shaders.metallib +0 -0
  1263. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/tzdb.dat +0 -0
  1264. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/release +0 -2
  1265. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-console-l1-1-0.dll +0 -0
  1266. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-datetime-l1-1-0.dll +0 -0
  1267. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-debug-l1-1-0.dll +0 -0
  1268. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-errorhandling-l1-1-0.dll +0 -0
  1269. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l1-1-0.dll +0 -0
  1270. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l1-2-0.dll +0 -0
  1271. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l2-1-0.dll +0 -0
  1272. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-handle-l1-1-0.dll +0 -0
  1273. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-heap-l1-1-0.dll +0 -0
  1274. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-interlocked-l1-1-0.dll +0 -0
  1275. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-libraryloader-l1-1-0.dll +0 -0
  1276. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-localization-l1-2-0.dll +0 -0
  1277. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-memory-l1-1-0.dll +0 -0
  1278. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-namedpipe-l1-1-0.dll +0 -0
  1279. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processenvironment-l1-1-0.dll +0 -0
  1280. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processthreads-l1-1-0.dll +0 -0
  1281. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processthreads-l1-1-1.dll +0 -0
  1282. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-profile-l1-1-0.dll +0 -0
  1283. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-rtlsupport-l1-1-0.dll +0 -0
  1284. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-string-l1-1-0.dll +0 -0
  1285. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-synch-l1-1-0.dll +0 -0
  1286. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-synch-l1-2-0.dll +0 -0
  1287. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-sysinfo-l1-1-0.dll +0 -0
  1288. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-timezone-l1-1-0.dll +0 -0
  1289. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-util-l1-1-0.dll +0 -0
  1290. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-conio-l1-1-0.dll +0 -0
  1291. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-convert-l1-1-0.dll +0 -0
  1292. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-environment-l1-1-0.dll +0 -0
  1293. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-filesystem-l1-1-0.dll +0 -0
  1294. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-heap-l1-1-0.dll +0 -0
  1295. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-locale-l1-1-0.dll +0 -0
  1296. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-math-l1-1-0.dll +0 -0
  1297. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-multibyte-l1-1-0.dll +0 -0
  1298. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-private-l1-1-0.dll +0 -0
  1299. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-process-l1-1-0.dll +0 -0
  1300. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-runtime-l1-1-0.dll +0 -0
  1301. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-stdio-l1-1-0.dll +0 -0
  1302. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-string-l1-1-0.dll +0 -0
  1303. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-time-l1-1-0.dll +0 -0
  1304. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-utility-l1-1-0.dll +0 -0
  1305. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/awt.dll +0 -0
  1306. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/dt_socket.dll +0 -0
  1307. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/extnet.dll +0 -0
  1308. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/fontmanager.dll +0 -0
  1309. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/freetype.dll +0 -0
  1310. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/instrument.dll +0 -0
  1311. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2gss.dll +0 -0
  1312. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2pcsc.dll +0 -0
  1313. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2pkcs11.dll +0 -0
  1314. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaas.dll +0 -0
  1315. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jabswitch.exe +0 -0
  1316. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaccessinspector.exe +0 -0
  1317. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaccesswalker.exe +0 -0
  1318. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/java.dll +0 -0
  1319. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/java.exe +0 -0
  1320. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javaaccessbridge.dll +0 -0
  1321. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javajpeg.dll +0 -0
  1322. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javaw.exe +0 -0
  1323. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jawt.dll +0 -0
  1324. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jdwp.dll +0 -0
  1325. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jfr.exe +0 -0
  1326. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jimage.dll +0 -0
  1327. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jli.dll +0 -0
  1328. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jrunscript.exe +0 -0
  1329. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jsound.dll +0 -0
  1330. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jsvml.dll +0 -0
  1331. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jwebserver.exe +0 -0
  1332. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/keytool.exe +0 -0
  1333. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/kinit.exe +0 -0
  1334. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/klist.exe +0 -0
  1335. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/ktab.exe +0 -0
  1336. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/lcms.dll +0 -0
  1337. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management.dll +0 -0
  1338. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management_agent.dll +0 -0
  1339. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management_ext.dll +0 -0
  1340. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/mlib_image.dll +0 -0
  1341. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140.dll +0 -0
  1342. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/net.dll +0 -0
  1343. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/nio.dll +0 -0
  1344. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prefs.dll +0 -0
  1345. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/rmi.dll +0 -0
  1346. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/rmiregistry.exe +0 -0
  1347. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/server/jvm.dll +0 -0
  1348. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/splashscreen.dll +0 -0
  1349. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/sspi_bridge.dll +0 -0
  1350. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/syslookup.dll +0 -0
  1351. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/ucrtbase.dll +0 -0
  1352. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/vcruntime140.dll +0 -0
  1353. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/vcruntime140_1.dll +0 -0
  1354. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/verify.dll +0 -0
  1355. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/w2k_lsa_auth.dll +0 -0
  1356. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/windowsaccessbridge-64.dll +0 -0
  1357. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/zip.dll +0 -0
  1358. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/jaxp-strict.properties.template +0 -123
  1359. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/jaxp.properties +0 -200
  1360. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/logging.properties +0 -63
  1361. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/jmxremote.access +0 -79
  1362. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/jmxremote.password.template +0 -115
  1363. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/management.properties +0 -326
  1364. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/net.properties +0 -166
  1365. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/java.security +0 -1518
  1366. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/README.txt +0 -54
  1367. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +0 -6
  1368. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +0 -14
  1369. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +0 -13
  1370. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +0 -6
  1371. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +0 -6
  1372. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/sound.properties +0 -39
  1373. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +0 -37
  1374. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +0 -27
  1375. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/LICENSE +0 -347
  1376. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/aes.md +0 -36
  1377. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/asm.md +0 -36
  1378. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/c-libutl.md +0 -35
  1379. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/cldr.md +0 -100
  1380. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/icu.md +0 -93
  1381. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/public_suffix.md +0 -399
  1382. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/siphash.md +0 -150
  1383. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/unicode.md +0 -269
  1384. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/wepoll.md +0 -34
  1385. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/zlib.md +0 -27
  1386. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +0 -1
  1387. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +0 -1
  1388. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.compiler/LICENSE +0 -1
  1389. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +0 -1
  1390. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +0 -1
  1391. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.datatransfer/LICENSE +0 -1
  1392. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +0 -1
  1393. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +0 -1
  1394. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/LICENSE +0 -1
  1395. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/colorimaging.md +0 -7
  1396. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/freetype.md +0 -649
  1397. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/giflib.md +0 -46
  1398. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +0 -103
  1399. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/jpeg.md +0 -77
  1400. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/lcms.md +0 -103
  1401. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/libpng.md +0 -215
  1402. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/mesa3d.md +0 -134
  1403. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +0 -1
  1404. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +0 -1
  1405. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.instrument/LICENSE +0 -1
  1406. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +0 -1
  1407. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +0 -1
  1408. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.logging/LICENSE +0 -1
  1409. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +0 -1
  1410. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +0 -1
  1411. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management/LICENSE +0 -1
  1412. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +0 -1
  1413. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +0 -1
  1414. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management.rmi/LICENSE +0 -1
  1415. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +0 -1
  1416. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +0 -1
  1417. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.naming/LICENSE +0 -1
  1418. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +0 -1
  1419. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +0 -1
  1420. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.net.http/LICENSE +0 -1
  1421. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +0 -1
  1422. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +0 -1
  1423. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.prefs/LICENSE +0 -1
  1424. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +0 -1
  1425. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +0 -1
  1426. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.rmi/LICENSE +0 -1
  1427. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +0 -1
  1428. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +0 -1
  1429. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.scripting/LICENSE +0 -1
  1430. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +0 -1
  1431. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +0 -1
  1432. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.se/LICENSE +0 -1
  1433. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +0 -1
  1434. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +0 -1
  1435. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.jgss/LICENSE +0 -1
  1436. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +0 -1
  1437. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +0 -1
  1438. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.sasl/LICENSE +0 -1
  1439. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +0 -1
  1440. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +0 -1
  1441. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.smartcardio/LICENSE +0 -1
  1442. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +0 -1
  1443. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +0 -1
  1444. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql/LICENSE +0 -1
  1445. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +0 -1
  1446. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +0 -1
  1447. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +0 -1
  1448. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +0 -1
  1449. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +0 -1
  1450. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +0 -1
  1451. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +0 -1
  1452. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +0 -1
  1453. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/LICENSE +0 -1
  1454. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/bcel.md +0 -219
  1455. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/dom.md +0 -77
  1456. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/jcup.md +0 -31
  1457. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/schema10part1.md +0 -51
  1458. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/schema10part2.md +0 -50
  1459. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xalan.md +0 -255
  1460. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xerces.md +0 -229
  1461. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml10.md +0 -57
  1462. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +0 -150
  1463. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml11.md +0 -68
  1464. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +0 -60
  1465. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xmlspec.md +0 -63
  1466. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xmlxsd.md +0 -43
  1467. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +0 -1
  1468. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +0 -1
  1469. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +0 -1
  1470. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +0 -227
  1471. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +0 -1
  1472. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +0 -1
  1473. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +0 -1
  1474. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +0 -1
  1475. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +0 -1
  1476. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.charsets/LICENSE +0 -1
  1477. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +0 -1
  1478. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +0 -1
  1479. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +0 -1
  1480. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +0 -76
  1481. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +0 -46
  1482. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +0 -1
  1483. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +0 -1
  1484. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +0 -1
  1485. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +0 -1
  1486. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +0 -1
  1487. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +0 -1
  1488. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +0 -32
  1489. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +0 -1
  1490. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +0 -1
  1491. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +0 -1
  1492. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +0 -1
  1493. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +0 -1
  1494. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +0 -1
  1495. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +0 -1
  1496. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +0 -1
  1497. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +0 -1
  1498. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +0 -1
  1499. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +0 -1
  1500. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +0 -1
  1501. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +0 -1
  1502. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +0 -1
  1503. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jfr/LICENSE +0 -1
  1504. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +0 -1
  1505. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +0 -1
  1506. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +0 -1
  1507. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +0 -1
  1508. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +0 -1
  1509. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/LICENSE +0 -1
  1510. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/cldr.md +0 -1
  1511. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +0 -31
  1512. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +0 -1
  1513. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +0 -1
  1514. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management/LICENSE +0 -1
  1515. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +0 -1
  1516. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +0 -1
  1517. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +0 -1
  1518. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +0 -1
  1519. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +0 -1
  1520. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +0 -1
  1521. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +0 -1
  1522. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +0 -1
  1523. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +0 -1
  1524. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +0 -1
  1525. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +0 -1
  1526. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +0 -1
  1527. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +0 -1
  1528. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +0 -1
  1529. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.net/LICENSE +0 -1
  1530. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +0 -1
  1531. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +0 -1
  1532. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +0 -1
  1533. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +0 -1
  1534. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +0 -1
  1535. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.sctp/LICENSE +0 -1
  1536. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +0 -1
  1537. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +0 -1
  1538. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +0 -1
  1539. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +0 -1
  1540. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +0 -1
  1541. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +0 -1
  1542. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +0 -1
  1543. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +0 -1
  1544. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +0 -1
  1545. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +0 -1
  1546. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +0 -1
  1547. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +0 -1
  1548. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +0 -1
  1549. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +0 -1
  1550. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +0 -1
  1551. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +0 -1
  1552. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +0 -1
  1553. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +0 -1
  1554. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/classlist +0 -1601
  1555. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/fontconfig.bfc +0 -0
  1556. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/fontconfig.properties.src +0 -332
  1557. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jawt.lib +0 -0
  1558. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jfr/default.jfc +0 -1152
  1559. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jfr/profile.jfc +0 -1151
  1560. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  1561. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jvm.cfg +0 -2
  1562. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jvm.lib +0 -0
  1563. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/modules +0 -0
  1564. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/psfont.properties.ja +0 -119
  1565. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/psfontj2d.properties +0 -323
  1566. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/security/blocked.certs +0 -39
  1567. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/security/cacerts +0 -0
  1568. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/security/public_suffix_list.dat +0 -0
  1569. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/tzdb.dat +0 -0
  1570. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/tzmappings +0 -361
  1571. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/release +0 -2
  1572. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-311.pyc +0 -0
  1573. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-312.pyc +0 -0
  1574. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-313.pyc +0 -0
  1575. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-311.pyc +0 -0
  1576. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-312.pyc +0 -0
  1577. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-313.pyc +0 -0
  1578. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-311.pyc +0 -0
  1579. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-312.pyc +0 -0
  1580. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-313.pyc +0 -0
  1581. quarchpy/connection_specific/serial/__pycache__/win32.cpython-311.pyc +0 -0
  1582. quarchpy/connection_specific/serial/__pycache__/win32.cpython-312.pyc +0 -0
  1583. quarchpy/connection_specific/serial/__pycache__/win32.cpython-313.pyc +0 -0
  1584. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-311.pyc +0 -0
  1585. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  1586. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  1587. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-311.pyc +0 -0
  1588. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-312.pyc +0 -0
  1589. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-313.pyc +0 -0
  1590. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-311.pyc +0 -0
  1591. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-312.pyc +0 -0
  1592. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-313.pyc +0 -0
  1593. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-311.pyc +0 -0
  1594. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-312.pyc +0 -0
  1595. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-313.pyc +0 -0
  1596. quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-311.pyc +0 -0
  1597. quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-312.pyc +0 -0
  1598. quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-311.pyc +0 -0
  1599. quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-312.pyc +0 -0
  1600. quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
  1601. quarchpy/debug/__pycache__/SystemTest.cpython-312.pyc +0 -0
  1602. quarchpy/debug/__pycache__/SystemTest.cpython-313.pyc +0 -0
  1603. quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
  1604. quarchpy/debug/__pycache__/__init__.cpython-312.pyc +0 -0
  1605. quarchpy/debug/__pycache__/__init__.cpython-313.pyc +0 -0
  1606. quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
  1607. quarchpy/debug/__pycache__/module_debug.cpython-312.pyc +0 -0
  1608. quarchpy/debug/__pycache__/module_debug.cpython-313.pyc +0 -0
  1609. quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
  1610. quarchpy/debug/__pycache__/simple_terminal.cpython-312.pyc +0 -0
  1611. quarchpy/debug/__pycache__/simple_terminal.cpython-313.pyc +0 -0
  1612. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
  1613. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-312.pyc +0 -0
  1614. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-313.pyc +0 -0
  1615. quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
  1616. quarchpy/debug/__pycache__/versionCompare.cpython-312.pyc +0 -0
  1617. quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc +0 -0
  1618. quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
  1619. quarchpy/device/__pycache__/__init__.cpython-312.pyc +0 -0
  1620. quarchpy/device/__pycache__/__init__.cpython-313.pyc +0 -0
  1621. quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
  1622. quarchpy/device/__pycache__/device.cpython-312.pyc +0 -0
  1623. quarchpy/device/__pycache__/device.cpython-313.pyc +0 -0
  1624. quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
  1625. quarchpy/device/__pycache__/quarchArray.cpython-312.pyc +0 -0
  1626. quarchpy/device/__pycache__/quarchArray.cpython-313.pyc +0 -0
  1627. quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
  1628. quarchpy/device/__pycache__/quarchPPM.cpython-312.pyc +0 -0
  1629. quarchpy/device/__pycache__/quarchPPM.cpython-313.pyc +0 -0
  1630. quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
  1631. quarchpy/device/__pycache__/quarchQPS.cpython-312.pyc +0 -0
  1632. quarchpy/device/__pycache__/quarchQPS.cpython-313.pyc +0 -0
  1633. quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
  1634. quarchpy/device/__pycache__/scanDevices.cpython-312.pyc +0 -0
  1635. quarchpy/device/__pycache__/scanDevices.cpython-313.pyc +0 -0
  1636. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
  1637. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-312.pyc +0 -0
  1638. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-313.pyc +0 -0
  1639. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
  1640. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-312.pyc +0 -0
  1641. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-313.pyc +0 -0
  1642. quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
  1643. quarchpy/disk_test/__pycache__/__init__.cpython-312.pyc +0 -0
  1644. quarchpy/disk_test/__pycache__/__init__.cpython-313.pyc +0 -0
  1645. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
  1646. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-312.pyc +0 -0
  1647. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-313.pyc +0 -0
  1648. quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
  1649. quarchpy/fio/__pycache__/FIO_interface.cpython-312.pyc +0 -0
  1650. quarchpy/fio/__pycache__/FIO_interface.cpython-313.pyc +0 -0
  1651. quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
  1652. quarchpy/fio/__pycache__/__init__.cpython-312.pyc +0 -0
  1653. quarchpy/fio/__pycache__/__init__.cpython-313.pyc +0 -0
  1654. quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
  1655. quarchpy/iometer/__pycache__/__init__.cpython-312.pyc +0 -0
  1656. quarchpy/iometer/__pycache__/__init__.cpython-313.pyc +0 -0
  1657. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
  1658. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-313.pyc +0 -0
  1659. quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
  1660. quarchpy/iometer/__pycache__/iometerFuncs.cpython-312.pyc +0 -0
  1661. quarchpy/iometer/__pycache__/iometerFuncs.cpython-313.pyc +0 -0
  1662. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
  1663. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-312.pyc +0 -0
  1664. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-313.pyc +0 -0
  1665. quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
  1666. quarchpy/qis/__pycache__/__init__.cpython-312.pyc +0 -0
  1667. quarchpy/qis/__pycache__/__init__.cpython-313.pyc +0 -0
  1668. quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
  1669. quarchpy/qis/__pycache__/qisFuncs.cpython-312.pyc +0 -0
  1670. quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc +0 -0
  1671. quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
  1672. quarchpy/qps/__pycache__/__init__.cpython-312.pyc +0 -0
  1673. quarchpy/qps/__pycache__/__init__.cpython-313.pyc +0 -0
  1674. quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
  1675. quarchpy/qps/__pycache__/qpsFuncs.cpython-312.pyc +0 -0
  1676. quarchpy/qps/__pycache__/qpsFuncs.cpython-313.pyc +0 -0
  1677. quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
  1678. quarchpy/user_interface/__pycache__/__init__.cpython-312.pyc +0 -0
  1679. quarchpy/user_interface/__pycache__/__init__.cpython-313.pyc +0 -0
  1680. quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
  1681. quarchpy/user_interface/__pycache__/user_interface.cpython-312.pyc +0 -0
  1682. quarchpy/user_interface/__pycache__/user_interface.cpython-313.pyc +0 -0
  1683. quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
  1684. quarchpy/utilities/__pycache__/TestCenter.cpython-312.pyc +0 -0
  1685. quarchpy/utilities/__pycache__/TestCenter.cpython-313.pyc +0 -0
  1686. quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
  1687. quarchpy/utilities/__pycache__/TimeValue.cpython-312.pyc +0 -0
  1688. quarchpy/utilities/__pycache__/TimeValue.cpython-313.pyc +0 -0
  1689. quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
  1690. quarchpy/utilities/__pycache__/Version.cpython-312.pyc +0 -0
  1691. quarchpy/utilities/__pycache__/Version.cpython-313.pyc +0 -0
  1692. quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
  1693. quarchpy/utilities/__pycache__/__init__.cpython-312.pyc +0 -0
  1694. quarchpy/utilities/__pycache__/__init__.cpython-313.pyc +0 -0
  1695. quarchpy-2.2.12.dev1.dist-info/RECORD +0 -1743
  1696. {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dist-info}/top_level.txt +0 -0
@@ -1,15 +1,15 @@
1
- import socket
2
- import re
3
1
  import gzip
4
- import datetime
5
- import select
2
+ import re
3
+ import socket
6
4
  import threading
7
- import struct
8
- from io import StringIO
9
- from quarchpy.user_interface import *
10
5
  import xml.etree.ElementTree as ET
6
+ from io import StringIO
7
+
8
+ import select
11
9
  from connection_specific.StreamChannels import StreamGroups
12
10
 
11
+ from quarchpy.user_interface import *
12
+
13
13
 
14
14
  # QisInterface provides a way of connecting to a Quarch backend running at the specified ip address and port, defaults to localhost and 9722
15
15
  class QisInterface:
@@ -25,7 +25,7 @@ class QisInterface:
25
25
  self.deviceList = []
26
26
  self.deviceDict = {}
27
27
  self.dictSemaphore = threading.Semaphore()
28
- self.connect(connectionMessage = connectionMessage)
28
+ self.connect(connection_message = connectionMessage)
29
29
  self.stripesEvent = threading.Event()
30
30
 
31
31
  self.qps_stream_header = None
@@ -44,47 +44,70 @@ class QisInterface:
44
44
  self.pythonVersion = sys.version[0]
45
45
  self.cursor = '>'
46
46
  #clear packets
47
- welcomeString = self.streamSock.recv(self.maxRxBytes).rstrip()
47
+ welcome_string = self.streamSock.recv(self.maxRxBytes).rstrip()
48
48
 
49
49
 
50
- def connect(self, connectionMessage = True):
51
- '''
52
- Connect() tries to open a socket on the host and port specified in the objects variables
53
- If successful it returns the backends welcome string. If it fails it returns a string saying unable to connect
54
- The backend should be running and host and port set before running this function. Normally it should be called at the beggining
55
- of talking to the backend and left open until finished talking when the disconnect() function should be ran
50
+ def connect(self, connection_message: bool = True) -> str:
51
+ """
52
+ Opens the connection to the QIS backend
53
+
54
+ Args:
55
+ connection_message:
56
+ Defaults to True. If set to False, suppresses the warning message about an
57
+ instance already running on the specified port. This can be useful when
58
+ using `isQisRunning()` from `qisFuncs`.
59
+
60
+ Raises:
61
+ Exception:
62
+ If the connection fails or the welcome string is not received an exception is raised
63
+
64
+ Returns:
65
+ The welcome string received from the backend server upon a successful
66
+ connection. This will confirm the QIS version but is generally not used other than
67
+ for debugging
68
+ """
56
69
 
57
- Param:
58
- connectionMessage: boolean, optional
59
- Set to False if you don't want a warning message to appear when an instance is already running on that port. Useful when using isQisRunning() from qisFuncs
60
- '''
61
70
  try:
62
- self.deviceDictSetup('QIS')
71
+ self.device_dict_setup('QIS')
63
72
  self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
64
73
  self.sock.settimeout(5)
65
74
  self.sock.connect((self.host, self.port))
66
75
 
67
76
  #clear packets
68
77
  try:
69
- welcomeString = self.sock.recv(self.maxRxBytes).rstrip()
70
- welcomeString = 'Connected@' + str(self.host) + ':' + str(self.port) + ' ' + '\n ' + str(welcomeString)
71
- self.deviceDict['QIS'][0:3] = [False, 'Connected', welcomeString]
72
- return welcomeString
78
+ welcome_string = self.sock.recv(self.maxRxBytes).rstrip()
79
+ welcome_string = 'Connected@' + str(self.host) + ':' + str(self.port) + ' ' + '\n ' + str(welcome_string)
80
+ self.deviceDict['QIS'][0:3] = [False, 'Connected', welcome_string]
81
+ return welcome_string
73
82
  except Exception as e:
74
83
  logging.error('No welcome received. Unable to connect to Quarch backend on specified host and port (' + self.host + ':' + str(self.port) + ')')
75
84
  logging.error('Is backend running and host accessible?')
76
85
  self.deviceDict['QIS'][0:3] = [True, 'Disconnected', 'Unable to connect to QIS']
77
86
  raise e
78
87
  except Exception as e:
79
- self.deviceDictSetup('QIS')
80
- if connectionMessage:
88
+ self.device_dict_setup('QIS')
89
+ if connection_message:
81
90
  logging.error('Unable to connect to Quarch backend on specified host and port (' + self.host + ':' + str(self.port) + ').')
82
91
  logging.error('Is backend running and host accessible?')
83
92
  self.deviceDict['QIS'][0:3] = [True, 'Disconnected', 'Unable to connect to QIS']
84
93
  raise e
85
94
 
86
- # Tries to close the socket to specified host and port.
87
- def disconnect(self):
95
+
96
+ def disconnect(self) -> str:
97
+ """
98
+ Disconnects the current connection to the QIS backend.
99
+
100
+ This method attempts to gracefully disconnect from the backend server and updates
101
+ the connection state in the device dictionary. If an error occurs during the
102
+ disconnection process, the state is updated to indicate the failure, and the
103
+ exception is re-raised
104
+
105
+ Returns:
106
+ str: A message indicating that the disconnection process has started.
107
+
108
+ Raises:
109
+ Exception: Propagates any exception that occurs during the disconnection process.
110
+ """
88
111
  res = 'Disconnecting from backend'
89
112
  try:
90
113
  self.sock.shutdown(socket.SHUT_RDWR)
@@ -98,368 +121,383 @@ class QisInterface:
98
121
  raise e
99
122
  return res
100
123
 
101
- def closeConnection(self, sock=None, conString=None):
124
+ def close_connection(self, sock=None, con_string: str=None) -> str:
125
+ """
126
+ Orders QIS to release a given device (or all devices if no connection string is specified)
127
+ This is more important for TCP connected devices as the socket is held open until
128
+ specifically released.
129
+
130
+ Args:
131
+ sock:
132
+ The socket object to close the connection to. Defaults to the existing socket.
133
+ con_string:
134
+ Specify the device ID to close, otherwise all devices will be closed
135
+
136
+ Raises:
137
+ ConnectionResetError: Raised if the socket connection has already been reset.
138
+
139
+ Returns:
140
+ The response received after sending the close command. On success, this will be: 'OK'
141
+
142
+ """
102
143
  if sock is None:
103
144
  sock = self.sock
104
- if conString is None:
145
+ if con_string is None:
105
146
  cmd = "close"
106
147
  else:
107
- cmd = conString + " close"
148
+ cmd = con_string + " close"
108
149
  try:
109
150
  response = self.sendAndReceiveText(sock, cmd)
110
151
  return response
111
152
  except ConnectionResetError:
112
- logging.warning('Unable to close connection to QIS, QIS may be already closed')
113
- return None
153
+ logging.error('Unable to close connection to device(s), QIS may be already closed')
154
+ return "FAIL: Unable to close connection to device(s), QIS may be already closed"
114
155
 
115
- def startStream(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration=None, inMemoryData=None, outputFileHandle=None, useGzip=None):
156
+ def start_stream(self, module: str, file_name: str, max_file_size: int, release_on_data: bool, separator: str, stream_duration: float=None, in_memory_data: StringIO=None, output_file_handle=None, use_gzip: bool=None):
157
+ """
158
+ Begins a stream process which will record data from the module to a CSV file or in memory CSV equivalent
159
+
160
+ Args:
161
+ module:
162
+ The ID of the module for which the stream is being initiated.
163
+ file_name:
164
+ The target file path+name for storing the streamed data in CSV form.
165
+ max_file_size:
166
+ The maximum size in megabytes allowed for the output file.
167
+ release_on_data:
168
+ If set, blocks further streams until this one has started
169
+ separator:
170
+ The value separator used to format the streamed CSV data.
171
+ stream_duration:
172
+ The duration (in seconds) for which the streaming process should run. Unlimited if None.
173
+ in_memory_data:
174
+ An in memory CSV StringIO as an alternate to file output
175
+ output_file_handle:
176
+ A file handle to an output file where the stream data is written as an alternate to a file name
177
+ use_gzip:
178
+ A flag indicating whether the output file should be compressed using gzip to reduce disk use
179
+
180
+ Returns:
181
+ None
182
+ """
116
183
  self.StreamRunSentSemaphore.acquire()
117
- self.deviceDictSetup('QIS')
118
- i = self.deviceMulti(module)
184
+ self.device_dict_setup('QIS')
185
+ i = self.device_control_index(module)
119
186
  self.stopFlagList[i] = True
120
187
  self.stripesEvent.set()
121
188
  self.module_xml_header = None
122
189
 
123
- # Create the thread
124
- t1 = threading.Thread(target=self.startStreamThread, name=module,
125
- args=(module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration, inMemoryData, outputFileHandle, useGzip))
190
+ # Create the worker thread to handle stream processing
191
+ t1 = threading.Thread(target=self.start_stream_thread, name=module,
192
+ args=(module, file_name, max_file_size, release_on_data, separator, stream_duration, in_memory_data, output_file_handle, use_gzip))
126
193
  # Start the thread
127
194
  t1.start()
128
195
 
129
- # count = 0
130
- while (self.stripesEvent.is_set()):
131
- # count += 1 --debugging to show delay
196
+ while self.stripesEvent.is_set():
132
197
  pass
133
- # just wait until event is cleared
134
198
 
135
- def startStreamQPS(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator):
136
- self.StreamRunSentSemaphore.acquire()
137
- self.deviceDictSetup('QIS')
138
- i = self.deviceMulti(module)
139
- self.stopFlagList[i] = True
140
- self.stripesEvent.set()
141
- self.module_xml_header = None
199
+ def stop_stream(self, module, blocking:bool = True):
200
+ """
142
201
 
143
- # Create the thread
144
- t1 = threading.Thread(target=self.startStreamThreadQPS, name=module,
145
- args=(module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator))
146
- # Start the thread
147
- t1.start()
202
+ Args:
203
+ module:
204
+ The quarchPPM module instance for which the streaming process is to be stopped.
205
+ blocking:
206
+ If set to True, the function will block and wait until the module has
207
+ completely stopped streaming. Defaults to True.
148
208
 
149
- # count = 0
150
- while (self.stripesEvent.is_set()):
151
- # count += 1 --debugging to show delay
152
- pass
153
- # just wait until event is cleared
209
+ Returns:
210
+ None
154
211
 
155
- def stopStream(self, module, blocking = True):
156
- moduleName=module.ConString
157
- i = self.deviceMulti(moduleName)
212
+ """
213
+
214
+ module_name=module.ConString
215
+ i = self.device_control_index(module_name)
158
216
  self.stopFlagList[i] = False
159
- # Wait until the stream thread is finished before returning to user.
217
+
218
+ # Wait until the stream thread is finished before returning to the user.
160
219
  # This means this function will block until the QIS buffer is emptied by the second while
161
- # loop in startStreanThread. This may take some time, especially at low averaging but
162
- # should gurantee the data won't be lost and QIS buffer is emptied.
220
+ # loop in startStreamThread. This may take some time, especially at low averaging,
221
+ # but should guarantee the data won't be lost and QIS buffer is emptied.
163
222
  if blocking:
164
223
  running = True
165
224
  while running:
166
- threadNameList = []
225
+ thread_name_list = []
167
226
  for t1 in threading.enumerate():
168
- threadNameList.append(t1.name)
169
- moduleStreaming= module.sendCommand("rec stream?").lower() #checking if module thinks its streaming.
170
- moduleStreaming2= module.sendCommand("stream?").lower() #checking if the module has told qis it has stopped streaming.
227
+ thread_name_list.append(t1.name)
228
+ module_streaming= module.sendCommand("rec stream?").lower() #checking if module thinks its streaming.
229
+ module_streaming2= module.sendCommand("stream?").lower() #checking if the module has told qis it has stopped streaming.
171
230
 
172
- if (moduleName in threadNameList or "running" in moduleStreaming or "running" in moduleStreaming2):
231
+ if module_name in thread_name_list or "running" in module_streaming or "running" in module_streaming2:
173
232
  time.sleep(0.1)
174
-
175
233
  else:
176
234
  running = False
177
- time.sleep(0.1)
178
235
 
179
- def startStreamThread(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator,
180
- streamDuration=None, inMemoryData=None, output_file_handle=None, use_gzip=False):
181
- # This is the function that is run when t1 is created. It is run in a seperate thread from
182
- # the main application so streaming can happen without blocking the main application from
183
- # doing other things. Within this function/thread you have to be very careful not to try
184
- # and 'communicate' with anything from other threads. If you do, you MUST use a thread safe
185
- # way of communicating. The thread creates it's own socket and should use that, NOT the objects socket
186
- # (which some of the comms with module functions will use by default).
236
+ def start_stream_thread(self, module: str, file_name: str, max_file_size: float, release_on_data: bool, separator: str,
237
+ stream_duration: int=None, in_memory_data=None, output_file_handle=None, use_gzip: bool=False):
238
+ """
239
+
240
+ Args:
241
+ module:
242
+ The name of the module from which data is to be streamed.
243
+ file_name:
244
+ The path to the file where streamed data will be written. Mandatory if neither an in-memory
245
+ buffer (in_memory_data) nor an external file handle (output_file_handle) is provided.
246
+ max_file_size:
247
+ The maximum permissible file size in MB. After reaching this limit, streaming to the current
248
+ file will stop
249
+ release_on_data:
250
+ True to prevent the stream lock from releasing until data has been received
251
+ separator:
252
+ Custom separator used to CSV data
253
+ stream_duration:
254
+ Duration of streaming in seconds, relative to the sampling period. Defaults to streaming
255
+ indefinitely.
256
+ in_memory_data:
257
+ An in-memory buffer of type StringIO to hold streamed data. If set, data is written here
258
+ instead of a file.
259
+ output_file_handle:
260
+ A pre-opened file handle where data will be written. If set, file_name is ignored.
261
+ use_gzip:
262
+ If True, writes streamed data to a gzip-compressed file.
263
+
264
+ Raises:
265
+ TypeError
266
+ If in_memory_data is passed but is not of type StringIO.
267
+ ValueError
268
+ If file_name is not provided and neither in_memory_data nor output_file_handle is given.
269
+ Also raised for invalid or undecodable sampling periods.
270
+
271
+ Returns:
272
+ None
273
+ """
187
274
 
188
275
  f = None
276
+ max_mb_val = 0
189
277
  file_opened_by_function = False # True if this function opens the file
190
278
  is_in_memory_stream = False # True if using inMemoryData (StringIO)
191
279
 
192
- # Priority: 1. output_file_handle, 2. inMemoryData, 3. open new file
280
+ # Output priority: 1. output_file_handle, 2. inMemoryData, 3. A new a file
193
281
  if output_file_handle is not None:
194
282
  f = output_file_handle
195
283
  # Caller is responsible for the handle's mode (e.g., text/binary) and type.
196
- elif inMemoryData is not None:
197
- if not isinstance(inMemoryData, StringIO):
284
+ elif in_memory_data is not None:
285
+ if not isinstance(in_memory_data, StringIO):
198
286
  raise TypeError("Error! The parameter 'inMemoryData' must be of type StringIO.")
199
- f = inMemoryData
287
+ f = in_memory_data
200
288
  is_in_memory_stream = True
201
289
  else:
202
290
  # No external handle or in-memory buffer, so open a file.
203
- if not fileName: # fileName is mandatory if we are to open a file.
204
- raise ValueError("fileName must be provided if output_file_handle and inMemoryData are None.")
291
+ if not file_name: # fileName is mandatory if we are to open a file.
292
+ raise ValueError("fie_name must be provided if output_file_handle and in_memory_data are None.")
205
293
  file_opened_by_function = True
206
294
  if use_gzip:
207
295
  # Open in text mode ('wt'). Encoding 'utf-8' is a good default.
208
296
  # gzip.open in text mode handles newline conversions.
209
- f = gzip.open(fileName, 'wt', encoding='utf-8')
297
+ f = gzip.open(file_name, 'wt', encoding='utf-8')
210
298
  else:
211
299
  # Open in text mode ('w').
212
300
  # newline='' ensures that '\n' is written as '\n' on all platforms.
213
- f = open(fileName, 'w', encoding='utf-8', newline='')
214
-
215
- # This variable was declared but seemed unused before its first assignment.
216
- stripes = ['Empty Header']
301
+ f = open(file_name, 'w', encoding='utf-8', newline='')
217
302
 
218
- # Send stream command so module starts streaming data into the backends buffer
219
- streamRes = self.sendAndReceiveCmd(self.streamSock, 'rec stream', device=module, betweenCommandDelay=0)
220
- # printText(streamRes) # Assuming printText is a custom logging/debug function
221
- if 'rec stream : OK' in streamRes:
222
- if releaseOnData is False:
303
+ # Check for a valid max file size limit
304
+ if max_file_size is not None:
305
+ try:
306
+ max_mb_val = int(max_file_size)
307
+ except (ValueError, TypeError):
308
+ logging.warning(f"Invalid max_file_size parameter: {max_file_size}. No limit will be applied")
309
+ max_file_size = None
310
+
311
+ # Send stream command so the module starts streaming data into the backends buffer
312
+ stream_res = self.send_command('rec stream', device=module, qis_socket=self.streamSock)
313
+ # Check the stream started
314
+ if 'OK' in stream_res:
315
+ if not release_on_data:
223
316
  self.StreamRunSentSemaphore.release()
224
317
  self.stripesEvent.clear()
225
318
  self.deviceDict[module][0:3] = [False, 'Running', 'Stream Running']
226
319
  else:
227
320
  self.StreamRunSentSemaphore.release()
228
321
  self.stripesEvent.clear()
229
- self.deviceDict[module][0:3] = [True, 'Stopped', module + " couldn't start because " + streamRes]
322
+ self.deviceDict[module][0:3] = [True, 'Stopped', module + " couldn't start because " + stream_res]
230
323
  if file_opened_by_function and f:
231
324
  try:
232
325
  f.close()
233
326
  except Exception as e_close:
234
- logging.error(f"Error closing file {fileName} on stream start failure: {e_close}")
327
+ logging.error(f"Error closing file {file_name} on stream start failure: {e_close}")
235
328
  return
236
329
 
237
- baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
330
+ # Poll for the stream header to become available. This is needed to configure the output file
331
+ base_sample_period = self.stream_header_average(device=module, sock=self.streamSock)
238
332
  count = 0
239
- maxTries = 10
240
- while 'Header Not Available' in baseSamplePeriod:
241
- baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
333
+ max_tries = 10
334
+ while 'Header Not Available' in base_sample_period:
335
+ base_sample_period = self.stream_header_average(device=module, sock=self.streamSock)
242
336
  time.sleep(0.1)
243
337
  count += 1
244
- if count > maxTries:
338
+ if count > max_tries:
245
339
  self.deviceDict[module][0:3] = [True, 'Stopped', 'Header not available']
246
340
  if file_opened_by_function and f:
247
341
  try:
248
342
  f.close()
249
343
  except Exception as e_close:
250
- logging.error(f"Error closing file {fileName} on header failure: {e_close}")
344
+ logging.error(f"Error closing file {file_name} on header failure: {e_close}")
251
345
  return # Changed from exit() for cleaner thread termination
252
346
 
253
- version = self.streamHeaderVersion(device=module, sock=self.streamSock) # version seems unused
254
- timeStampHeader = datetime.datetime.now().strftime("%H:%M:%S:%f %d/%m/%y") # timeStampHeader seems unused
255
- formatHeader = self.streamHeaderFormat(device=module, sock=self.streamSock)
256
- formatHeader = formatHeader.replace(", ", separator)
257
- f.write(formatHeader + '\n')
347
+ # Format the header and write it to the output file
348
+ format_header = self.stream_header_format(device=module, sock=self.streamSock)
349
+ format_header = format_header.replace(", ", separator)
350
+ f.write(format_header + '\n')
258
351
 
259
- numStripesPerRead = 4096
260
- maxFileExceeded = False
261
- openAttempts = 0 # Used in except IOError block
352
+ # Initialize stream variables
353
+ max_file_exceeded = False
354
+ open_attempts = 0
262
355
  leftover = 0
263
- remainingStripes = []
264
- streamOverrun = False
265
- streamComplete = False
266
-
267
- if 'ns' in baseSamplePeriod.lower():
268
- baseSampleUnitText = 'ns'
269
- baseSampleUnitExponent = -9
270
- elif 'us' in baseSamplePeriod.lower():
271
- baseSampleUnitText = 'us'
272
- baseSampleUnitExponent = -6
273
- elif 'ms' in baseSamplePeriod.lower():
274
- baseSampleUnitText = 'ms'
275
- baseSampleUnitExponent = -3
276
- elif 'S' in baseSamplePeriod.lower(): # Original was 'S', assuming it means 's'
277
- baseSampleUnitText = 's'
278
- baseSampleUnitExponent = 0
356
+ remaining_stripes = []
357
+ stream_overrun = False
358
+ stream_complete = False
359
+ stream_status_str = ""
360
+
361
+ # Calculate and verify stripe rate information
362
+ if 'ns' in base_sample_period.lower():
363
+ base_sample_unit_exponent = -9
364
+ elif 'us' in base_sample_period.lower():
365
+ base_sample_unit_exponent = -6
366
+ elif 'ms' in base_sample_period.lower():
367
+ base_sample_unit_exponent = -3
368
+ elif 'S' in base_sample_period.lower(): # Original was 'S', assuming it means 's'
369
+ base_sample_unit_exponent = 0
279
370
  else:
280
371
  # Clean up and raise error if baseSamplePeriod is undecodable
281
372
  if file_opened_by_function and f:
282
373
  try:
283
374
  f.close()
284
375
  except Exception as e_close:
285
- logging.error(f"Error closing file {fileName} due to ValueError: {e_close}")
286
- raise ValueError(f"couldn't decode samplePeriod: {baseSamplePeriod}")
376
+ logging.error(f"Error closing file {file_name} due to ValueError: {e_close}")
377
+ raise ValueError(f"couldn't decode samplePeriod: {base_sample_period}")
287
378
 
288
- baseSamplePeriodS = int(re.search(r'^\d*\.?\d*', baseSamplePeriod).group()) * (10 ** baseSampleUnitExponent)
379
+ base_sample_period_period_s = int(re.search(r'^\d*\.?\d*', base_sample_period).group()) * (10 ** base_sample_unit_exponent)
289
380
 
290
- # The following re-opening of the file is removed as f is already open in 'w' or 'wt' mode
291
- # and subsequent writes will append.
292
- # if inMemoryData is None:
293
- # f = open(fileName, 'a', newline='')
294
-
295
- isRun = True
296
- while isRun:
381
+ # Now we loop to process the stripes of data as they are available
382
+ is_run = True
383
+ while is_run:
297
384
  try:
298
- i = self.deviceMulti(module)
299
- while self.stopFlagList[i] and (not streamOverrun) and (not streamComplete):
300
- streamOverrun, removeChar, newStripes = self.streamGetStripesText(self.streamSock, module, numStripesPerRead)
301
- newStripes = newStripes.replace(' ', separator) # Replace spaces globally first
302
- if streamOverrun:
385
+ # Check for exit flags. These can be from user request (stopFlagList) or from the stream
386
+ # process ending
387
+ i = self.device_control_index(module)
388
+ while self.stopFlagList[i] and (not stream_overrun) and (not stream_complete):
389
+
390
+ # Read a block of stripes from QIS
391
+ stream_status_str, new_stripes = self.stream_get_stripes_text(self.streamSock, module)
392
+
393
+ # Overrun is a termination event where the stream stopped earlier than desired and must
394
+ # be flagged to the user
395
+ if "overrun" in stream_status_str:
396
+ stream_overrun = True
303
397
  self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun']
398
+ if "eof" in stream_status_str:
399
+ stream_complete = True
304
400
 
305
- isEmpty = (removeChar == -6 and len(newStripes) == 6)
306
-
307
- if not isEmpty:
308
- current_file_mb = 0.0
309
- if is_in_memory_stream:
310
- current_file_mb = f.tell() / 1048576.0
311
- elif fileName: # For file-based output (opened here or external handle with known fileName)
312
- try:
313
- # os.stat reflects the size on disk. For buffered writes (incl. gzip),
314
- # this might not be the exact current unwritten buffer size + disk size
315
- # without a flush, but it's what the original code relied on.
316
- statInfo = os.stat(fileName)
317
- current_file_mb = statInfo.st_size / 1048576.0
318
- except FileNotFoundError:
319
- current_file_mb = 0.0 # File might not exist yet or fileName is not locatable
320
- except Exception as e_stat:
321
- logging.warning(f"Could not get file size for {fileName}: {e_stat}")
322
- current_file_mb = 0.0 # Default to small size on error
323
- else:
324
- # output_file_handle was given, but fileName was None. Cannot check disk size.
325
- # Assume it's okay or managed by caller. fileMaxMB check effectively bypassed.
326
- current_file_mb = 0.0
401
+ # Continue here if there are stripes to process
402
+ if len(new_stripes) > 0:
403
+ # switch in the correct value seperator
404
+ new_stripes = new_stripes.replace(' ', separator)
327
405
 
328
- try:
329
- # Ensure fileMaxMB can be converted to int. If not, skip file size check for this iteration.
330
- max_mb_val = int(fileMaxMB)
331
- except (ValueError, TypeError):
332
- logging.warning(f"Invalid fileMaxMB value: {fileMaxMB}. Skipping size check for this iteration.")
333
- max_mb_val = float('inf') # Effectively disable check if invalid
334
-
335
- if current_file_mb < max_mb_val:
336
- if releaseOnData: # Note: Original was `releaseOnData == True`
337
- self.StreamRunSentSemaphore.release()
338
- self.stripesEvent.clear()
339
- releaseOnData = False # Prevent re-releasing
340
- if streamAverage is not None:
341
- # Assuming self.averageStripes handles writing to f
342
- leftover, remainingStripes = self.averageStripes(leftover, stripesPerAverage,
343
- newStripes[:removeChar], f,
344
- remainingStripes)
406
+ # Track the total size of the file here if needed
407
+ if max_file_size is not None:
408
+ current_file_mb = 0.0
409
+ if is_in_memory_stream:
410
+ current_file_mb = f.tell() / 1048576.0
411
+ elif file_name:
412
+ try:
413
+ # os.stat reflects the size on disk. For buffered writes (incl. gzip),
414
+ # this might not be the exact current unwritten buffer size + disk size
415
+ # without a flush, but it's an decent estimate.
416
+ stat_info = os.stat(file_name)
417
+ current_file_mb = stat_info.st_size / 1048576.0
418
+ except FileNotFoundError:
419
+ current_file_mb = 0.0 # File might not exist yet or fileName is not locatable
420
+ except Exception as e_stat:
421
+ logging.warning(f"Could not get file size for {file_name}: {e_stat}")
422
+ current_file_mb = 0.0 # Default to small size on error
345
423
  else:
346
- if streamDuration is not None:
347
- lastLine = newStripes.splitlines()[-3] # the last data line is followed by 'eof' and '>'
348
- lastTime = lastLine.split(separator)[0]
349
-
350
- if int(lastTime) < int(streamDuration / (10 ** baseSampleUnitExponent)):
351
- # newStripes was already globally space-replaced.
352
- f.write(newStripes[:removeChar])
424
+ # output_file_handle was given, but fileName was None. Cannot check disk size.
425
+ # Assume it's okay or managed by the caller. fileMaxMB check effectively bypassed.
426
+ current_file_mb = 0.0
427
+
428
+ # Flag the limit has been exceeded
429
+ if current_file_mb > max_mb_val:
430
+ max_file_exceeded = True
431
+ max_file_status = self.stream_buffer_status(device=module, sock=self.streamSock)
432
+ f.write('Warning: Max file size exceeded before end of stream.\n')
433
+ f.write('Unrecorded stripes in buffer when file full: ' + max_file_status + '.\n')
434
+ self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
435
+ break # Exit stream processing loop
436
+
437
+ # Release the stream semaphore now we have data
438
+ if release_on_data:
439
+ self.StreamRunSentSemaphore.release()
440
+ self.stripesEvent.clear()
441
+ release_on_data = False
442
+
443
+ # If a duration has been set, track it based on the time of the last stripe
444
+ if stream_duration is not None:
445
+ last_line = new_stripes.splitlines()[-1]
446
+ last_time = last_line.split(separator)[0]
447
+
448
+ # Write all the stripes if we can
449
+ if int(last_time) < int(stream_duration / (10 ** base_sample_unit_exponent)):
450
+ f.write(new_stripes)
451
+ # Otherwise only write stripes within the duration limit
452
+ else:
453
+ for this_line in new_stripes.splitlines():
454
+ this_time_str = this_line.split(separator)[0]
455
+ if int(this_time_str) < int(stream_duration / (10 ** base_sample_unit_exponent)):
456
+ f.write(this_line + '\r\n') # Put the CR back on the end
353
457
  else:
354
- for thisLine in newStripes.splitlines()[:-2]: # Process lines before 'eof' and '>'
355
- thisTimeStr = thisLine.split(separator)[0]
356
- if int(thisTimeStr) < int(streamDuration / (10 ** baseSampleUnitExponent)):
357
- f.write(thisLine + '\r\n') # Put the CR back on the end
358
- else:
359
- streamComplete = True
360
- break
361
- else:
362
- # newStripes was already globally space-replaced.
363
- f.write(newStripes[:removeChar])
458
+ stream_complete = True
459
+ break
460
+ # Default to writing all stripes
364
461
  else:
365
- maxFileExceeded = True
366
- maxFileStatus = self.streamBufferStatus(device=module, sock=self.streamSock)
367
- f.write('Warning: Max file size exceeded before end of stream.\n')
368
- f.write(
369
- 'Unrecorded stripes in buffer when file full: ' + maxFileStatus + '.\n') # Added newline for clarity
370
- self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
371
- break # Exit inner while loop
372
- else: # isEmpty == True
373
- time.sleep(0.1)
374
- streamStatus = self.streamRunningStatus(device=module, sock=self.streamSock)
375
- if streamOverrun:
376
- break # Exit inner while loop
377
- elif "Stopped" in streamStatus:
462
+ f.write(new_stripes)
463
+ # If we have no data
464
+ else:
465
+ if stream_overrun:
466
+ break # Exit stream processing loop
467
+ elif "stopped" in stream_status_str:
378
468
  self.deviceDict[module][0:3] = [True, 'Stopped', 'User halted stream']
379
- break # Exit inner while loop
380
- # End of inner while self.stopFlagList... loop
469
+ break # Exit stream processing loop
470
+ # End of stream data processing loop
381
471
 
382
- self.sendAndReceiveCmd(self.streamSock, 'rec stop', device=module, betweenCommandDelay=0)
383
- streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0)
384
- while "stopped" not in streamState.lower():
472
+ # Ensure the stream is fully stopped, though standard exit cases should have ended it already
473
+ self.send_command('rec stop', device=module, qis_socket=self.streamSock)
474
+ stream_state = self.send_command('stream?', device=module, qis_socket=self.streamSock)
475
+ while "stopped" not in stream_state.lower():
385
476
  logging.debug("waiting for stream? to return stopped")
386
477
  time.sleep(0.1)
387
- streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0)
388
-
389
- if (not streamOverrun) and (not maxFileExceeded):
390
- self.deviceDict[module][0:3] = [False, 'Stopped', 'Stream stopped - emptying buffer']
391
-
392
- if not maxFileExceeded:
393
- streamOverrun_final, removeChar_final, newStripes_final = self.streamGetStripesText(self.streamSock, module, numStripesPerRead)
394
- isEmpty_final = (removeChar_final == -6 and len(newStripes_final) == 6)
395
-
396
- while not isEmpty_final:
397
- current_file_mb_final = 0.0
398
- if is_in_memory_stream:
399
- current_file_mb_final = f.tell() / 1048576.0
400
- elif fileName:
401
- try:
402
- statInfo = os.stat(fileName)
403
- current_file_mb_final = statInfo.st_size / 1048576.0
404
- except Exception:
405
- current_file_mb_final = 0.0
406
- else:
407
- current_file_mb_final = 0.0
408
-
409
- try:
410
- max_mb_val_final = int(fileMaxMB)
411
- except (ValueError, TypeError):
412
- max_mb_val_final = float('inf') # Effectively disable
413
-
414
- if current_file_mb_final < max_mb_val_final:
415
- if not streamComplete: # Check if stream was already completed due to duration
416
- if (streamAverage != None):
417
- leftover, remainingStripes = self.averageStripes(leftover, stripesPerAverage,
418
- newStripes_final[
419
- :removeChar_final], f,
420
- remainingStripes)
421
- else:
422
- newStripes_final = newStripes_final.replace(' ', separator) # Ensure replacement
423
- f.write(newStripes_final[:removeChar_final])
424
- else:
425
- if not maxFileExceeded: # Only write warning if not already written
426
- maxFileStatus_final = self.streamBufferStatus(device=module, sock=self.streamSock)
427
- f.write('Warning: Max file size exceeded before end of stream.\n') # Changed from b''
428
- f.write('Unrecorded stripes in buffer when file full: ' + maxFileStatus_final + '.\n') # Changed from b'', added newline
429
- logging.warning('Max file size exceeded. Some data has not been saved to file: ' + maxFileStatus_final + '.')
430
- maxFileExceeded = True # Set flag
431
- self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
432
- break # Exit emptying loop
433
-
434
- streamOverrun_final, removeChar_final, newStripes_final = self.streamGetStripesText(
435
- self.streamSock, module, numStripesPerRead, skipStatusCheck=True)
436
- isEmpty_final = (removeChar_final == -6 and len(newStripes_final) == (
437
- 6 if newStripes_final else 0)) # handle newStripes_final potentially being None
478
+ stream_state = self.send_command('stream?', device=module, qis_socket=self.streamSock)
438
479
 
439
- if streamOverrun: # This check is after emptying buffer; might need re-evaluation if overrun can happen during emptying
480
+ if stream_overrun:
440
481
  self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun - QIS buffer empty']
441
- elif not maxFileExceeded: # If not overrun and not exceeded file size
482
+ elif not max_file_exceeded:
442
483
  self.deviceDict[module][0:3] = [False, 'Stopped', 'Stream stopped']
443
- # If maxFileExceeded is true, the status is already set.
444
484
 
445
- time.sleep(0.2)
446
- isRun = False # Exit main while isRun loop
485
+ is_run = False # Exit main while loop
447
486
  except IOError as err:
448
487
  logging.error(f"IOError in startStreamThread for module {module}: {err}")
449
- # f might have been closed by the system if it's a pipe and the other end closed,
450
- # or other severe IO errors.
451
- # Attempt to close only if this function opened it and it seems like it might be openable/closable.
488
+ # f might have been closed by the system if it's a pipe and the other end closed or other severe errors.
489
+ # Attempt to close only if this function opened it, and it seems like it might be openable/closable.
452
490
  if file_opened_by_function and f is not None:
453
491
  try:
454
492
  if not f.closed:
455
493
  f.close()
456
494
  except Exception as e_close:
457
- logging.error(f"Error closing file {fileName} during IOError handling: {e_close}")
495
+ logging.error(f"Error closing file {file_name} during IOError handling: {e_close}")
458
496
  f = None # Avoid trying to close again in finally if error persists
459
497
 
460
498
  time.sleep(0.5)
461
- openAttempts += 1
462
- if openAttempts > 4:
499
+ open_attempts += 1
500
+ if open_attempts > 4:
463
501
  logging.error(f"Too many IOErrors in QisInterface for module {module}. Raising error.")
464
502
  # Set device status before raising, if possible
465
503
  self.deviceDict[module][0:3] = [True, 'Stopped', f'IOError limit exceeded: {err}']
@@ -470,621 +508,499 @@ class QisInterface:
470
508
  if not f.closed: # Check if not already closed (e.g. in IOError block)
471
509
  f.close()
472
510
  except Exception as e_close:
473
- logging.error(f"Error closing file {fileName} in finally block: {e_close}")
474
- # If output_file_handle was passed, caller is responsible for closing.
475
- # If inMemoryData was passed, it's managed by caller.
476
- # The original `else: inMemoryData = f` is removed as inMemoryData (StringIO) is mutated in-place.
477
-
478
- # This is the function that is ran when t1 is created. It is ran in a seperate thread from
479
- # the main application so streaming can happen without blocking the main application from
480
- # doing other things. Within this function/thread you have to be very careful not to try
481
- # and 'communicate' with anything from other threads. If you do, you MUST use a thread safe
482
- # way of communicating. The thread creates it's own socket and should use that NOT the objects socket
483
- # (which some of the comms with module functions will use by default).
484
-
485
- def startStreamThreadQPS(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator):
486
-
487
- # Start module streaming and then read stream data
488
- # self.sendAndReceiveCmd(self.streamSock, 'stream mode resample 10mS', device=module, betweenCommandDelay=0)
489
- self.sendAndReceiveCmd(self.streamSock, 'stream mode header v3', device=module, betweenCommandDelay=0)
490
- self.sendAndReceiveCmd(self.streamSock, 'stream mode power enable', device=module, betweenCommandDelay=0)
491
- self.sendAndReceiveCmd(self.streamSock, 'stream mode power total enable', device=module, betweenCommandDelay=0)
492
-
493
- self.qps_record_start_time = time.time() * 1000
494
-
495
- stripes = ['Empty Header']
496
- # Send stream command so module starts streaming data into the backends buffer
497
- streamRes = self.sendAndReceiveCmd(self.streamSock, 'rec stream', device=module, betweenCommandDelay=0)
498
- # printText(streamRes)
499
- if ('rec stream : OK' in streamRes):
500
- if (releaseOnData == False):
501
- self.StreamRunSentSemaphore.release()
502
- self.stripesEvent.clear()
503
- self.deviceDict[module][0:3] = [False, 'Running', 'Stream Running']
504
- else:
505
- self.StreamRunSentSemaphore.release()
506
- self.stripesEvent.clear()
507
- self.deviceDict[module][0:3] = [True, 'Stopped', module + " couldn't start because " + streamRes]
508
- return
509
-
510
- # If recording to file then get header for file
511
- if (fileName is not None):
511
+ logging.error(f"Error closing file {file_name} in finally block: {e_close}")
512
+ # If output_file_handle was passed, the caller is responsible for closing.
513
+ # If inMemoryData was passed, it's managed by the caller.
512
514
 
513
- baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
514
- count = 0
515
- maxTries = 10
516
- while 'Header Not Available' in baseSamplePeriod:
517
- baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
518
- time.sleep(0.1)
519
- count += 1
520
- if count > maxTries:
521
- self.deviceDict[module][0:3] = [True, 'Stopped', 'Header not available']
522
- exit()
523
- version = self.streamHeaderVersion(device=module, sock=self.streamSock)
524
-
525
- numStripesPerRead = 4096
526
- maxFileExceeded = False
527
- openAttempts = 0
528
- leftover = 0
529
- remainingStripes = []
530
- streamOverrun = False
531
- # if streamAverage != None:
532
- # # Matt converting streamAveraging into number
533
- # streamAverage = self.convertStreamAverage(streamAverage)
534
- # stripesPerAverage = float(streamAverage) / (float(baseSamplePeriodS) * 4e-6)
515
+ def get_device_list(self, sock=None) -> filter:
516
+ """
517
+ returns a list of device IDs that are available for connection
535
518
 
536
- isRun = True
519
+ Args:
520
+ sock:
521
+ Optional connection socket
537
522
 
538
- self.create_dir_structure(module, fileName)
523
+ Returns:
524
+ A filtered iterable list of devices
539
525
 
540
- while isRun:
541
- try:
542
- # with open(fileName, 'ab') as f:
543
- # Until the event threadRunEvent is set externally to this thread,
544
- # loop and read from the stream
545
- i = self.deviceMulti(module)
546
- while self.stopFlagList[i] and (not streamOverrun):
547
- # now = time.time()
548
- streamOverrun, removeChar, newStripes = self.streamGetStripesText(self.streamSock, module,
549
- numStripesPerRead)
550
- newStripes = newStripes.replace(' ',separator)
551
-
552
- if streamOverrun:
553
- self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun']
554
- if (removeChar == -6 and len(newStripes) == 6):
555
- isEmpty = True
556
- else:
557
- isEmpty = False
558
- if isEmpty == False:
559
- # Writes in file if not too big else stops streaming
560
- # Writing multiple stripes
561
- if "\r\n" in y:
562
- y = y.split("\r\n")
563
-
564
- if self.has_digitals:
565
- # Write qps files for PAM
566
- for stripes in y:
567
- if stripes:
568
- stripe = stripes.split(",")
569
- self.write_stripe_to_files_PAM(stripe)
570
- else:
571
- # Write qps files for PPM
572
- for stripes in y:
573
- if stripes:
574
- stripe = stripes.split(",")
575
- self.write_stripe_to_files_HD(stripe)
526
+ """
576
527
 
577
- else:
578
- if self.has_digitals:
579
- # Write qps files for PAM
580
- for stripes in y:
581
- if stripes:
582
- stripe = stripes.split(",")
583
- self.write_stripe_to_files_PAM(stripe)
584
- else:
585
- # Write qps files for PPM
586
- for stripes in y:
587
- if stripes:
588
- stripe = stripes.split(",")
589
- self.write_stripe_to_files_HD(stripe)
528
+ if sock is None:
529
+ sock = self.sock
590
530
 
531
+ dev_string = self.sendAndReceiveText(sock, '$list')
532
+ dev_string = dev_string.replace('>', '')
533
+ dev_string = dev_string.replace(r'\d+\) ', '')
534
+ dev_string = dev_string.split('\r\n')
535
+ dev_string = filter(None, dev_string) #remove empty elements
591
536
 
592
- else:
593
- # there's no stripes in the buffer - it's not filling up fast -
594
- # sleeps so we don't spam qis with requests (seems to make QIS crash)
595
- # it might be clever to change the sleep time accoring to the situation
596
- # e.g. wait longer with higher averaging or lots of no stripes in a row
597
- time.sleep(0.1)
598
- streamStatus = self.streamRunningStatus(device=module, sock=self.streamSock)
599
- if streamOverrun:
600
- # printText('QisInterface overrun - breaking')
601
- break
602
- elif "Stopped" in streamStatus:
603
- self.deviceDict[module][0:3] = [True, 'Stopped', 'User halted stream']
604
- break
537
+ return dev_string
605
538
 
606
- # printText('Left while 1')
607
- self.sendAndReceiveCmd(self.streamSock, 'rec stop', device=module, betweenCommandDelay=0)
608
- # streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0) # use "stream?" rather than "rec stream?" as it checks both QIS AND the device.
609
- # while "stopped" not in streamState.lower():
610
- # logging.debug("waiting for stream? to contained stopped")
611
- # time.sleep(0.1)
612
- # streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module,betweenCommandDelay=0) # use "stream?" rather than "rec stream?" as it checks both QIS AND the device.
539
+ def get_list_details(self, sock=None) -> list:
540
+ """
541
+ Extended version of get_device_list which also returns the additional details
542
+ fields for each module
613
543
 
614
- isRun = False
615
- except IOError as err:
616
- # printText('\n\n!!!!!!!!!!!!!!!!!!!! IO Error in QisInterface !!!!!!!!!!!!!!!!!!!!\n\n')
617
- time.sleep(0.5)
618
- openAttempts += 1
619
- if openAttempts > 4:
620
- logging.error(
621
- '\n\n!!!!!!!!!!!!!!!!!!!! Too many IO Errors in QisInterface !!!!!!!!!!!!!!!!!!!!\n\n')
622
- raise err
623
-
624
- self.create_index_file()
625
- if self.has_digitals:
626
- self.create_index_file_digitals()
627
-
628
- self.create_qps_file(module)
629
-
630
- def write_stripe_to_files_HD(self, stripe):
631
- # Cycle through items in stripe
632
- for index, item in enumerate(stripe):
633
- if index == 0:
634
- continue
635
- with open(os.path.join(self.qps_record_dir_path, "data000",
636
- "data000_00" + index - 1 + "_000000000"),
637
- "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
638
-
639
- x = struct.pack(">d", int(item))
640
- # logging.debug(item, x)
641
- file1.write(x)
642
-
643
- def write_stripe_to_files_PAM(self, stripe):
644
- # Note to reader - List should be ordered 1>x on analogue and digitals
645
- counter = 0
646
- for group in self.streamGroups.groups:
647
- for i, channel in enumerate(group.channels):
648
- # incrementing here so we skip stripe[0] which is time
649
- counter += 1
650
-
651
- x = i
652
- while len(str(x)) < 3:
653
- x = "0" + str(x)
654
-
655
- # Write all in group 0 to analogue
656
- if group.group_id == 0:
657
-
658
- with open(os.path.join(self.qps_record_dir_path, "data000",
659
- "data000_"+x+"_000000000"),
660
- "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
661
- x = struct.pack(">d", int(stripe[counter]))
662
- # logging.debug(item, x)
663
- file1.write(x)
664
- else:
665
- # Write all in group 1 to digital
666
- with open(os.path.join(self.qps_record_dir_path, "data101",
667
- "data101_"+x+"_000000000"),
668
- "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
669
- x = struct.pack(">d", int(stripe[counter]))
670
- # logging.debug(item, x)
671
- file1.write(x)
672
-
673
- # Query the backend for a list of connected modules. A $scan command is sent to refresh the list of devices,
674
- # Then a wait occurs while the backend discovers devices (network ones can take a while) and then a list of device name strings is returned
675
- # The objects connection needs to be opened (connect()) before this is used
676
- def getDeviceList(self, sock=None):
544
+ Args:
545
+ sock:
546
+ Optional connection socket
547
+ Returns:
548
+ Iterable list of strings containing the details of each device available for connection.
677
549
 
678
- if sock == None:
679
- sock = self.sock
680
- devString = self.sendAndReceiveText(sock, '$list')
681
- devString = devString.replace('>', '')
682
- devString = devString.replace(r'\d+\) ', '')
683
- devString = devString.split('\r\n')
684
- devString = filter(None, devString) #remove empty elements
685
- return devString
686
-
687
- def get_list_details(self, sock=None):
688
- if sock == None:
550
+ """
551
+ if sock is None:
689
552
  sock = self.sock
690
553
 
691
- devString = self.sendAndReceiveText(sock, '$list details')
692
- devString = devString.replace('>', '')
693
- devString = devString.replace(r'\d+\) ', '')
694
- devString = devString.split('\r\n')
695
- devString = [x for x in devString if x] # remove empty elements
696
- return devString
554
+ dev_string = self.sendAndReceiveText(sock, '$list details')
555
+ dev_string = dev_string.replace('>', '')
556
+ dev_string = dev_string.replace(r'\d+\) ', '')
557
+ dev_string = dev_string.split('\r\n')
558
+ dev_string = [x for x in dev_string if x] # remove empty elements
559
+ return dev_string
697
560
 
698
- def scanIP(QisConnection, ipAddress):
561
+ def scan_ip(self, qis_connection, ip_address) -> bool:
699
562
  """
700
- Triggers QIS to look at a specific IP address for a quarch module
563
+ Triggers QIS to look at a specific IP address for a module
564
+
565
+ Arguments
701
566
 
702
- Parameters
703
- ----------
704
567
  QisConnection : QpsInterface
705
- The interface to the instance of QPS you would like to use for the scan.
568
+ The interface to the instance of QIS you would like to use for the scan.
706
569
  ipAddress : str
707
570
  The IP address of the module you are looking for eg '192.168.123.123'
708
- sleep : int, optional
709
- This optional variable sleeps to allow the network to scan for the module before allowing new commands to be sent to QIS.
710
571
  """
711
572
 
712
- logging.debug("Starting QIS IP Address Lookup at " + ipAddress)
713
- if not ipAddress.lower().__contains__("tcp::"):
714
- ipAddress = "TCP::" + ipAddress
573
+ logging.debug("Starting QIS IP Address Lookup at " + ip_address)
574
+ if not ip_address.lower().__contains__("tcp::"):
575
+ ip_address = "TCP::" + ip_address
715
576
  response = "No response from QIS Scan"
716
577
  try:
717
- response = QisConnection.sendCmd(cmd="$scan " + ipAddress, expectedResponse=True)
718
- # valid response is "Located device: 192.168.1.2"
578
+ response = qis_connection.send_command("$scan " + ip_address)
579
+ # The valid response is "Located device: 192.168.1.2"
719
580
  if "located" in response.lower():
720
581
  logging.debug(response)
721
582
  # return the valid response
722
- return response
583
+ return True
723
584
  else:
724
- if "startup" not in response.lower():
725
- logging.warning("No module found at " + ipAddress)
726
- logging.warning(response)
727
- return response
585
+ logging.warning("No module found at " + ip_address)
586
+ logging.warning(response)
587
+ return False
728
588
 
729
589
  except Exception as e:
590
+ logging.warning("No module found at " + ip_address)
730
591
  logging.warning(e)
731
- if "startup" not in response.lower():
732
- logging.warning("No module found at " + ipAddress)
592
+ return False
593
+
594
+
595
+ def get_qis_module_selection(self, preferred_connection_only=True, additional_options="DEF_ARGS", scan=True) -> str:
596
+ """
597
+ Scans for available modules and allows the user to select one through an interactive selection process.
598
+ Can also handle additional custom options and some built-in ones such as rescanning
599
+
600
+ Arguments:
601
+ preferred_connection_only : bool
602
+ by default (True), returns only one preferred connection eg: USB for simplicity
603
+ additional_options: list
604
+ Additional operational options provided during module selection, such as rescan,
605
+ all connection types, and IP scan. Defaults to ['rescan', 'all con types', 'ip scan']. These allow the
606
+ additional options to be given to the user and handled in the top level script
607
+ scan : bool
608
+ Indicates whether to initiate a rescanning process for devices before listing. Defaults to True and
609
+ will take longer to return
610
+
611
+ Returns:
612
+ str: The identifier of the selected module, or the action selected from the additional options.
613
+
614
+ Raises:
615
+ KeyError: Raised when unexpected keys are found in the scanned device data.
616
+ ValueError: Raised if no valid selection is made or the provided IP address is invalid.
617
+ """
733
618
 
734
- def GetQisModuleSelection(self, favouriteOnly=True , additionalOptions=['rescan', 'all con types', 'ip scan'], scan=True):
735
- '''
736
- Fuction used to list the available deviced to QIS and present them to the user for selection.
619
+ # Avoid mutable warning by adding the argument list in the function rather than the header
620
+ if additional_options == "DEF_ARGS":
621
+ additional_options = ['rescan', 'all con types', 'ip scan']
737
622
 
738
- Returns myDeviceID - Str the connection string used to connect to the selected device.
739
- '''
740
- tableHeaders =["Modules"]
623
+ table_headers = ["Modules"]
741
624
  ip_address = None
742
- favourite = favouriteOnly
625
+ favourite = preferred_connection_only
743
626
  while True:
744
627
  printText("Scanning for modules...")
628
+ found_devices = None
745
629
  if scan and ip_address is None:
746
- foundDevices = self.qis_scan_devices(scan=scan, favouriteOnly=favourite)
630
+ found_devices = self.qis_scan_devices(scan=scan, preferred_connection_only=favourite)
747
631
  elif scan and ip_address is not None:
748
- foundDevices = self.qis_scan_devices(scan=scan, favouriteOnly=favourite, ipAddress=ip_address)
632
+ found_devices = self.qis_scan_devices(scan=scan, preferred_connection_only=favourite, ip_address=ip_address)
749
633
 
750
- myDeviceID = listSelection(title="Select a module",message="Select a module",selectionList=foundDevices,
751
- additionalOptions= additionalOptions, nice=True, tableHeaders=tableHeaders,
752
- indexReq=True)
753
- if myDeviceID.lower() == 'rescan':
634
+ my_device_id = listSelection(title="Select a module",message="Select a module",
635
+ selectionList=found_devices, additionalOptions= additional_options,
636
+ nice=True, tableHeaders=table_headers, indexReq=True)
637
+
638
+ if my_device_id.lower() == 'rescan':
754
639
  favourite = True
755
640
  ip_address = None
756
641
  continue
757
- elif myDeviceID.lower() == 'all con types':
642
+ elif my_device_id.lower() == 'all con types':
758
643
  favourite = False
759
644
  printText("Displaying all connection types...")
760
645
  continue
761
- elif myDeviceID.lower() == 'ip scan':
646
+ elif my_device_id.lower() == 'ip scan':
762
647
  ip_address = requestDialog(title="Please input the IP Address you would like to scan")
763
648
  favourite = False
764
649
  continue
765
650
  break
766
651
 
767
- return myDeviceID
652
+ return my_device_id
653
+
654
+ def qis_scan_devices(self, scan=True, preferred_connection_only=True, ip_address=None) -> list:
655
+ """
656
+ Begins a scan for devices and returns a simple list of devices
657
+
658
+ Args:
659
+ scan:
660
+ Should a scan be initiated? If False, the function will return immediately with the list
661
+ preferred_connection_only:
662
+ The default (True), returns only one preferred connection eg: USB for simplicity
663
+ ip_address:
664
+ IP address of the module you are looking for eg '192.168.123.123'
665
+
666
+ Returns:
667
+ list: List of module strings found during scan
668
+ """
768
669
 
769
- def qis_scan_devices(self, scan=True, favouriteOnly=True, ipAddress=None):
770
- deviceList = []
771
- foundDevices = "1"
772
- foundDevices2 = "2" # this is used to check if new modules are being discovered or if all have been found.
773
- scanWait = 2 # The number of seconds waited between the two scans.
670
+ device_list = []
671
+ found_devices = "1"
672
+ found_devices2 = "2" # this is used to check if new modules are being discovered or if all have been found.
673
+ scan_wait = 2 # The number of seconds waited between the scan and the initial list
674
+ list_wait = 1 # The time between checks for new devices in the list
774
675
 
775
676
  if scan:
776
- if ipAddress == None:
777
- devString = self.sendAndReceiveText(self.sock, '$scan')
677
+ # Perform the initial scan attempt
678
+ if ip_address is None:
679
+ dev_string = self.sendAndReceiveText(self.sock, '$scan')
778
680
  else:
779
- devString = self.sendAndReceiveText(self.sock, '$scan TCP::' + ipAddress)
780
- time.sleep(scanWait)
781
- while foundDevices not in foundDevices2:
782
- foundDevices = self.sendAndReceiveText(self.sock, '$list')
783
- time.sleep(scanWait)
784
- foundDevices2 = self.sendAndReceiveText(self.sock, '$list')
681
+ dev_string = self.sendAndReceiveText(self.sock, '$scan TCP::' + ip_address)
682
+ # Wait for devices to enumerate
683
+ time.sleep(scan_wait)
684
+ # While new devices are being found, extend the wait time
685
+ while found_devices not in found_devices2:
686
+ found_devices = self.sendAndReceiveText(self.sock, '$list')
687
+ time.sleep(list_wait)
688
+ found_devices2 = self.sendAndReceiveText(self.sock, '$list')
785
689
  else:
786
- foundDevices = self.sendAndReceiveText(self.sock, '$list')
787
-
788
- if not "no devices found" in foundDevices.lower():
789
- foundDevices = foundDevices.replace('>', '')
790
- #foundDevices = foundDevices.replace(r'\d\) ', '')
791
- # printText('"' + devString + '"')
792
- foundDevices = foundDevices.split('\r\n')
793
- #Can't stream over REST! Removing all REST connections.
794
- tempList= list()
795
- for item in foundDevices:
690
+ found_devices = self.sendAndReceiveText(self.sock, '$list')
691
+
692
+ # If we found devices, process them into a list to return
693
+ if not "no devices found" in found_devices.lower():
694
+ found_devices = found_devices.replace('>', '')
695
+ found_devices = found_devices.split('\r\n')
696
+ # Can't stream over REST. Removing all REST connections.
697
+ temp_list= list()
698
+ for item in found_devices:
796
699
  if item is None or "rest" in item.lower() or item == "":
797
700
  pass
798
701
  else:
799
- tempList.append(item.split(")")[1].strip())
800
- foundDevices = tempList
702
+ temp_list.append(item.split(")")[1].strip())
703
+ found_devices = temp_list
801
704
 
802
- #If favourite only is True then only show one connection type for each module connected.
803
- #First order the devices in preference type and then pick the first con type found for each module.
804
- if (favouriteOnly):
805
- foundDevices = self.sortFavourite(foundDevices)
705
+ # If the preferred connection only flag is True, then only show one connection type for each module connected.
706
+ # First, order the devices by their preference type and then pick the first con type found for each module.
707
+ if preferred_connection_only:
708
+ found_devices = self.sort_favourite(found_devices)
806
709
  else:
807
- foundDevices = ["***No Devices Found***"]
710
+ found_devices = ["***No Devices Found***"]
711
+
712
+ return found_devices
713
+
714
+ def sort_favourite(self, found_devices) -> list:
715
+ """
716
+ Reduces the list of located devices by referencing to the preferred type of connection. Only
717
+ one connection type will be returned for each module for easier user selection. ie: A module connected
718
+ on both USB and TCP will now only return with USB
719
+
720
+ Args:
721
+ found_devices:
722
+ List of located devices from a scan operation
808
723
 
809
- return foundDevices
724
+ Returns:
725
+ List of devices filtered/sorted devices
726
+ """
810
727
 
811
- def sortFavourite(self, foundDevices):
812
728
  index = 0
813
- sortedFoundDevices = []
814
- conPref = ["USB", "TCP", "SERIAL", "REST", "TELNET"]
815
- while len(sortedFoundDevices) != len(foundDevices):
816
- for device in foundDevices:
817
- if conPref[index] in device.upper():
818
- sortedFoundDevices.append(device)
729
+ sorted_found_devices = []
730
+ con_pref = ["USB", "TCP", "SERIAL", "REST", "TELNET"]
731
+ while len(sorted_found_devices) != len(found_devices):
732
+ for device in found_devices:
733
+ if con_pref[index] in device.upper():
734
+ sorted_found_devices.append(device)
819
735
  index += 1
820
- foundDevices = sortedFoundDevices
736
+ found_devices = sorted_found_devices
737
+
821
738
  # new dictionary only containing one favourite connection to each device.
822
- favConFoundDevices = []
739
+ fav_con_found_devices = []
823
740
  index = 0
824
- for device in sortedFoundDevices:
825
- if (favConFoundDevices == [] or not device.split("::")[1] in str(favConFoundDevices)):
826
- favConFoundDevices.append(device)
827
- foundDevices = favConFoundDevices
828
- return foundDevices
829
-
830
- # Query stream status for a device attached to backend
831
- # The objects connection needs to be opened (connect()) before this is used
832
- def streamRunningStatus(self, device, sock=None):
833
- if sock == None:
741
+ for device in sorted_found_devices:
742
+ if fav_con_found_devices == [] or not device.split("::")[1] in str(fav_con_found_devices):
743
+ fav_con_found_devices.append(device)
744
+ found_devices = fav_con_found_devices
745
+ return found_devices
746
+
747
+ def stream_running_status(self, device, sock=None) -> str:
748
+ """
749
+ returns a single word status string for a given device. Generally this will be running, overrun, or stopped
750
+
751
+ Arguments
752
+
753
+ device : str
754
+ The device ID to target
755
+ sock:
756
+ The socket to communicate over, or None to use the default.
757
+
758
+ Returns:
759
+ str: Single word status string to show the operation of streaming
760
+ """
761
+ if sock is None:
834
762
  sock = self.sock
835
- index = 0 # index of relevant line in split string
836
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
837
- streamStatus = streamStatus.split('\r\n')
838
- streamStatus[index] = re.sub(r':', '', streamStatus[index]) #remove :
839
- return streamStatus[index]
840
-
841
- # Query stream buffer status for a device attached to backend
842
- # The objects connection needs to be opened (connect()) before this is used
843
- def streamBufferStatus(self, device, sock=None):
844
- if sock == None:
763
+
764
+ index = 0
765
+ stream_status = self.sendAndReceiveText(sock, 'stream?', device)
766
+
767
+ # Split the response, select the first time and trim the colon
768
+ status_parts = stream_status.split('\r\n')
769
+ stream_status = re.sub(r':', '', status_parts[index])
770
+ return stream_status
771
+
772
+ def stream_buffer_status(self, device, sock=None) -> str:
773
+ """
774
+ returns the info on the stripes buffered during the stream
775
+
776
+ Arguments
777
+
778
+ device : str
779
+ The device ID to target
780
+ sock:
781
+ The socket to communicate over, or None to use the default.
782
+
783
+ Returns:
784
+ str: String with the numbers of stripes buffered
785
+ """
786
+ if sock is None:
845
787
  sock = self.sock
846
- index = 1 # index of relevant line in split string
847
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
848
- streamStatus = streamStatus.split('\r\n')
849
- streamStatus[index] = re.sub(r'^Stripes Buffered: ', '', streamStatus[index])
850
- return streamStatus[index]
788
+
789
+ index = 1
790
+ stream_status = self.sendAndReceiveText(sock, 'stream?', device)
791
+
792
+ # Split the response, select the second the info on the stripes buffered
793
+ status_lines = stream_status.split('\r\n')
794
+ stream_status = re.sub(r'^Stripes Buffered: ', '', status_lines[index])
795
+ return stream_status
851
796
 
852
797
  # TODO: MD - This function should be replaced with a more generic method of accessing the header
853
798
  # The return of a string with concatenated value and units should be replaced with something easier to parse
854
- #
855
- # Get the averaging used on the last/current stream
856
- # The objects connection needs to be opened (connect()) before this is used
857
- def streamHeaderAverage(self, device, sock=None):
799
+ def stream_header_average(self, device, sock=None) -> str:
800
+ """
801
+ Gets the averaging used on the current stream, required for processing the stripe data returned from QIS
802
+
803
+ Arguments
804
+
805
+ device : str
806
+ The device ID to target
807
+ sock:
808
+ The socket to communicate over, or None to use the default.
809
+
810
+ Returns:
811
+ str: String with the rate and unit
812
+ """
858
813
  try:
859
- if sock == None:
814
+ if sock is None:
860
815
  sock = self.sock
816
+
861
817
  index = 2 # index of relevant line in split string
862
- streamStatus = self.sendAndReceiveText(sock, sentText='stream text header', device=device)
818
+ stream_status = self.send_and_receive_text(sock, send_text='stream text header', device=device)
863
819
 
864
- self.qps_stream_header = streamStatus
820
+ self.qps_stream_header = stream_status
865
821
 
866
822
  # Check for the header format. If XML, process here
867
- if (self.isXmlHeader(streamStatus)):
823
+ if self.is_xml_header(stream_status):
868
824
  # Get the basic averaging rate (V3 header)
869
- xml_root = self.getStreamXmlHeader(device=device, sock=sock)
870
-
871
- # For QPS streaming, stream header v3 command has already been issued before this
825
+ xml_root = self.get_stream_xml_header(device=device, sock=sock)
872
826
  self.module_xml_header = xml_root
873
827
 
874
- # Return the time based averaging string
828
+ # Return the time-based averaging string
875
829
  device_period = xml_root.find('.//devicePeriod')
876
- if device_period == None:
830
+ if device_period is None:
877
831
  device_period = xml_root.find('.//devicePerioduS')
878
- if device_period == None:
832
+ if device_period is None:
879
833
  device_period = xml_root.find('.//mainPeriod')
880
- averageStr = device_period.text
881
- return averageStr
834
+ average_str = device_period.text
835
+ return average_str
882
836
  # For legacy text headers, process here
883
837
  else:
884
- streamStatus = streamStatus.split('\r\n')
885
- if('Header Not Available' in streamStatus[0]):
886
- dummy = streamStatus[0] + '. Check stream has been run on device.'
838
+ status_lines = stream_status.split('\r\n')
839
+ if 'Header Not Available' in status_lines[0]:
840
+ dummy = status_lines[0] + '. Check stream has been run on device.'
887
841
  return dummy
888
- streamStatus[index] = re.sub(r'^Average: ', '', streamStatus[index])
889
- avg = streamStatus[index]
842
+ average_str = re.sub(r'^Average: ', '', status_lines[index])
843
+ avg = average_str
890
844
  avg = 2 ** int(avg)
891
845
  return '{}'.format(avg)
892
846
  except Exception as e:
893
847
  logging.error(device + ' Unable to get stream average.' + self.host + ':' + str(self.port))
894
848
  raise e
895
849
 
896
- # Get the version of the stream and convert to string for the specified device
897
- # The objects connection needs to be opened (connect()) before this is used
898
- def streamHeaderVersion(self, device, sock=None):
899
- try:
900
- if sock == None:
901
- sock = self.sock
902
- index = 0 # index of relevant line in split string
903
- streamStatus = self.sendAndReceiveText(sock,'stream text header', device)
904
- streamStatus = streamStatus.split('\r\n')
905
- if 'Header Not Available' in streamStatus[0]:
906
- str = streamStatus[0] + '. Check stream has been ran on device.'
907
- logging.error(str)
908
- return str
909
- version = re.sub(r'^Version: ', '', streamStatus[index])
910
- if version == '3':
911
- version = 'Original PPM'
912
- elif version == '4':
913
- version = 'XLC PPM'
914
- elif version == '5':
915
- version = 'HD PPM'
916
- else:
917
- version = 'Unknown stream version'
918
- return version
919
- except Exception as e:
920
- logging.error(device + ' Unable to get stream version.' + self.host + ':' + str(self.port))
921
- raise e
850
+ def stream_header_format(self, device, sock=None) -> str:
851
+ """
852
+ Formats the stream header for use at the top of a CSV file. This adds the appropriate time column and
853
+ each of the channel data columns
922
854
 
923
- # Get a header string giving which measurements are returned in the string for the specified device
924
- # The objects connection needs to be opened (connect()) before this is used
925
- def streamHeaderFormat(self, device, sock=None):
855
+ Arguments
856
+
857
+ device:
858
+ The device ID to target
859
+ sock:
860
+ The socket to communicate over, or None to use the default.
861
+
862
+ Returns:
863
+ str: Get the CSV formatted header string for the current stream
864
+ """
926
865
  try:
927
- if sock == None:
866
+ if sock is None:
928
867
  sock = self.sock
929
- index = 1 # index of relevant line in split string STREAM MODE HEADER [?|V1,V2,V3]
930
- streamStatus = self.sendAndReceiveText(sock,'stream text header', device)
931
- # Check if this is a new XML form header
932
- if (self.isXmlHeader (streamStatus)):
868
+
869
+ index = 1
870
+ stream_status = self.sendAndReceiveText(sock,'stream text header', device)
871
+ # Check if this is an XML form header
872
+ if self.is_xml_header (stream_status):
933
873
  # Get the basic averaging rate (V3 header)
934
- xml_root = self.getStreamXmlHeader (device=device, sock=sock)
935
- # Return the time based averaging string
874
+ xml_root = self.get_stream_xml_header (device=device, sock=sock)
875
+ # Return the time-based averaging string
936
876
  device_period = xml_root.find('.//devicePeriod')
937
877
  time_unit = 'uS'
938
- if device_period == None:
878
+ if device_period is None:
939
879
  device_period = xml_root.find('.//devicePerioduS')
940
- if device_period == None:
880
+ if device_period is None:
941
881
  device_period = xml_root.find('.//mainPeriod')
942
- if ('ns' in device_period.text):
882
+ if 'ns' in device_period.text:
943
883
  time_unit = 'nS'
944
- averageStr = device_period.text
945
884
 
946
- # Time column always first
947
- formatHeader = 'Time ' + time_unit + ','
885
+ # The time column always first
886
+ format_header = 'Time ' + time_unit + ','
948
887
  # Find the channels section of each group and iterate through it to add the channel columns
949
888
  for group in xml_root.iter():
950
- if (group.tag == "channels"):
889
+ if group.tag == "channels":
951
890
  for chan in group:
952
891
  # Avoid children that are not named channels
953
- if (chan.find('.//name') is not None):
954
- nameStr = chan.find('.//name').text
955
- unitStr = chan.find('.//units').text
956
- formatHeader = formatHeader + nameStr + " " + unitStr + ","
957
- return formatHeader
958
- # Handle legacy text headers here
892
+ if (chan.find('.//name') is not None):
893
+ name_str = chan.find('.//name').text
894
+ group_str = chan.find('.//group').text
895
+ unit_str = chan.find('.//units').text
896
+ format_header = format_header + name_str + " " + group_str + " " + unit_str + ","
897
+ format_header = format_header.rstrip(",")
898
+ return format_header
959
899
  else:
960
- streamStatus = streamStatus.split('\r\n')
961
- if 'Header Not Available' in streamStatus[0]:
962
- str = streamStatus[0] + '. Check stream has been ran on device.'
963
- logging.error(str)
964
- return str
965
- outputMode = self.sendAndReceiveText(sock,'Config Output Mode?', device)
966
- powerMode = self.sendAndReceiveText(sock,'stream mode power?', device)
967
- format = int(re.sub(r'^Format: ', '', streamStatus[index]))
900
+ stream_status = stream_status.split('\r\n')
901
+ if 'Header Not Available' in stream_status[0]:
902
+ err_str = stream_status[0] + '. Check stream has been ran on device.'
903
+ logging.error(err_str)
904
+ return err_str
905
+ output_mode = self.sendAndReceiveText(sock,'Config Output Mode?', device)
906
+ power_mode = self.sendAndReceiveText(sock,'stream mode power?', device)
907
+ data_format = int(re.sub(r'^Format: ', '', stream_status[index]))
968
908
  b0 = 1 #12V_I
969
909
  b1 = 1 << 1 #12V_V
970
910
  b2 = 1 << 2 #5V_I
971
911
  b3 = 1 << 3 #5V_V
972
- formatHeader = 'StripeNum, Trig, '
973
- if format & b3:
974
- if ('3V3' in outputMode):
975
- formatHeader = formatHeader + '3V3_V,'
912
+ format_header = 'StripeNum, Trig, '
913
+ if data_format & b3:
914
+ if '3V3' in output_mode:
915
+ format_header = format_header + '3V3_V,'
976
916
  else:
977
- formatHeader = formatHeader + '5V_V,'
978
- if format & b2:
979
- if ('3V3' in outputMode):
980
- formatHeader = formatHeader + ' 3V3_I,'
917
+ format_header = format_header + '5V_V,'
918
+ if data_format & b2:
919
+ if '3V3' in output_mode:
920
+ format_header = format_header + ' 3V3_I,'
981
921
  else:
982
- formatHeader = formatHeader + ' 5V_I,'
983
-
984
- if format & b1:
985
- formatHeader = formatHeader + ' 12V_V,'
986
- if format & b0:
987
- formatHeader = formatHeader + ' 12V_I'
988
- if 'Enabled' in powerMode:
989
- if ('3V3' in outputMode):
990
- formatHeader = formatHeader + ' 3V3_P'
922
+ format_header = format_header + ' 5V_I,'
923
+
924
+ if data_format & b1:
925
+ format_header = format_header + ' 12V_V,'
926
+ if data_format & b0:
927
+ format_header = format_header + ' 12V_I'
928
+ if 'Enabled' in power_mode:
929
+ if '3V3' in output_mode:
930
+ format_header = format_header + ' 3V3_P'
991
931
  else:
992
- formatHeader = formatHeader + ' 5V_P'
993
- if ((format & b1) or (format & b0)):
994
- formatHeader = formatHeader + ' 12V_P'
995
- return formatHeader
932
+ format_header = format_header + ' 5V_P'
933
+ if (data_format & b1) or (data_format & b0):
934
+ format_header = format_header + ' 12V_P'
935
+ return format_header
996
936
  except Exception as e:
997
937
  logging.error(device + ' Unable to get stream format.' + self.host + ':' + '{}'.format(self.port))
998
938
  raise e
999
939
 
1000
- # Get stripes out of the backends stream buffer for the specified device using text commands
1001
- # The objects connection needs to be opened (connect()) before this is used
1002
- def streamGetStripesText(self, sock, device, numStripes=4096, skipStatusCheck=False):
1003
-
1004
- bufferStatus = False
1005
- # Allows the status check to be skipped when emptying the buffer after streaming has stopped (saving time)
1006
- if (skipStatusCheck == False):
1007
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
1008
- if ('Overrun' in streamStatus) or ('8388608 of 8388608' in streamStatus):
1009
- bufferStatus = True
1010
- stripes = self.sendAndReceiveText(sock, 'stream text all', device, readUntilCursor=True)
1011
- # time.sleep(0.001)
1012
- if stripes[-1:] != self.cursor:
1013
- return "Error no cursor returned."
1014
- else:
1015
- genEndOfFile = 'eof\r\n>'
1016
- if stripes[-6:] == genEndOfFile:
1017
- removeChar = -6
1018
- else:
1019
- removeChar = -1
1020
-
1021
- # stripes = stripes.split('\r\n')
1022
- # stripes = filter(None, stripes) #remove empty sting elements
1023
- #printText(stripes)
1024
- return bufferStatus, removeChar, stripes
1025
-
1026
- def avgStringFromPwr(self, avgPwrTwo):
1027
- if(avgPwrTwo==0):
1028
- return '0'
1029
- elif(avgPwrTwo==1):
1030
- return '2'
1031
- elif(avgPwrTwo > 1 and avgPwrTwo < 10 ):
1032
- avg = 2 ** int(avgPwrTwo)
1033
- return '{}'.format(avg)
1034
- elif(avgPwrTwo==10):
1035
- return '1k'
1036
- elif(avgPwrTwo==11):
1037
- return '2k'
1038
- elif(avgPwrTwo==12):
1039
- return '4k'
1040
- elif(avgPwrTwo==13):
1041
- return '8k'
1042
- elif(avgPwrTwo==14):
1043
- return '16k'
1044
- elif(avgPwrTwo==15):
1045
- return '32k'
1046
- else:
1047
- return 'Invalid Average Value'
1048
-
1049
- # TODO: MD Thinks this implements software averaging, is unused and now performed in QIS
1050
- # Works out average values of timescales longer than max device averaging
1051
- def averageStripes(self, leftover, streamAverage, newStripes, f, remainingStripes = []):
1052
- newString = str(newStripes)
1053
- newList = []
1054
- if remainingStripes == []:
1055
- newList = newString.split('\r\n')
1056
- else:
1057
- newList = remainingStripes
1058
- newList.extend(newString.split('\r\n'))
1059
- numElements = newList[0].count(' ') + 1
1060
- streamTotalAverage = leftover + streamAverage
1061
- splitList = [] * numElements
1062
- if len(newList) < streamTotalAverage:
1063
- remainingStripes = newList[:-1]
1064
- return leftover, remainingStripes
1065
- runningAverage = [0] * (len(newList[0].split(' ')) - 2)
1066
- j = 0
1067
- z = 1
1068
- for i in newList[:-1]:
1069
- splitList = i.split(' ')
1070
- splitNumbers = [int(x) for x in splitList[2:]]
1071
- runningAverage = [sum(x) for x in zip(runningAverage, splitNumbers)]
1072
- if z == math.floor(streamTotalAverage):
1073
- finalAverage = splitList[0:2] + [str(round(x / streamAverage)) for x in runningAverage]
1074
- for counter in xrange(len(finalAverage)-1):
1075
- finalAverage[counter] = finalAverage[counter] + ' '
1076
- for x in finalAverage:
1077
- f.write(x)
1078
- f.write('\r\n')
1079
- streamTotalAverage += streamAverage
1080
- j += 1
1081
- z += 1
1082
- remainingStripes = newList[int(math.floor(j * streamAverage + leftover)):-1]
1083
- leftover = (streamTotalAverage - streamAverage) % 1
1084
- return leftover, remainingStripes
1085
-
1086
- def deviceMulti(self, device):
1087
- if (device in self.deviceList):
940
+ def stream_get_stripes_text(self, sock, device: str) -> tuple[str, str]:
941
+ """
942
+ Retrieve and process text data from a QIS stream.
943
+ We try to ready a block of data and also check for end of data and error cases
944
+
945
+ Args:
946
+ sock:
947
+ The socket instance used for communication with the device.
948
+ device:
949
+ The device ID string
950
+
951
+ Returns:
952
+ A tuple containing:
953
+ - The status of the data stream as a comma seperated list of status items
954
+ - The retrieved text data from the stream.
955
+ """
956
+
957
+ stream_status = "running"
958
+ is_end_of_block = False
959
+
960
+ # Try and read the next blocks of stripes from QIS
961
+ stripes = self.sendAndReceiveText(sock, 'stream text all', device)
962
+
963
+ # The 'eof' marker ONLY indicates that the full number of requested stripes was not available.
964
+ # More may be found later.
965
+ if stripes.endswith("eof\r\n>"):
966
+ is_end_of_block = True
967
+ stripes = stripes.rstrip("eof\r\n>")
968
+ # The current reader seems to lose the final line feeds, so check for this
969
+ if len(stripes) > 0:
970
+ if not stripes.endswith("\r\n"):
971
+ stripes += "\r\n"
972
+
973
+ # If there is an unusually small data set, check the stream status to make sure data is coming
974
+ # 7 is a little arbitrary, but smaller than any possible stripe size. Over calling will not matter anyway
975
+ if len(stripes) < 7 or is_end_of_block:
976
+ current_status = self.sendAndReceiveText(sock, 'stream?', device).lower()
977
+ if "running" in current_status:
978
+ stream_status = "running"
979
+ elif "overrun" in current_status or "out of buffer" in current_status:
980
+ stream_status = "overrun"
981
+ elif "stopped" in current_status:
982
+ stream_status = "stopped"
983
+ # If the stream is stopped and at end of block, we have read all the data
984
+ if is_end_of_block:
985
+ stream_status = stream_status + "eof"
986
+
987
+ return stream_status, stripes
988
+
989
+ def device_control_index(self, device) -> int:
990
+ """
991
+ Returns the index of the device in the control lists. If the device is not
992
+ registered, then it is added first. This is a key part of allowing us to
993
+ track the status of multiple streaming devices and manage them from outside
994
+ their streaming thread
995
+
996
+ Args:
997
+ device:
998
+ Device ID string
999
+ Returns:
1000
+ Index of the device in the various control lists
1001
+
1002
+ """
1003
+ if device in self.deviceList:
1088
1004
  return self.deviceList.index(device)
1089
1005
  else:
1090
1006
  self.listSemaphore.acquire()
@@ -1093,7 +1009,17 @@ class QisInterface:
1093
1009
  self.listSemaphore.release()
1094
1010
  return self.deviceList.index(device)
1095
1011
 
1096
- def deviceDictSetup(self, module):
1012
+ def device_dict_setup(self, module) -> None:
1013
+ """
1014
+ Adds a dictionary entry for a new module we are connecting to (including the base QIS connection)
1015
+ This is used for tracking the status of modules throughout the streaming process
1016
+
1017
+ Args:
1018
+ module:
1019
+
1020
+ Returns:
1021
+ None
1022
+ """
1097
1023
  if module in self.deviceDict.keys():
1098
1024
  return
1099
1025
  elif module == 'QIS':
@@ -1105,83 +1031,70 @@ class QisInterface:
1105
1031
  self.deviceDict[module] = [False, 'Stopped', "User hasn't started stream"]
1106
1032
  self.dictSemaphore.release()
1107
1033
 
1108
- def streamInterrupt(self):
1109
- for key in self.deviceDict.keys():
1110
- if self.deviceDict[key][0]:
1111
- return True
1112
- return False
1113
-
1114
- def interruptList(self):
1115
- streamIssueList = []
1116
- for key in self.deviceDict.keys():
1117
- if self.deviceDict[key][0]:
1118
- streamIssue = [key]
1119
- streamIssue.append(self.deviceDict[key][1])
1120
- streamIssue.append(self.deviceDict[key][2])
1121
- streamIssueList.append(streamIssue)
1122
- return streamIssueList
1123
-
1124
- def waitStop(self):
1125
- running = 1
1126
- while running != 0:
1127
- threadNameList = []
1128
- for t1 in threading.enumerate():
1129
- threadNameList.append(t1.name)
1130
- running = 0
1131
- for module in self.deviceList:
1132
- if (module in threadNameList):
1133
- running += 1
1134
- time.sleep(0.5)
1135
- time.sleep(1)
1136
-
1137
- def convertStreamAverage (self, streamAveraging):
1138
- returnValue = 32000;
1139
- if ("k" in streamAveraging):
1140
- returnValue = streamAveraging.replace("k", "000")
1141
- else:
1142
- returnValue = streamAveraging
1034
+ # Pass in a stream header and we check if it is XML or legacy format
1035
+ def is_xml_header (self, header_text) -> bool:
1036
+ """
1037
+ Checks if the given header string is in XML format (as apposed to legacy text format) or an invalid string
1143
1038
 
1144
- return returnValue
1039
+ Args:
1040
+ header_text:
1041
+ The header string to evaluate
1042
+ Returns:
1043
+ True if the header is in XML form
1145
1044
 
1146
- # Pass in a stream header and we check if it is XML or legacy format
1147
- def isXmlHeader (self, headerText):
1148
- if('?xml version=' not in headerText):
1149
- return False;
1045
+ """
1046
+ if '?xml version=' not in header_text:
1047
+ return False
1150
1048
  else:
1151
1049
  return True
1152
1050
 
1153
1051
  # Internal function. Gets the stream header and parses it into useful information
1154
- def getStreamXmlHeader (self, device, sock=None):
1052
+ def get_stream_xml_header (self, device, sock=None) -> ET.Element:
1053
+ """
1054
+ Gets the XML format header from an attached device (which must have run or be running a stream)
1055
+ Parses the string into XML and returns the root element
1056
+
1057
+ Args:
1058
+ device:
1059
+ Device ID to return from
1060
+ sock:
1061
+ Optional QIS socket to use for communication.
1062
+
1063
+ Returns:
1064
+
1065
+ """
1066
+ header_data = None
1067
+
1155
1068
  try:
1156
- if sock == None:
1069
+ if sock is None:
1157
1070
  sock = self.sock
1158
1071
  count = 0
1159
- while(True):
1072
+ while True:
1160
1073
  if count > 5:
1161
1074
  break
1162
1075
  count += 1
1163
1076
  # Get the raw data
1164
- headerData = self.sendAndReceiveText(sock, sentText='stream text header', device=device)
1077
+ header_data = self.send_and_receive_text(sock, send_text='stream text header', device=device)
1165
1078
 
1166
1079
  # Check for no header (no stream started)
1167
- if('Header Not Available' in headerData):
1080
+ if 'Header Not Available' in header_data:
1168
1081
  logging.error(device + ' Stream header not available.' + self.host + ':' + str(self.port))
1169
1082
  continue
1170
1083
 
1171
1084
  # Check for XML format
1172
- if('?xml version=' not in headerData):
1085
+ if '?xml version=' not in header_data:
1173
1086
  logging.error(device + ' Header not in XML form.' + self.host + ':' + str(self.port))
1174
1087
  continue
1175
1088
 
1176
1089
  break
1177
- # Parse XML into structured format
1178
- xml_root = ET.fromstring(headerData)
1090
+ # Parse XML into a structured format
1091
+ xml_root = ET.fromstring(header_data)
1179
1092
 
1180
1093
  # Check header format is supported by quarchpy
1181
- versionStr = xml_root.find('.//version').text
1182
- if ('V3' not in versionStr):
1183
- logging.error(device + ' Stream header version not compatible: ' + xml_root['version'].text + '.' + self.host + ':' + str(self.port))
1184
- raise Exception ("Stream header version not supported");
1094
+ version_str = xml_root.find('.//version').text
1095
+ if 'V3' not in version_str:
1096
+ logging.error(device + ' Stream header version not compatible: ' + xml_root.find('version').text + '.' + self.host + ':' + str(self.port))
1097
+ raise Exception ("Stream header version not supported")
1185
1098
 
1186
1099
  # Return the XML structure for the code to use
1187
1100
  return xml_root
@@ -1190,516 +1103,106 @@ class QisInterface:
1190
1103
  logging.error(device + ' Exception while parsing stream header XML.' + self.host + ':' + str(self.port))
1191
1104
  raise e
1192
1105
 
1193
- def create_dir_structure(self, module, directory=None):
1106
+ def send_command (self, command: str, device: str = '', qis_socket: socket.socket=None, no_cursor_expected: bool=False, no_response_expected: bool=False, command_delay: float=0.0) -> str:
1194
1107
  """
1195
- Creates the QPS directory structure and (empty) files to be written to
1196
-
1197
- I've put a bunch of try-except just to be sure the directory is correctly created.
1198
- ( There's probably a better way of doing this than this )
1199
-
1200
- :param: module: String - Module string
1201
- :param: directory: String - Name of directory for QPS stream (defaults to default recording location if invalid)
1202
- :return: success: Boolean - Was the file structure created successfully?
1108
+ Sends a command and returns the response as a string. Multiple lines are escaped with CRLF.
1109
+ The command is sent to the QIS socket, and depending on the command will be replied by either QIS
1110
+ or the hardware module.
1111
+
1112
+ Args:
1113
+ command:
1114
+ Command string
1115
+ device:
1116
+ Optional Device ID string to send the command to. Use default/blank for QIS direct commands
1117
+ qis_socket:
1118
+ Optional Socket to use for the command, if the default is not wanted
1119
+ no_cursor_expected:
1120
+ Optional Flag true if the command does not return a cursor, so we should not wait for it
1121
+ no_response_expected:
1122
+ Optional Flag true if the command does not return a response, so we should not wait for it.
1123
+ command_delay:
1124
+ Optional delay to prevent commands running in close succession. Timed in seconds.
1125
+ Returns:
1126
+ Command response string or None if no response expected
1203
1127
  """
1204
-
1205
- directory = self.create_qps_directory(directory)
1206
-
1207
- digital_count = 0
1208
- non_dig_counter = 0
1209
- self.streamGroups = StreamGroups()
1210
- for index, i in enumerate(self.module_xml_header.findall('.//channels')):
1211
- self.streamGroups.add_group(index)
1212
- for item in i.findall('.//channel'):
1213
- self.streamGroups.groups[index].add_channel(item.find(".//name"), item.find(".//group"), item.find(".//dataPosition"))
1214
- if item.find(".//group").text == "Digital":
1215
- digital_count += 1
1216
- self.has_digitals = True
1217
- else:
1218
- non_dig_counter += 1
1219
-
1220
- # Inner folders for analogue and digital signals streaming
1221
- in_folder_analogue = "data000"
1222
- try:
1223
- inner_path_analogues = os.path.join(directory, in_folder_analogue)
1224
- os.mkdir(inner_path_analogues)
1225
- except:
1226
- logging.warning("Failed to make inner directory for analogue signals " + inner_path_analogues)
1227
- return False
1228
-
1229
- in_folder_digitals = "data101"
1230
- if self.has_digitals:
1231
- try:
1232
- inner_path_digitals = os.path.join(directory, in_folder_digitals)
1233
- os.mkdir(inner_path_digitals)
1234
- except:
1235
- logging.warning("Failed to make inner directory for digital signals "+ inner_path_digitals)
1236
- return False
1237
-
1238
- logging.debug("Steaming to : " + self.qps_record_dir_path)
1239
-
1240
- logging.debug("Creating qps data files")
1241
- try:
1242
- for i in range(non_dig_counter):
1243
- file_name = "data000_00"+i+"_000000000"
1244
- f = open(os.path.join(inner_path_analogues, file_name), "w")
1245
- f.close()
1246
- for i in range(digital_count):
1247
- x = i
1248
- while len(str(x)) < 3:
1249
- x = "0" + str(x)
1250
- file_name = "data101_"+x+"_000000000"
1251
- f = open(os.path.join(inner_path_digitals, file_name), "w")
1252
- f.close()
1253
- except:
1254
- logging.warning("failed to create qps data files for analogue signals")
1255
- return False
1256
-
1257
- logging.debug("Finished creating qps data files")
1258
-
1259
- logging.debug("Creating qps upper level files")
1260
- try:
1261
- file_names = ["annotations.xml", "notes.txt", "triggers.txt"]
1262
- for file_nome in file_names:
1263
- f = open(os.path.join(self.qps_record_dir_path, file_nome), "w")
1264
- f.close()
1265
- except Exception as err:
1266
- logging.warning("failed to create qps upper level files, "+err)
1267
- return False
1268
-
1269
- try:
1270
- # Adding data000.idx separate as it's written in bytes not normal text
1271
- f = open(os.path.join(self.qps_record_dir_path, "data000.idx"), "wb")
1272
- f.close()
1273
- if digital_count > 0:
1274
- f = open(os.path.join(self.qps_record_dir_path, "data101.idx"), "wb")
1275
- f.close()
1276
- except Exception as err:
1277
- logging.warning("failed to create data000.idx file, "+err)
1278
- return False
1279
-
1280
- logging.debug("Finished creating QPS dir structure")
1281
-
1282
- return True
1283
-
1284
- def create_qps_directory(self, directory):
1285
- folder_name = None
1286
- # Checking if there was a directory passed; and if it's a valid directory
1287
- if not directory:
1288
- directory = os.path.join(os.path.expanduser("~"), "AppData", "Local", "Quarch", "QPS", "Recordings")
1289
- logging.debug("No directory specified")
1290
- elif not os.path.isdir(directory):
1291
- new_dir = os.path.join(str(os.path.expanduser("~"), "AppData", "Local", "Quarch", "QPS", "Recordings"))
1292
- logging.warning(directory+" was not a valid directory, streaming to default location: \n"+new_dir)
1293
- directory = new_dir
1128
+ if no_response_expected:
1129
+ self.send_text(qis_socket, command, device)
1130
+ return ""
1294
1131
  else:
1295
- # Split the directory into a path of folders
1296
- folder_name = str(directory).split(os.sep)
1297
- # last folder name is the name we want
1298
- folder_name = folder_name[-1]
1299
- # Make it known to the entire class that the path we're streaming to is the one sent across by the user
1300
- self.qps_record_dir_path = directory
1301
-
1302
- # If no folder name for the stream was passed, then default to 'quarchpy_recording' and a timestamp
1303
- if not folder_name:
1304
- folder_name = "quarchpy_recording"
1305
- folder_name = folder_name + "-" + time.time()
1306
- path = os.path.join(directory, self.qps_stream_folder_name)
1307
- os.mkdir(path)
1308
- self.qps_record_dir_path = path
1309
-
1310
- self.qps_stream_folder_name = folder_name
1311
-
1312
- return directory
1313
-
1314
- def create_index_file(self):
1315
- """
1316
- Create the necessary index file for QPS data000.idx
1317
-
1318
- For future revisions, this should be updated if there are file limits on each data file
1319
- Current implementation assumes only 1 of each data file are made.
1320
-
1321
- No Return./
1322
- """
1323
-
1324
- stream_header_size = -1
1325
-
1326
- my_byte_array = []
1327
-
1328
- # tree = ET.ElementTree(ET.fromstring(self.module_xml_header[:-1]))
1329
- tree = self.module_xml_header
1330
-
1331
- return_b_array = []
1332
- outBuffer = []
1333
- x = 20
1334
- stream_header_size = 20
1335
-
1336
- temp_dict = {"channels": 0}
1337
-
1338
- return_b_array, stream_header_size = self.add_header_to_byte_array(return_b_array, stream_header_size,
1339
- temp_dict, tree, is_digital=False)
1340
-
1341
- self.add_header_to_buffer(outBuffer, return_b_array, stream_header_size, temp_dict)
1342
-
1343
- # Attempting to read the size of the first file in data files
1344
- file = os.path.join(self.qps_record_dir_path, "data000", "data000_000_000000000")
1345
- data = None
1346
- with open(file, "rb") as f:
1347
- data = f.read() # if you only wanted to read 512 bytes, do .read(512)
1348
-
1349
- if not data:
1350
- raise "No data written to file"
1351
-
1352
- num_records = len(data) / 8
1353
- logging.debug("num_record = " + num_records)
1354
- return_b_array.append(int(num_records).to_bytes(4, byteorder='big'))
1355
-
1356
- start_number = 0
1357
- logging.debug("start_record = " + start_number)
1358
- return_b_array.append(start_number.to_bytes(8, byteorder='big'))
1359
-
1360
- num_records = num_records - 1
1361
- logging.debug("last_Record_number = "+num_records)
1362
- return_b_array.append(int(num_records).to_bytes(8, byteorder='big'))
1363
-
1364
- # Add names of every file in data000 dir here.
1365
- files = os.listdir(os.path.join(self.qps_record_dir_path, "data000"))
1366
- for file3 in files:
1367
- # print(file)
1368
- item = strToBb(file3, False)
1369
- # print(item)
1370
- while len(item) < 32:
1371
- item.append("\x00")
1372
- # print(item)
1373
- return_b_array.append(item)
1374
-
1375
- with open(os.path.join(self.qps_record_dir_path, "data000.idx"), "ab") as f:
1376
- for item in outBuffer:
1377
- # print(item)
1378
- # print(type(item))
1379
- f.write(bytes(item))
1380
- # f.write(outBuffer)
1381
-
1382
- with open(os.path.join(self.qps_record_dir_path, "data000.idx"), "ab") as f:
1383
- self.write_b_array_to_idx_file(f, return_b_array)
1384
-
1385
- def create_index_file_digitals(self):
1386
- """
1387
- Create the necessary index file for QPS data101.idx
1388
-
1389
- For future revisions, this should be updated if there are file limits on each data file
1390
- Current implementation assumes only 1 of each data file are made.
1391
-
1392
- No Return.
1393
- """
1394
-
1395
- stream_header_size = -1
1396
- my_byte_array = []
1397
- tree = self.module_xml_header
1398
- return_b_array = []
1399
- outBuffer = []
1400
- temp_dict = {}
1401
-
1402
- return_b_array, stream_header_size = self.add_header_to_byte_array(return_b_array, stream_header_size,
1403
- temp_dict, tree, is_digital=True)
1404
-
1405
- self.add_header_to_buffer(outBuffer, return_b_array, stream_header_size, temp_dict)
1406
-
1407
- # Attempting to read the size of the first file in data files
1408
- file = os.path.join(self.qps_record_dir_path, "data101", "data101_000_000000000")
1409
- data = None
1410
- with open(file, "rb") as f:
1411
- data = f.read() # if you only wanted to read 512 bytes, do .read(512)
1412
-
1413
- if not data:
1414
- raise "No data written to file"
1415
-
1416
- num_records = len(data) / 8
1417
- logging.debug("num_record = "+ num_records)
1418
- return_b_array.append(int(num_records).to_bytes(4, byteorder='big'))
1419
-
1420
- start_number = 0
1421
- logging.debug("start_record = "+start_number)
1422
- return_b_array.append(start_number.to_bytes(8, byteorder='big'))
1423
-
1424
- num_records = num_records - 1
1425
- logging.debug("last_Record_number = "+ num_records)
1426
- return_b_array.append(int(num_records).to_bytes(8, byteorder='big'))
1427
-
1428
- # Add names of every file in data000 dir here.
1429
- files = os.listdir(os.path.join(self.qps_record_dir_path, "data101"))
1430
- for file3 in files:
1431
- # print(file)
1432
- item = strToBb(file3, False)
1433
- # print(item)
1434
- while len(item) < 32:
1435
- item.append("\x00")
1436
- # print(item)
1437
- return_b_array.append(item)
1438
-
1439
- with open(os.path.join(self.qps_record_dir_path, "data101.idx"), "ab") as f:
1440
- for item in outBuffer:
1441
- f.write(bytes(item))
1442
-
1443
- with open(os.path.join(self.qps_record_dir_path, "data101.idx"), "ab") as f:
1444
- self.write_b_array_to_idx_file(f, return_b_array)
1445
-
1446
- def add_header_to_byte_array(self, return_b_array, stream_header_size, temp_dict, tree, is_digital=False):
1447
- for element in tree:
1448
- if "legacyVersion" in element.tag:
1449
- intItem = element.text
1450
- temp_dict[element.tag] = intItem
1451
- # my_byte_array.append(int.to_bytes(intItem, 'big'))
1452
- if "legacyAverage" in element.tag:
1453
- intItem = element.text
1454
- temp_dict[element.tag] = intItem
1455
- # my_byte_array.append(int.to_bytes(intItem, 'big'))
1456
- if "legacyFormat" in element.tag:
1457
- intItem = element.text
1458
- temp_dict[element.tag] = intItem
1459
- # my_byte_array.append(int.to_bytes(intItem, 'big'))
1460
- if "mainPeriod" in element.tag:
1461
- intItem = element.text
1462
- intItem = intItem[:-2]
1463
- temp_dict[element.tag] = intItem
1464
- if "channels" in element.tag:
1465
- counter = 0
1466
- for child in element:
1467
- for child2 in child:
1468
- if "group" in child2.tag:
1469
- if is_digital:
1470
- if str(child2.text).lower() == "digital":
1471
- counter += 1
1472
- else:
1473
- if str(child2.text).lower() != "digital":
1474
- counter += 1
1475
-
1476
- temp_dict[element.tag] = counter
1477
-
1478
- return_b_array = []
1479
-
1480
- stream_header_size = 20
1481
-
1482
- # Cycle through all the channels.
1483
- for child in element:
1484
-
1485
- if child.tag == "groupId":
1486
- continue
1487
-
1488
- if is_digital:
1489
- # skip channel if we're only looking for digitals
1490
- if not str(child.find(".//group").text).lower() == "digital":
1491
- continue
1492
- else:
1493
- # skip if we're looking for analogues
1494
- if str(child.find(".//group").text).lower() == "digital":
1495
- continue
1496
-
1497
- # my_byte_array.append(int.to_bytes(5, 'big'))
1498
- return_b_array.append(int(5).to_bytes(4, byteorder='big'))
1499
- stream_header_size += 4
1500
- name = None
1501
-
1502
- for child2 in child:
1503
-
1504
- if "group" in child2.tag:
1505
- my_byte_array = strToBb(str(child2.text))
1506
- return_b_array.append(my_byte_array)
1507
- # QPS index file requires name tag come after group tag.
1508
- return_b_array.append(name)
1509
- stream_header_size += len(my_byte_array)
1510
-
1511
- if "name" in child2.tag:
1512
- my_byte_array = strToBb(str(child2.text))
1513
- name = my_byte_array
1514
- stream_header_size += len(my_byte_array)
1515
-
1516
- if "units" in child2.tag:
1517
- my_byte_array = strToBb(str(child2.text))
1518
- return_b_array.append(my_byte_array)
1519
- stream_header_size += len(my_byte_array)
1520
-
1521
- """
1522
- # Unclear if the only thing here is TRUE
1523
- bb = strToBB( Boolean.toString( cdr.isUsePrefixStr() ));
1524
- bbList.add(bb);
1525
- retVal += bb.capacity();
1526
- """
1527
- my_byte_array = strToBb(str("true"))
1528
- return_b_array.append(my_byte_array)
1529
- stream_header_size += len(my_byte_array)
1530
-
1531
- if "maxTValue" in child2.tag:
1532
- my_byte_array = strToBb(str(child2.text))
1533
- return_b_array.append(my_byte_array)
1534
- stream_header_size += len(my_byte_array)
1535
-
1536
- return return_b_array, stream_header_size
1537
-
1538
- def add_header_to_buffer(self, outBuffer, return_b_array, stream_header_size, temp_dict):
1539
- number = 2
1540
- outBuffer.append(number.to_bytes(4, byteorder='big'))
1541
- logging.debug("indexVersion : "+ number)
1542
-
1543
- number = 1 if self.has_digitals else 0
1544
- outBuffer.append(number.to_bytes(4, byteorder='big'))
1545
- logging.debug("value0 : "+ number)
1546
- number = stream_header_size
1547
- outBuffer.append(number.to_bytes(4, byteorder='big'))
1548
- logging.debug("header_size : "+number)
1549
- logging.debug("legacyVersion : "+ temp_dict['legacyVersion'])
1550
- outBuffer.append(int(temp_dict["legacyVersion"]).to_bytes(4, byteorder='big'))
1551
- logging.debug("legacyAverage : " + temp_dict['legacyAverage'])
1552
- outBuffer.append(int(temp_dict["legacyAverage"]).to_bytes(4, byteorder='big'))
1553
- logging.debug("legacyFormat : "+temp_dict['legacyFormat'])
1554
- outBuffer.append(int(temp_dict["legacyFormat"]).to_bytes(4, byteorder='big'))
1555
- logging.debug("mainPeriod : "+temp_dict['mainPeriod'])
1556
- outBuffer.append(int(temp_dict["mainPeriod"]).to_bytes(4, byteorder='big'))
1557
- logging.debug("channels : "+temp_dict['channels'])
1558
- outBuffer.append(int(temp_dict["channels"]).to_bytes(4, byteorder='big'))
1559
- return_b_array.append(int(self.qps_record_start_time).to_bytes(8, byteorder='big'))
1560
- index_record_state = True
1561
- logging.debug(int(1))
1562
- return_b_array.append(int(1).to_bytes(1, byteorder='big'))
1563
- record_type = 1
1564
- logging.debug("record type : "+int(index_record_state))
1565
- return_b_array.append(int(record_type).to_bytes(1, byteorder='big'))
1566
-
1567
- def write_b_array_to_idx_file(self, f, return_b_array):
1568
- # print(return_b_array)
1569
- for item in return_b_array:
1570
- # print(item)
1571
- if isinstance(item, int):
1572
- # 'f.write(str(item).encode())
1573
- # print(item)
1574
- f.write(bytes([item]))
1575
- continue
1576
- if isinstance(item, bytes):
1577
- # print(item)
1578
- f.write(bytes(item))
1579
- continue
1580
- if isinstance(item, list):
1581
- for character in item:
1582
- if isinstance(character, int):
1583
- f.write(bytes([character]))
1584
- continue
1585
- elif isinstance(item, bytes):
1586
- f.write(item)
1587
- continue
1588
- else:
1589
- f.write(str(character).encode())
1590
- continue
1591
-
1592
- def create_qps_file(self, module):
1593
- """
1594
- Creates the end QPS file that is used to open QPS
1595
-
1596
- :param module: Module QTL number that was used for the stream
1597
- :return:
1598
- """
1599
-
1600
- with open(os.path.join(self.qps_record_dir_path, self.qps_stream_folder_name + ".qps"), "w") as f:
1601
- x = datetime.datetime.fromtimestamp(self.qps_record_start_time / 1000.0)
1602
- x = str(x).split(".")
1603
- x = x[0]
1604
- x = x.replace("-", " ")
1605
- f.write("Started: "+x+"\n")
1606
- f.write("Device: " + module + "\n")
1607
- f.write("Fixture: \n")
1608
-
1609
- x = datetime.datetime.now()
1610
- x = str(x).split(".")
1611
- x = x[0]
1612
- x = x.replace("-", " ")
1613
- f.write("Saved: "+x+ "\n")
1614
-
1615
-
1616
- def sendCommand(self, cmd, device="", timeout=20,sock=None,readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse=True):
1617
- '''Send command is used to send a command to QIS and as far as I can see it has no difference than sendAndReceiveCmd'''
1618
- if expectedResponse is True:
1619
- if sock == None:
1620
- sock = self.sock
1132
+ if qis_socket is None:
1133
+ qis_socket = self.sock
1621
1134
  if not (device == ''):
1622
- self.deviceDictSetup(device)
1623
- res = self.sendAndReceiveText(sock, cmd, device, readUntilCursor)
1624
- if (betweenCommandDelay > 0):
1625
- time.sleep(betweenCommandDelay)
1135
+ self.device_dict_setup(device)
1136
+ res = self.send_and_receive_text(qis_socket, command, device, not no_cursor_expected)
1626
1137
 
1627
- # If ends with cursor get rid of it
1138
+ # This is a poor sleep mechanism! Better would be to track time since the last command
1139
+ if command_delay > 0:
1140
+ time.sleep(command_delay)
1141
+
1142
+ # Trim the expected cursor at the end of the response
1628
1143
  if res[-3:] == '\r\n>':
1629
1144
  res = res[:-3] # remove last three chars - '\r\n>'
1630
1145
  elif res[-2:] == '\n>':
1631
1146
  res = res[:-2] # remove last 2 chars - '\n>'
1632
1147
  return res
1633
1148
 
1634
- else :
1635
- self.sendText(sock, cmd, device)
1636
- return
1637
-
1638
- # when sending commands to module (as opposed to back end)
1639
- # If read until cursor is set to True (which is default) then keep reading response until a cursor is returned as the last character of result string
1640
- # After command is sent wait for betweenCommandDelay which defaults to 0 but can be specified to add a delay between commands
1641
- # The objects connection needs to be opened (connect()) before this is used
1642
- def sendCmd(self, device='', cmd='$help', sock=None, readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse = True):
1643
- '''Send command is used to send a command to QIS and as far as I can see it has no difference than sendAndReceiveCmd'''
1644
- if expectedResponse is True:
1645
- res = self.sendAndReceiveCmd(device=device, cmd=cmd, sock=sock, readUntilCursor=readUntilCursor, betweenCommandDelay=betweenCommandDelay)
1646
- #If ends with cursor get rid of it
1647
- if res[-1:] == self.cursor:
1648
- res = res[:-3] #remove last three chars - hopefully '\r\n>'
1649
- return res
1650
- else :
1651
- self.sendText(sock, cmd, device)
1652
- return
1149
+ def send_and_receive_text(self, sock, send_text='$help', device='', read_until_cursor=True) -> str:
1150
+ """
1151
+ Internal function for command handling. This handles complex cases such as timeouts and XML
1152
+ response formatting, which conflicts with the default cursor
1153
+
1154
+ Args:
1155
+ sock:
1156
+ The socket to communicate over
1157
+ send_text:
1158
+ The command text to send
1159
+ device:
1160
+ Optional device ID to send the command to
1161
+ read_until_cursor:
1162
+ Flag to indicate if we should read until the cursor is returned
1163
+
1164
+ Returns:
1165
+ Response string from the module
1166
+ """
1653
1167
 
1654
- def sendAndReceiveCmd(self, sock=None, cmd='$help', device='', readUntilCursor=True, betweenCommandDelay=0.0):
1655
- if sock==None:
1656
- sock = self.sock
1657
- if not (device == ''):
1658
- self.deviceDictSetup(device)
1659
- res = self.sendAndReceiveText(sock, cmd, device, readUntilCursor)
1660
- if (betweenCommandDelay > 0):
1661
- time.sleep(betweenCommandDelay)
1662
- #If ends with cursor get rid of it
1663
- if res[-1:] == '>':
1664
- res = res[:-3] #remove last three chars - hopefully '\r\n>'
1665
- return cmd + ' : ' + res
1666
-
1667
- def sendAndReceiveText(self, sock, sentText='$help', device='', readUntilCursor=True):
1668
- # Send text to QIS
1669
- # The objects connection needs to be opened (connect()) before this is used
1670
- # If read until cursor is set to True (which is default) then keep reading response until a cursor is returned as the last character of result string
1671
-
1672
- # do sendText
1168
+ # Avoid multiple threads trying to send at once. QIS only has a single socket for all devices
1673
1169
  self.sockSemaphore.acquire()
1674
1170
  try:
1675
- #Send Text
1676
- self.sendText(sock, sentText, device)
1677
- #Receive Response
1678
- res = self.receiveText(sock)
1679
- # Error Check / validate response
1171
+ # Send the command
1172
+ self.send_text(sock, send_text, device)
1173
+ # Receive Response
1174
+ res = self.receive_text(sock)
1175
+ # If we get no response, log an error and try to flush using a simple stream query command
1176
+ # If that works, we retry our command. In fail cases we raise an exception and abort as
1177
+ # the connection is bad
1680
1178
  if len(res) == 0:
1681
- #logging.error("Empty response from QIS.")
1682
- self.sendText(sock, "stream?", device)
1683
- res = self.receiveText(sock)
1179
+ logging.error("Empty response from QIS for cmd: " + send_text + ". To device: " + device)
1180
+ self.send_text(sock, "stream?", device)
1181
+ res = self.receive_text(sock)
1684
1182
  if len(res) != 0:
1685
- self.sendText(sock, sentText, device)
1686
- res = self.receiveText(sock)
1183
+ self.send_text(sock, send_text, device)
1184
+ res = self.receive_text(sock)
1687
1185
  if len(res) == 0:
1688
- raise (Exception("Empty response from QIS. Sent: " + sentText))
1186
+ raise (Exception("Empty response from QIS. Sent: " + send_text))
1689
1187
  else:
1690
- raise (Exception("Empty response from QIS. Sent: " + sentText))
1188
+ raise (Exception("Empty response from QIS. Sent: " + send_text))
1691
1189
 
1692
1190
  if res[0] == self.cursor:
1693
- logging.warning('Only returned a cursor from QIS. Sent: ' + sentText)
1191
+ logging.error('Only returned a cursor from QIS. Sent: ' + send_text)
1192
+ raise (Exception("Only returned a cursor from QIS. Sent: " + send_text))
1694
1193
  if 'Create Socket Fail' == res[0]: # If create socked fail (between QIS and tcp/ip module)
1695
- logging.warning(res[0])
1194
+ logging.error(res[0])
1195
+ raise (Exception("Failed to open QIS to module socked. Sent: " + send_text))
1696
1196
  if 'Connection Timeout' == res[0]:
1697
- logging.warning(res[0])
1698
- # If reading until a cursor comes back then keep reading until a cursor appears or max tries exceeded
1699
- if readUntilCursor:
1700
- import xml.etree.ElementTree as ET
1197
+ logging.error(res[0])
1198
+ raise (Exception("Connection timeout from QIS. Sent: " + send_text))
1199
+
1200
+ # If reading until a cursor comes back, then keep reading until a cursor appears or max tries exceeded
1201
+ # Because large XML responses are possible, we need to validate them as complete before looking
1202
+ # for a final cursor
1203
+ if read_until_cursor:
1701
1204
 
1702
- maxReads = 1000
1205
+ max_reads = 1000
1703
1206
  count = 1
1704
1207
  is_xml = False
1705
1208
 
@@ -1726,111 +1229,255 @@ class QisInterface:
1726
1229
  break
1727
1230
 
1728
1231
  # Receive more data
1729
- res += self.receiveText(sock)
1232
+ res += self.receive_text(sock)
1730
1233
 
1731
1234
  # Increment count and check for max reads
1732
1235
  count += 1
1733
- if count >= maxReads:
1236
+ if count >= max_reads:
1734
1237
  raise Exception('Count = Error: max reads exceeded before response was complete')
1735
1238
 
1736
1239
  return res
1737
1240
 
1738
1241
  except Exception as e:
1739
- #something went wrong during send qis cmd
1740
- logging.error("Error! Unable to retrieve response from QIS. Command: " + sentText)
1242
+ # Something went wrong during send qis cmd
1243
+ logging.error("Error! Unable to retrieve response from QIS. Command: " + send_text)
1741
1244
  logging.error(e)
1742
1245
  raise e
1743
1246
  finally:
1744
1247
  self.sockSemaphore.release()
1745
1248
 
1249
+ def receive_text(self, sock) -> str:
1250
+ """
1251
+ Received bytes from the socket and converts to a test string
1252
+ Args:
1253
+ sock:
1254
+ Socket to communicate over
1255
+
1256
+ Returns:
1257
+
1258
+ """
1259
+ res = bytearray()
1260
+ res.extend(self.rx_bytes(sock))
1261
+ res = res.decode()
1746
1262
 
1747
- def receiveText(self, sock):
1748
- if self.pythonVersion == '3':
1749
- res = bytearray()
1750
- res.extend(self.rxBytes(sock))
1751
- res = res.decode()
1752
- else:
1753
- res = self.rxBytes(sock)
1754
1263
  return res
1755
1264
 
1756
- def sendText(self, sock, message='$help', device=''):
1757
- # Send text to QIS, don't read it's response
1758
- # The objects connection needs to be opened (connect()) before this is used
1265
+ def send_text(self, sock, message='$help', device='') -> bool:
1266
+ """
1267
+
1268
+ Args:
1269
+ sock:
1270
+ Socket to communicate over
1271
+ message:
1272
+ text command to send
1273
+ device:
1274
+ Optional device ID to target with the command
1275
+
1276
+ Returns:
1277
+
1278
+ """
1279
+ # Send text to QIS, don't read its response
1759
1280
  if device != '':
1760
- #specialTimeout = '%500000'
1761
- #message = device + ' ' + specialTimeout + ' ' + message
1762
1281
  message = device + ' ' + message
1763
- #printText('Sending: "' + message + '" ' + self.host + ':' + str(self.port))
1764
1282
 
1765
- if self.pythonVersion == 2:
1766
- sock.sendall(message + '\r\n')
1767
- else:
1768
- convM = message + '\r\n'
1769
- sock.sendall(convM.encode('utf-8'))
1770
- return 'Sent:' + message
1771
-
1772
- def rxBytes(self,sock):
1773
- #sock.setblocking(0) #make socket non-blocking
1774
- #printText('rxBytes')
1775
- maxExceptions=10
1283
+ conv_mess = message + '\r\n'
1284
+ sock.sendall(conv_mess.encode('utf-8'))
1285
+ return True
1286
+
1287
+ def rx_bytes(self,sock) -> bytes:
1288
+ """
1289
+ Reads an array of bytes from the socket as part of handling a command response
1290
+
1291
+ Args:
1292
+ sock:
1293
+ Socket to communicate over
1294
+ Returns:
1295
+ Bytes read
1296
+
1297
+ """
1298
+
1299
+ max_exceptions=10
1776
1300
  exceptions=0
1777
- maxReadRepeats=50
1778
- readRepeats=0
1301
+ max_read_repeats=50
1302
+ read_repeats=0
1779
1303
  timeout_in_seconds = 10
1780
- #Keep trying to read bytes until we get some, unless number of read repeads or exceptions is exceeded
1304
+
1305
+ #Keep trying to read bytes until we get some, unless the number of read repeats or exceptions is exceeded
1781
1306
  while True:
1782
1307
  try:
1783
- #select.select returns a list of waitable objects which are ready. On windows it has to be sockets.
1784
- #The first arguement is a list of objects to wait for reading, second writing, third 'exceptional condition'
1785
- #We only use the read list and our socket to check if it is readable. if no timeout is specified then it blocks until it becomes readable.
1308
+ # Select.select returns a list of waitable objects which are ready. On Windows, it has to be sockets.
1309
+ # The first argument is a list of objects to wait for reading, second writing, third 'exceptional condition'
1310
+ # We only use the read list and our socket to check if it is readable. if no timeout is specified,
1311
+ # then it blocks until it becomes readable.
1312
+ # TODO: AN: It is very unclear why we try to open a new socket if data is not ready.
1313
+ # This would seem like a hard failure case!
1786
1314
  ready = select.select([sock], [], [], timeout_in_seconds)
1787
- #time.sleep(0.1)
1788
- #ready = [1,2]
1789
1315
  if ready[0]:
1790
1316
  ret = sock.recv(self.maxRxBytes)
1791
- #time.sleep(0.1)
1792
1317
  return ret
1318
+ # If the socket is not ready for read, open a new one
1793
1319
  else:
1794
- #printText('rxBytes - readRepeats + 1')
1795
-
1320
+ logging.error("Timeout: No bytes were available to read from QIS")
1321
+ logging.debug("Opening new QIS socket")
1796
1322
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1797
1323
  sock.connect((self.host, self.port))
1798
1324
  sock.settimeout(5)
1799
1325
 
1800
1326
  try:
1801
- welcomeString = self.sock.recv(self.maxRxBytes).rstrip()
1802
- welcomeString = 'Connected@' + self.host + ':' + str(self.port) + ' ' + '\n ' + welcomeString
1803
- printText('New Welcome:' + welcomeString)
1327
+ welcome_string = self.sock.recv(self.maxRxBytes).rstrip()
1328
+ welcome_string = 'Connected@' + self.host + ':' + str(self.port) + ' ' + '\n ' + welcome_string
1329
+ logging.debug("Socket opened: " + welcome_string)
1804
1330
  except Exception as e:
1805
- logging.error('tried and failed to get new welcome')
1331
+ logging.error('Timeout: Failed to open new QIS socket and get the welcome message')
1806
1332
  raise e
1807
1333
 
1808
- readRepeats=readRepeats+1
1334
+ read_repeats=read_repeats+1
1809
1335
  time.sleep(0.5)
1810
1336
 
1811
1337
  except Exception as e:
1812
- #printText('rxBytes - exceptions + 1')
1813
- exceptions=exceptions+1
1814
- time.sleep(0.5)
1815
1338
  raise e
1816
1339
 
1817
- #If read repeats has been exceeded we failed to get any data on this read.
1818
- # !!! This is likely to break whatever called us !!!
1819
- if readRepeats >= maxReadRepeats:
1820
- logging.error('Max read repeats exceeded - returning.')
1821
- return 'No data received from QIS'
1822
- #If number of exceptions exceeded then give up by exiting
1823
- if exceptions >= maxExceptions:
1824
- logging.error('Max exceptions exceeded - exiting') #exceptions are probably 10035 non-blocking socket could not complete immediatley
1825
- exit()
1826
-
1827
-
1828
- def strToBb(string_in, add_length=True):
1829
- length = len(str(string_in))
1830
- b_array = []
1831
- if add_length:
1832
- b_array.append(length)
1833
- for character in str(string_in):
1834
- b_array.append(character)
1835
-
1836
- return b_array
1340
+ # If we read no data, its probably an error, but there may be cases where an empty response is valid
1341
+ if read_repeats >= max_read_repeats:
1342
+ logging.error('Max read repeats exceeded')
1343
+ return b''
1344
+
1345
+ def closeConnection(self, sock=None, conString: str=None) -> str:
1346
+ """
1347
+ deprecated:: 2.2.13
1348
+ Use `close_connection` instead.
1349
+ """
1350
+ return self.close_connection (sock=sock, con_string=conString)
1351
+
1352
+ def startStream(self, module: str, fileName: str, fileMaxMB: int, releaseOnData: bool, separator: str,
1353
+ streamDuration: int = None, inMemoryData=None, outputFileHandle=None, useGzip: bool = None):
1354
+ """
1355
+ deprecated:: 2.2.13
1356
+ Use `start_stream` instead.
1357
+ """
1358
+ return self.start_stream(module, fileName, fileMaxMB, releaseOnData, separator, streamDuration, inMemoryData, outputFileHandle, useGzip)
1359
+
1360
+ def stopStream(self, module, blocking=True):
1361
+ """
1362
+ deprecated:: 2.2.13
1363
+ Use `stop_stream` instead.
1364
+ """
1365
+ return self.stop_stream(module, blocking)
1366
+
1367
+ def getDeviceList(self, sock=None):
1368
+ """
1369
+ deprecated:: 2.2.13
1370
+ Use `start_stream_thread_qps` instead.
1371
+ """
1372
+ return self.get_device_list(sock)
1373
+
1374
+ def scanIP(self, QisConnection, ipAddress):
1375
+ """
1376
+ deprecated:: 2.2.13
1377
+ Use `scan_ip` instead.
1378
+ """
1379
+ return self.scan_ip(QisConnection, ipAddress)
1380
+
1381
+ def GetQisModuleSelection(self, favouriteOnly=True, additionalOptions=['rescan', 'all con types', 'ip scan'],
1382
+ scan=True):
1383
+ """
1384
+ deprecated:: 2.2.13
1385
+ Use `get_qis_module_selection` instead.
1386
+ """
1387
+ return self.get_qis_module_selection(favouriteOnly, additionalOptions, scan)
1388
+
1389
+ def sendCommand(self, cmd, device="", timeout=20,sock=None,readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse=True) -> str:
1390
+ """
1391
+ deprecated:: 2.2.13
1392
+ Use `send_command` instead.
1393
+ """
1394
+ return self.send_command(cmd, device, sock, False, not expectedResponse, betweenCommandDelay)
1395
+
1396
+ def sendCmd(self, device='', cmd='$help', sock=None, readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse = True) -> str:
1397
+ """
1398
+ deprecated:: 2.2.13
1399
+ Use `send_command` instead.
1400
+ """
1401
+ return self.send_command(cmd, device, sock, not readUntilCursor, not expectedResponse, betweenCommandDelay)
1402
+
1403
+ def sendAndReceiveCmd(self, sock=None, cmd='$help', device='', readUntilCursor=True, betweenCommandDelay=0.0) -> str:
1404
+ """
1405
+ deprecated:: 2.2.13
1406
+ Use `send_command` instead.
1407
+ """
1408
+ return self.send_command(cmd, device, sock, not readUntilCursor, no_response_expected=False, command_delay=betweenCommandDelay)
1409
+
1410
+ def streamRunningStatus(self, device: str) -> str:
1411
+ """
1412
+ deprecated:: 2.2.13
1413
+ Use `stream_running_status` instead.
1414
+ """
1415
+ return self.stream_running_status(device)
1416
+
1417
+ def streamHeaderFormat(self, device, sock=None) -> str:
1418
+ """
1419
+ deprecated:: 2.2.13
1420
+ Use `stream_header_format` instead.
1421
+ """
1422
+ return self.stream_header_format(device, sock)
1423
+
1424
+ def streamInterrupt(self) -> bool:
1425
+ """
1426
+ deprecated:: 2.2.13
1427
+ No indication this is used anywhere
1428
+ """
1429
+ for key in self.deviceDict.keys():
1430
+ if self.deviceDict[key][0]:
1431
+ return True
1432
+ return False
1433
+
1434
+ def interruptList(self):
1435
+ """
1436
+ deprecated:: 2.2.13
1437
+ No indication this is used anywhere
1438
+ """
1439
+ streamIssueList = []
1440
+ for key in self.deviceDict.keys():
1441
+ if self.deviceDict[key][0]:
1442
+ streamIssue = [key]
1443
+ streamIssue.append(self.deviceDict[key][1])
1444
+ streamIssue.append(self.deviceDict[key][2])
1445
+ streamIssueList.append(streamIssue)
1446
+ return streamIssueList
1447
+
1448
+ def waitStop(self):
1449
+ """
1450
+ deprecated:: 2.2.13
1451
+ No indication this is used anywhere
1452
+ """
1453
+ running = 1
1454
+ while running != 0:
1455
+ threadNameList = []
1456
+ for t1 in threading.enumerate():
1457
+ threadNameList.append(t1.name)
1458
+ running = 0
1459
+ for module in self.deviceList:
1460
+ if (module in threadNameList):
1461
+ running += 1
1462
+ time.sleep(0.5)
1463
+ time.sleep(1)
1464
+
1465
+ def convertStreamAverage (self, streamAveraging):
1466
+ """
1467
+ deprecated:: 2.2.13
1468
+ No indication this is used anywhere
1469
+ """
1470
+ returnValue = 32000
1471
+ if ("k" in streamAveraging):
1472
+ returnValue = streamAveraging.replace("k", "000")
1473
+ else:
1474
+ returnValue = streamAveraging
1475
+
1476
+ return returnValue
1477
+
1478
+ def sendAndReceiveText(self, sock, sendText='$help', device='', readUntilCursor=True) -> str:
1479
+ """
1480
+ deprecated:: 2.2.13
1481
+ Use `send_and_receive_text` instead.
1482
+ """
1483
+ return self.send_and_receive_text(sock, send_text=sendText, device=device, read_until_cursor=readUntilCursor)