rubyfox-server 2.13.7.3 → 2.16.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (613) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -1
  3. data/README.md +19 -0
  4. data/lib/rubyfox/server/cli.rb +39 -5
  5. data/lib/rubyfox/server/data/config/UploadsLock.txt +1 -1
  6. data/lib/rubyfox/server/data/config/admin/admintool.xml +1 -0
  7. data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +97 -43
  8. data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +307 -93
  9. data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +311 -95
  10. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_game.txt +5 -5
  11. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_mmo.txt +6 -6
  12. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +69 -44
  13. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +55 -43
  14. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_zone.txt +81 -36
  15. data/lib/rubyfox/server/data/config/admin/gmc/gmc.py +55 -18
  16. data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
  17. data/lib/rubyfox/server/data/config/admin/icons/Analytics.svg +1 -0
  18. data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
  19. data/lib/rubyfox/server/data/config/admin/icons/BanManager.svg +1 -0
  20. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
  21. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.svg +1 -0
  22. data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
  23. data/lib/rubyfox/server/data/config/admin/icons/Console.svg +9 -0
  24. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
  25. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.svg +1 -0
  26. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
  27. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.svg +1 -0
  28. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
  29. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.svg +1 -0
  30. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
  31. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.svg +1 -0
  32. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
  33. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.svg +1 -0
  34. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.svg +1 -0
  35. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
  36. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.svg +1 -0
  37. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
  38. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.svg +1 -0
  39. data/lib/rubyfox/server/data/config/core.xml +2 -2
  40. data/lib/rubyfox/server/data/config/log4j.properties +7 -7
  41. data/lib/rubyfox/server/data/config/server.xml +8 -9
  42. data/lib/rubyfox/server/data/config/wordsFile.txt +0 -2
  43. data/lib/rubyfox/server/data/data/GeoLite2-Country.mmdb +0 -0
  44. data/lib/rubyfox/server/data/{config → data/buddylists/BasicExamples}/.keep +0 -0
  45. data/lib/rubyfox/server/data/data/{buddylists → uploads}/.keep +0 -0
  46. data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/LICENSE +1061 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +68 -0
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +79 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +174 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina-tasks.xml +39 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.bat +387 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +686 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.bat +58 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.sh +60 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.bat +58 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.sh +60 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/daemon.sh +293 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.bat +58 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.sh +60 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.bat +114 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.sh +115 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.bat +94 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.sh +98 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.bat +58 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.sh +60 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.bat +58 -0
  71. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.sh +60 -0
  72. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  73. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  74. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.bat +110 -0
  75. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.sh +153 -0
  76. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.bat +58 -0
  77. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.sh +60 -0
  78. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/Catalina/localhost/rewrite.config +1 -0
  79. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +260 -0
  80. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +206 -0
  81. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/context.xml +31 -0
  82. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xml +23 -0
  83. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xsd +53 -0
  84. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
  85. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/logging.properties +79 -0
  86. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/server.xml +161 -0
  87. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xml +41 -0
  88. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xsd +59 -0
  89. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/web.xml +4737 -0
  90. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  91. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  92. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  93. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  94. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  95. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  96. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  97. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.17.jar +0 -0
  98. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  99. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  100. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  101. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  102. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  103. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  104. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/sfs2x-ws-helper.jar +0 -0
  105. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  106. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  107. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  108. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  109. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  110. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  111. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  112. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  113. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  114. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  115. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  116. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  117. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  118. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  119. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  120. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  121. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  122. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  123. data/lib/rubyfox/server/data/{extensions → lib/apache-tomcat/logs}/.keep +0 -0
  124. data/lib/rubyfox/server/data/lib/{jetty/lib/ext/.donotdelete → apache-tomcat/temp/safeToDelete.tmp} +0 -0
  125. data/lib/rubyfox/server/data/lib/{jetty/resources → apache-tomcat/work}/.keep +0 -0
  126. data/lib/rubyfox/server/data/lib/commons-collections-3.2.2.jar +0 -0
  127. data/lib/rubyfox/server/data/lib/commons-compress-1.19.jar +0 -0
  128. data/lib/rubyfox/server/data/lib/js/LibApi.js +48 -181
  129. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  130. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  131. data/lib/rubyfox/server/data/lib/sfs2x-lib.jar +0 -0
  132. data/lib/rubyfox/server/data/lib/sfs2x-util.jar +0 -0
  133. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  134. data/lib/rubyfox/server/data/sfs2x-service +6 -6
  135. data/lib/rubyfox/server/data/sfs2x-service.vmoptions +1 -1
  136. data/lib/rubyfox/server/data/sfs2x.sh +1 -1
  137. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  138. data/lib/rubyfox/server/data/www/HelloServlet/index.jsp +1 -1
  139. data/lib/rubyfox/server/data/www/{root → ROOT}/_css_/default.css +0 -0
  140. data/lib/rubyfox/server/data/www/{root → ROOT}/_css_/reset.css +0 -0
  141. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/background_gradient.png +0 -0
  142. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/background_logo.png +0 -0
  143. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/favicon.png +0 -0
  144. data/lib/rubyfox/server/data/www/{root → ROOT}/_images_/logo_smartfoxserver.png +0 -0
  145. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/_changes-to-default-themes_.txt +15 -0
  146. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/bootstrap.min.css +7 -0
  147. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/custom-bootstrap.min.css +1 -0
  148. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/css/all.min.css +5 -0
  149. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.eot +0 -0
  150. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.svg +3459 -0
  151. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  152. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff +0 -0
  153. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  154. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.eot +0 -0
  155. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.svg +803 -0
  156. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  157. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff +0 -0
  158. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  159. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.eot +0 -0
  160. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.svg +4527 -0
  161. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  162. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff +0 -0
  163. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  164. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fonts.css +175 -0
  165. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/jquery.scrolling-tabs.min.css +8 -0
  166. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/kendo.custom-bootstrap-v4.css +15280 -0
  167. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/reset.css +54 -0
  168. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +1428 -0
  169. data/lib/rubyfox/server/data/www/ROOT/admin/assets/data/countries.geo.json +178 -0
  170. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.otf +0 -0
  171. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.ttf +0 -0
  172. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff +0 -0
  173. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff2 +0 -0
  174. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.ttf +0 -0
  175. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.woff +0 -0
  176. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.woff2 +0 -0
  177. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.ttf +0 -0
  178. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.woff +0 -0
  179. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.woff2 +0 -0
  180. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.ttf +0 -0
  181. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.woff +0 -0
  182. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.woff2 +0 -0
  183. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.ttf +0 -0
  184. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.woff +0 -0
  185. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.woff2 +0 -0
  186. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.ttf +0 -0
  187. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.woff +0 -0
  188. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.woff2 +0 -0
  189. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.ttf +0 -0
  190. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.woff +0 -0
  191. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.woff2 +0 -0
  192. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.ttf +0 -0
  193. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.woff +0 -0
  194. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.woff2 +0 -0
  195. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.ttf +0 -0
  196. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.woff +0 -0
  197. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.woff2 +0 -0
  198. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.ttf +0 -0
  199. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.woff +0 -0
  200. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.woff2 +0 -0
  201. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.ttf +0 -0
  202. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.woff +0 -0
  203. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.woff2 +0 -0
  204. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.ttf +0 -0
  205. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff +0 -0
  206. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff2 +0 -0
  207. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.ttf +0 -0
  208. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff +0 -0
  209. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff2 +0 -0
  210. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/compare.png +0 -0
  211. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsChart.png +0 -0
  212. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsCompare.png +0 -0
  213. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsFilter.png +0 -0
  214. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsMap.png +0 -0
  215. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsTable.png +0 -0
  216. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyChart.png +0 -0
  217. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyCompare.png +0 -0
  218. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyFilter.png +0 -0
  219. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyTable.png +0 -0
  220. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/apple-touch-icon-180x180.png +0 -0
  221. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-16x16.png +0 -0
  222. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-32x32.png +0 -0
  223. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-64x64.png +0 -0
  224. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/logo.png +0 -0
  225. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +2208 -0
  226. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +7662 -0
  227. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +929 -0
  228. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +766 -0
  229. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +71 -0
  230. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +1184 -0
  231. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +2618 -0
  232. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +3315 -0
  233. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-3.bundle.js +280 -0
  234. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +1122 -0
  235. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +2624 -0
  236. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +801 -0
  237. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +607 -0
  238. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +1221 -0
  239. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +847 -0
  240. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0.bundle.js +3240 -0
  241. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0~module-1~module-13~module-4~module-5~module-7~module-8.bundle.js +17357 -0
  242. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +807 -0
  243. data/lib/rubyfox/server/data/{lib/jetty/webapps → www/ROOT/admin/assets/js/custom-modules}/.keep +0 -0
  244. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/bootstrap.min.js +7 -0
  245. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery-3.3.1.min.js +2 -0
  246. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery.scrolling-tabs.min.js +8 -0
  247. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/js.cookie.min.js +8 -0
  248. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/kendo.all.min.js +136 -0
  249. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/popper.min.js +5 -0
  250. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/sfs2x-api-1.7.15.js +8 -0
  251. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/versions-readme.txt +16 -0
  252. data/lib/rubyfox/server/data/www/ROOT/admin/index.html +244 -0
  253. data/lib/rubyfox/server/data/www/ROOT/admin/manifest.json +25 -0
  254. data/lib/rubyfox/server/data/www/ROOT/admin/modules/analytics.html +328 -0
  255. data/lib/rubyfox/server/data/www/ROOT/admin/modules/ban-manager.html +160 -0
  256. data/lib/rubyfox/server/data/www/ROOT/admin/modules/blue-box-monitor.html +37 -0
  257. data/lib/rubyfox/server/data/www/ROOT/admin/modules/console.html +135 -0
  258. data/lib/rubyfox/server/data/www/ROOT/admin/modules/dashboard.html +368 -0
  259. data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-manager.html +98 -0
  260. data/lib/rubyfox/server/data/www/ROOT/admin/modules/license-manager.html +117 -0
  261. data/lib/rubyfox/server/data/www/ROOT/admin/modules/log-viewer.html +194 -0
  262. data/lib/rubyfox/server/data/www/ROOT/admin/modules/server-configurator.html +55 -0
  263. data/lib/rubyfox/server/data/www/ROOT/admin/modules/servlet-manager.html +98 -0
  264. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html +62 -0
  265. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +346 -0
  266. data/lib/rubyfox/server/data/www/{root → ROOT}/crossdomain.xml +0 -0
  267. data/lib/rubyfox/server/data/www/{root → ROOT}/examples/index.html +0 -0
  268. data/lib/rubyfox/server/data/www/{root → ROOT}/favicon.ico +0 -0
  269. data/lib/rubyfox/server/data/www/{root → ROOT}/favicon.png +0 -0
  270. data/lib/rubyfox/server/data/www/{root → ROOT}/index.html +0 -0
  271. data/lib/rubyfox/server/data/www/host-manager/META-INF/context.xml +24 -0
  272. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/401.jsp +71 -0
  273. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/403.jsp +90 -0
  274. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/404.jsp +62 -0
  275. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/web.xml +131 -0
  276. data/lib/rubyfox/server/data/www/host-manager/images/asf-logo.svg +226 -0
  277. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.gif +0 -0
  278. data/lib/rubyfox/server/data/www/host-manager/index.jsp +18 -0
  279. data/lib/rubyfox/server/data/www/host-manager/manager.xml +26 -0
  280. data/lib/rubyfox/server/data/{logs → www/logsBackup}/.keep +0 -0
  281. data/lib/rubyfox/server/data/www/manager/META-INF/context.xml +24 -0
  282. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/401.jsp +80 -0
  283. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/403.jsp +100 -0
  284. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/404.jsp +63 -0
  285. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCerts.jsp +92 -0
  286. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCiphers.jsp +92 -0
  287. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorTrustedCerts.jsp +92 -0
  288. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionDetail.jsp +197 -0
  289. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionsList.jsp +170 -0
  290. data/lib/rubyfox/server/data/www/manager/WEB-INF/web.xml +195 -0
  291. data/lib/rubyfox/server/data/www/manager/images/asf-logo.svg +226 -0
  292. data/lib/rubyfox/server/data/www/manager/images/tomcat.gif +0 -0
  293. data/lib/rubyfox/server/data/www/manager/index.jsp +18 -0
  294. data/lib/rubyfox/server/data/www/manager/status.xsd +84 -0
  295. data/lib/rubyfox/server/data/www/manager/xform.xsl +125 -0
  296. data/lib/rubyfox/server/version.rb +1 -1
  297. metadata +256 -337
  298. data/lib/rubyfox/server/data/config/ExtensionManagerLock.txt +0 -2
  299. data/lib/rubyfox/server/data/lib/Lib/reindex$py.class +0 -0
  300. data/lib/rubyfox/server/data/lib/jetty/VERSION.txt +0 -9716
  301. data/lib/rubyfox/server/data/lib/jetty/etc/README.spnego +0 -62
  302. data/lib/rubyfox/server/data/lib/jetty/etc/example-quickstart.xml +0 -27
  303. data/lib/rubyfox/server/data/lib/jetty/etc/gcloud-memcached-session-context.xml +0 -33
  304. data/lib/rubyfox/server/data/lib/jetty/etc/gcloud-session-context.xml +0 -25
  305. data/lib/rubyfox/server/data/lib/jetty/etc/hawtio.xml +0 -16
  306. data/lib/rubyfox/server/data/lib/jetty/etc/home-base-warning.xml +0 -8
  307. data/lib/rubyfox/server/data/lib/jetty/etc/jamon.xml +0 -32
  308. data/lib/rubyfox/server/data/lib/jetty/etc/jdbcRealm.properties +0 -72
  309. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-alpn.xml +0 -32
  310. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-annotations.xml +0 -20
  311. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-cdi.xml +0 -19
  312. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debug.xml +0 -36
  313. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-debuglog.xml +0 -25
  314. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-deploy.xml +0 -76
  315. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-memcached-sessions.xml +0 -27
  316. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-session-idmgr.xml +0 -19
  317. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gcloud-sessions.xml +0 -27
  318. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gzip-inflate.xml +0 -12
  319. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-gzip.xml +0 -67
  320. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http-forwarded.xml +0 -20
  321. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http.xml +0 -47
  322. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2.xml +0 -25
  323. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-http2c.xml +0 -17
  324. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-https.xml +0 -29
  325. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-infinispan.xml +0 -39
  326. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ipaccess.xml +0 -28
  327. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jaas.xml +0 -16
  328. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jdbc-sessions.xml +0 -34
  329. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx-remote.xml +0 -40
  330. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-jmx.xml +0 -32
  331. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-logging.xml +0 -36
  332. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-lowresources.xml +0 -22
  333. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-monitor.xml +0 -30
  334. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-nosql.xml +0 -19
  335. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-plus.xml +0 -26
  336. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol-ssl.xml +0 -10
  337. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy-protocol.xml +0 -10
  338. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-proxy.xml +0 -35
  339. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-requestlog.xml +0 -30
  340. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite-customizer.xml +0 -17
  341. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-rewrite.xml +0 -31
  342. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-setuid.xml +0 -30
  343. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-spring.xml +0 -61
  344. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl-context.xml +0 -31
  345. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-ssl.xml +0 -58
  346. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-started.xml +0 -15
  347. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-stats.xml +0 -18
  348. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-stop.xml +0 -6
  349. data/lib/rubyfox/server/data/lib/jetty/etc/jetty-threadlimit.xml +0 -20
  350. data/lib/rubyfox/server/data/lib/jetty/etc/jetty.conf +0 -12
  351. data/lib/rubyfox/server/data/lib/jetty/etc/jetty.xml +0 -195
  352. data/lib/rubyfox/server/data/lib/jetty/etc/jminix.xml +0 -12
  353. data/lib/rubyfox/server/data/lib/jetty/etc/jolokia.xml +0 -16
  354. data/lib/rubyfox/server/data/lib/jetty/etc/keystore +0 -0
  355. data/lib/rubyfox/server/data/lib/jetty/etc/krb5.ini +0 -23
  356. data/lib/rubyfox/server/data/lib/jetty/etc/rewrite-compactpath.xml +0 -10
  357. data/lib/rubyfox/server/data/lib/jetty/etc/sessions/hazelcast/default.xml +0 -19
  358. data/lib/rubyfox/server/data/lib/jetty/etc/sessions/hazelcast/remote.xml +0 -19
  359. data/lib/rubyfox/server/data/lib/jetty/etc/spnego.conf +0 -19
  360. data/lib/rubyfox/server/data/lib/jetty/etc/spnego.properties +0 -1
  361. data/lib/rubyfox/server/data/lib/jetty/etc/webdefault.xml +0 -539
  362. data/lib/rubyfox/server/data/lib/jetty/lib/alpn-api-1.1.3.v20160715.jar +0 -0
  363. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.eclipse.jdt.core.compiler.ecj-4.4.2.jar +0 -0
  364. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.eclipse.jetty.apache-jsp-9.3.28.v20191105.jar +0 -0
  365. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.mortbay.jasper.apache-el-8.0.33.jar +0 -0
  366. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.33.jar +0 -0
  367. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jstl/org.apache.taglibs.taglibs-standard-impl-1.2.5.jar +0 -0
  368. data/lib/rubyfox/server/data/lib/jetty/lib/apache-jstl/org.apache.taglibs.taglibs-standard-spec-1.2.5.jar +0 -0
  369. data/lib/rubyfox/server/data/lib/jetty/lib/asm-6.0.jar +0 -0
  370. data/lib/rubyfox/server/data/lib/jetty/lib/asm-commons-6.0.jar +0 -0
  371. data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-client-9.3.28.v20191105.jar +0 -0
  372. data/lib/rubyfox/server/data/lib/jetty/lib/fcgi/fcgi-server-9.3.28.v20191105.jar +0 -0
  373. data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-common-9.3.28.v20191105.jar +0 -0
  374. data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-hpack-9.3.28.v20191105.jar +0 -0
  375. data/lib/rubyfox/server/data/lib/jetty/lib/http2/http2-server-9.3.28.v20191105.jar +0 -0
  376. data/lib/rubyfox/server/data/lib/jetty/lib/jaspi/javax.security.auth.message-1.0.0.v201108011116.jar +0 -0
  377. data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-client-impl-9.3.28.v20191105.jar +0 -0
  378. data/lib/rubyfox/server/data/lib/jetty/lib/javax-websocket-server-impl-9.3.28.v20191105.jar +0 -0
  379. data/lib/rubyfox/server/data/lib/jetty/lib/javax.annotation-api-1.2.jar +0 -0
  380. data/lib/rubyfox/server/data/lib/jetty/lib/javax.websocket-api-1.0.jar +0 -0
  381. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-alpn-java-server-9.3.28.v20191105.jar +0 -0
  382. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-alpn-server-9.3.28.v20191105.jar +0 -0
  383. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-annotations-9.3.28.v20191105.jar +0 -0
  384. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-client-9.3.28.v20191105.jar +0 -0
  385. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-continuation-9.3.28.v20191105.jar +0 -0
  386. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-deploy-9.3.28.v20191105.jar +0 -0
  387. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-memcached-session-manager-9.3.28.v20191105.jar +0 -0
  388. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-gcloud-session-manager-9.3.28.v20191105.jar +0 -0
  389. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-hazelcast-9.3.28.v20191105.jar +0 -0
  390. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-http-9.3.28.v20191105.jar +0 -0
  391. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-infinispan-9.3.28.v20191105.jar +0 -0
  392. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-io-9.3.28.v20191105.jar +0 -0
  393. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaas-9.3.28.v20191105.jar +0 -0
  394. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jaspi-9.3.28.v20191105.jar +0 -0
  395. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jmx-9.3.28.v20191105.jar +0 -0
  396. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-jndi-9.3.28.v20191105.jar +0 -0
  397. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-nosql-9.3.28.v20191105.jar +0 -0
  398. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-plus-9.3.28.v20191105.jar +0 -0
  399. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-proxy-9.3.28.v20191105.jar +0 -0
  400. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-quickstart-9.3.28.v20191105.jar +0 -0
  401. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-rewrite-9.3.28.v20191105.jar +0 -0
  402. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-schemas-3.1.jar +0 -0
  403. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-security-9.3.28.v20191105.jar +0 -0
  404. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-server-9.3.28.v20191105.jar +0 -0
  405. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlet-9.3.28.v20191105.jar +0 -0
  406. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-servlets-9.3.28.v20191105.jar +0 -0
  407. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-util-9.3.28.v20191105.jar +0 -0
  408. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-webapp-9.3.28.v20191105.jar +0 -0
  409. data/lib/rubyfox/server/data/lib/jetty/lib/jetty-xml-9.3.28.v20191105.jar +0 -0
  410. data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.mail.glassfish-1.4.1.v201005082020.jar +0 -0
  411. data/lib/rubyfox/server/data/lib/jetty/lib/jndi/javax.transaction-api-1.2.jar +0 -0
  412. data/lib/rubyfox/server/data/lib/jetty/lib/monitor/jetty-monitor-9.3.28.v20191105.jar +0 -0
  413. data/lib/rubyfox/server/data/lib/jetty/lib/servlet-api-3.1.jar +0 -0
  414. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/jetty-setuid-java-1.0.3.jar +0 -0
  415. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-linux.so +0 -0
  416. data/lib/rubyfox/server/data/lib/jetty/lib/setuid/libsetuid-osx.so +0 -0
  417. data/lib/rubyfox/server/data/lib/jetty/lib/spring/jetty-spring-9.3.28.v20191105.jar +0 -0
  418. data/lib/rubyfox/server/data/lib/jetty/lib/start.jar +0 -0
  419. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-api-9.3.28.v20191105.jar +0 -0
  420. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-client-9.3.28.v20191105.jar +0 -0
  421. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-common-9.3.28.v20191105.jar +0 -0
  422. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-server-9.3.28.v20191105.jar +0 -0
  423. data/lib/rubyfox/server/data/lib/jetty/lib/websocket-servlet-9.3.28.v20191105.jar +0 -0
  424. data/lib/rubyfox/server/data/lib/jetty/license-eplv10-aslv20.html +0 -576
  425. data/lib/rubyfox/server/data/lib/jetty/modules/.donotdelete +0 -0
  426. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0.mod +0 -8
  427. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_05.mod +0 -8
  428. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_101.mod +0 -8
  429. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_102.mod +0 -8
  430. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_11.mod +0 -8
  431. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_111.mod +0 -8
  432. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_112.mod +0 -8
  433. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_121.mod +0 -8
  434. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_131.mod +0 -8
  435. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_141.mod +0 -8
  436. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_144.mod +0 -8
  437. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_151.mod +0 -8
  438. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_152.mod +0 -8
  439. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_161.mod +0 -8
  440. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_162.mod +0 -8
  441. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_171.mod +0 -8
  442. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_172.mod +0 -8
  443. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_181.mod +0 -8
  444. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_191.mod +0 -8
  445. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_192.mod +0 -8
  446. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_20.mod +0 -8
  447. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_201.mod +0 -8
  448. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_202.mod +0 -8
  449. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_211.mod +0 -8
  450. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_212.mod +0 -8
  451. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_221.mod +0 -8
  452. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_222.mod +0 -8
  453. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_231.mod +0 -8
  454. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_232.mod +0 -8
  455. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_25.mod +0 -8
  456. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_31.mod +0 -8
  457. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_40.mod +0 -8
  458. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_45.mod +0 -8
  459. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_51.mod +0 -8
  460. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_60.mod +0 -8
  461. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_65.mod +0 -8
  462. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_66.mod +0 -8
  463. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_71.mod +0 -8
  464. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_72.mod +0 -8
  465. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_73.mod +0 -8
  466. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_74.mod +0 -8
  467. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_77.mod +0 -8
  468. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_91.mod +0 -8
  469. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-1.8.0_92.mod +0 -8
  470. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-8.mod +0 -30
  471. data/lib/rubyfox/server/data/lib/jetty/modules/alpn-impl/alpn-9.mod +0 -5
  472. data/lib/rubyfox/server/data/lib/jetty/modules/alpn.mod +0 -22
  473. data/lib/rubyfox/server/data/lib/jetty/modules/annotations.mod +0 -17
  474. data/lib/rubyfox/server/data/lib/jetty/modules/apache-jsp.mod +0 -10
  475. data/lib/rubyfox/server/data/lib/jetty/modules/apache-jstl.mod +0 -9
  476. data/lib/rubyfox/server/data/lib/jetty/modules/cdi.mod +0 -38
  477. data/lib/rubyfox/server/data/lib/jetty/modules/client.mod +0 -6
  478. data/lib/rubyfox/server/data/lib/jetty/modules/continuation.mod +0 -6
  479. data/lib/rubyfox/server/data/lib/jetty/modules/debug.mod +0 -29
  480. data/lib/rubyfox/server/data/lib/jetty/modules/debuglog.mod +0 -25
  481. data/lib/rubyfox/server/data/lib/jetty/modules/deploy.mod +0 -31
  482. data/lib/rubyfox/server/data/lib/jetty/modules/ext.mod +0 -11
  483. data/lib/rubyfox/server/data/lib/jetty/modules/fcgi.mod +0 -15
  484. data/lib/rubyfox/server/data/lib/jetty/modules/flight-recorder.mod +0 -13
  485. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-memcached-sessions.mod +0 -26
  486. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-session-idmgr.mod +0 -63
  487. data/lib/rubyfox/server/data/lib/jetty/modules/gcloud-sessions.mod +0 -11
  488. data/lib/rubyfox/server/data/lib/jetty/modules/gzip-inflate.mod +0 -17
  489. data/lib/rubyfox/server/data/lib/jetty/modules/gzip.mod +0 -23
  490. data/lib/rubyfox/server/data/lib/jetty/modules/hawtio.mod +0 -28
  491. data/lib/rubyfox/server/data/lib/jetty/modules/hazelcast-embedded-sessions.mod +0 -26
  492. data/lib/rubyfox/server/data/lib/jetty/modules/hazelcast-remote-sessions.mod +0 -26
  493. data/lib/rubyfox/server/data/lib/jetty/modules/home-base-warning.mod +0 -7
  494. data/lib/rubyfox/server/data/lib/jetty/modules/http-forwarded.mod +0 -24
  495. data/lib/rubyfox/server/data/lib/jetty/modules/http.mod +0 -39
  496. data/lib/rubyfox/server/data/lib/jetty/modules/http2.mod +0 -20
  497. data/lib/rubyfox/server/data/lib/jetty/modules/http2c.mod +0 -22
  498. data/lib/rubyfox/server/data/lib/jetty/modules/https.mod +0 -14
  499. data/lib/rubyfox/server/data/lib/jetty/modules/infinispan.mod +0 -33
  500. data/lib/rubyfox/server/data/lib/jetty/modules/ipaccess.mod +0 -9
  501. data/lib/rubyfox/server/data/lib/jetty/modules/jaas.mod +0 -17
  502. data/lib/rubyfox/server/data/lib/jetty/modules/jamon.mod +0 -31
  503. data/lib/rubyfox/server/data/lib/jetty/modules/jaspi.mod +0 -10
  504. data/lib/rubyfox/server/data/lib/jetty/modules/jdbc-sessions.mod +0 -27
  505. data/lib/rubyfox/server/data/lib/jetty/modules/jminix.mod +0 -41
  506. data/lib/rubyfox/server/data/lib/jetty/modules/jmx-remote.mod +0 -16
  507. data/lib/rubyfox/server/data/lib/jetty/modules/jmx.mod +0 -13
  508. data/lib/rubyfox/server/data/lib/jetty/modules/jndi.mod +0 -11
  509. data/lib/rubyfox/server/data/lib/jetty/modules/jolokia.mod +0 -19
  510. data/lib/rubyfox/server/data/lib/jetty/modules/jsp.mod +0 -9
  511. data/lib/rubyfox/server/data/lib/jetty/modules/jstl.mod +0 -8
  512. data/lib/rubyfox/server/data/lib/jetty/modules/jvm.mod +0 -22
  513. data/lib/rubyfox/server/data/lib/jetty/modules/logging.mod +0 -36
  514. data/lib/rubyfox/server/data/lib/jetty/modules/lowresources.mod +0 -28
  515. data/lib/rubyfox/server/data/lib/jetty/modules/monitor.mod +0 -13
  516. data/lib/rubyfox/server/data/lib/jetty/modules/nosql.mod +0 -31
  517. data/lib/rubyfox/server/data/lib/jetty/modules/plus.mod +0 -15
  518. data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol-ssl.mod +0 -9
  519. data/lib/rubyfox/server/data/lib/jetty/modules/proxy-protocol.mod +0 -9
  520. data/lib/rubyfox/server/data/lib/jetty/modules/proxy.mod +0 -22
  521. data/lib/rubyfox/server/data/lib/jetty/modules/quickstart.mod +0 -11
  522. data/lib/rubyfox/server/data/lib/jetty/modules/requestlog.mod +0 -40
  523. data/lib/rubyfox/server/data/lib/jetty/modules/resources.mod +0 -10
  524. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-compactpath.mod +0 -10
  525. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite-customizer.mod +0 -24
  526. data/lib/rubyfox/server/data/lib/jetty/modules/rewrite.mod +0 -23
  527. data/lib/rubyfox/server/data/lib/jetty/modules/security.mod +0 -9
  528. data/lib/rubyfox/server/data/lib/jetty/modules/server.mod +0 -82
  529. data/lib/rubyfox/server/data/lib/jetty/modules/servlet.mod +0 -9
  530. data/lib/rubyfox/server/data/lib/jetty/modules/servlets.mod +0 -11
  531. data/lib/rubyfox/server/data/lib/jetty/modules/setuid.mod +0 -19
  532. data/lib/rubyfox/server/data/lib/jetty/modules/spring.mod +0 -17
  533. data/lib/rubyfox/server/data/lib/jetty/modules/ssl.mod +0 -101
  534. data/lib/rubyfox/server/data/lib/jetty/modules/stats.mod +0 -9
  535. data/lib/rubyfox/server/data/lib/jetty/modules/threadlimit.mod +0 -22
  536. data/lib/rubyfox/server/data/lib/jetty/modules/webapp.mod +0 -10
  537. data/lib/rubyfox/server/data/lib/jetty/modules/websocket.mod +0 -12
  538. data/lib/rubyfox/server/data/lib/jetty/start.ini +0 -85
  539. data/lib/rubyfox/server/data/www/.keep +0 -0
  540. data/lib/rubyfox/server/data/www/HelloServlet/META-INF/context.xml +0 -2
  541. data/lib/rubyfox/server/data/www/PyServletExample/MyModule$py.class +0 -0
  542. data/lib/rubyfox/server/data/www/PyServletExample/MyModule.py +0 -5
  543. data/lib/rubyfox/server/data/www/PyServletExample/WEB-INF/web.xml +0 -37
  544. data/lib/rubyfox/server/data/www/PyServletExample/errors/404.htm +0 -20
  545. data/lib/rubyfox/server/data/www/PyServletExample/index.py +0 -42
  546. data/lib/rubyfox/server/data/www/root/admin/.keep +0 -0
  547. data/lib/rubyfox/server/data/www/root/admin/AdminTool.swf +0 -0
  548. data/lib/rubyfox/server/data/www/root/admin/ReleaseNotes.txt +0 -201
  549. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/adobeFlashPlayer.png +0 -0
  550. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/advanced.png +0 -0
  551. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/analytics.png +0 -0
  552. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/banManager.png +0 -0
  553. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedIPs.png +0 -0
  554. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bannedUsernames.png +0 -0
  555. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bookmarks.png +0 -0
  556. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/bootLog.png +0 -0
  557. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyList.png +0 -0
  558. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/buddyProperties.png +0 -0
  559. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/connection.png +0 -0
  560. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/databaseManager.png +0 -0
  561. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/floodFilter.png +0 -0
  562. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/gameSettings.png +0 -0
  563. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/general.png +0 -0
  564. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/globalServerStatus.png +0 -0
  565. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/hTML5WebSockets.png +0 -0
  566. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPDiscovery.png +0 -0
  567. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/iPFilter.png +0 -0
  568. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/jVMSettings.png +0 -0
  569. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/logsDownload.png +0 -0
  570. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mMOSettings.png +0 -0
  571. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/mailer.png +0 -0
  572. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/permissionsAndEvents.png +0 -0
  573. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/privilegeManager.png +0 -0
  574. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/remoteAdmin.png +0 -0
  575. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomExtension.png +0 -0
  576. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomVariables.png +0 -0
  577. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/roomsAndGroups.png +0 -0
  578. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeLog.png +0 -0
  579. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeRoomSettings.png +0 -0
  580. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeUserSettings.png +0 -0
  581. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/runtimeZoneSettings.png +0 -0
  582. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsApplication.png +0 -0
  583. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsDemographics.png +0 -0
  584. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsExceptions.png +0 -0
  585. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsOverview.png +0 -0
  586. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/statsTechnology.png +0 -0
  587. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/systemQueueStatus.png +0 -0
  588. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/threadPools.png +0 -0
  589. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userManagement.png +0 -0
  590. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/userVariables.png +0 -0
  591. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/webServer.png +0 -0
  592. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/wordsFilter.png +0 -0
  593. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneExtension.png +0 -0
  594. data/lib/rubyfox/server/data/www/root/admin/assets/icons/tabs/zoneTraffic.png +0 -0
  595. data/lib/rubyfox/server/data/www/root/admin/expressInstall.swf +0 -0
  596. data/lib/rubyfox/server/data/www/root/admin/index.html +0 -124
  597. data/lib/rubyfox/server/data/www/root/admin/modules/Analytics.swf +0 -0
  598. data/lib/rubyfox/server/data/www/root/admin/modules/BanManager.swf +0 -0
  599. data/lib/rubyfox/server/data/www/root/admin/modules/BlueBoxMonitor.swf +0 -0
  600. data/lib/rubyfox/server/data/www/root/admin/modules/Console.swf +0 -0
  601. data/lib/rubyfox/server/data/www/root/admin/modules/Dashboard.swf +0 -0
  602. data/lib/rubyfox/server/data/www/root/admin/modules/ExtensionManager.swf +0 -0
  603. data/lib/rubyfox/server/data/www/root/admin/modules/LicenseManager.swf +0 -0
  604. data/lib/rubyfox/server/data/www/root/admin/modules/LogViewer.swf +0 -0
  605. data/lib/rubyfox/server/data/www/root/admin/modules/ServerConfigurator.swf +0 -0
  606. data/lib/rubyfox/server/data/www/root/admin/modules/ServletManager.swf +0 -0
  607. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneConfigurator.swf +0 -0
  608. data/lib/rubyfox/server/data/www/root/admin/modules/ZoneMonitor.swf +0 -0
  609. data/lib/rubyfox/server/data/www/root/admin/swfobject.js +0 -4
  610. data/lib/rubyfox/server/data/www/root/examples/.keep +0 -0
  611. data/lib/rubyfox/server/data/www/sfs2x-ws.war +0 -0
  612. data/lib/rubyfox/server/data/www/sfs2x-ws.xml +0 -30
  613. data/lib/rubyfox/server/data/zones/BasicExamples.zone.xml +0 -147
@@ -0,0 +1,801 @@
1
+ /*! (c) gotoAndPlay | All rights reserved */
2
+ (window["webpackJsonpapplication"] = window["webpackJsonpapplication"] || []).push([["module-6"],{
3
+
4
+ /***/ "./src/managers/file-datasource-manager.js":
5
+ /*!*************************************************!*\
6
+ !*** ./src/managers/file-datasource-manager.js ***!
7
+ \*************************************************/
8
+ /*! exports provided: FileDataSourceManager */
9
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
10
+
11
+ "use strict";
12
+ __webpack_require__.r(__webpack_exports__);
13
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FileDataSourceManager", function() { return FileDataSourceManager; });
14
+ class FileDataSourceManager
15
+ {
16
+ constructor(libFolder, protectedFolders, fileSeparator)
17
+ {
18
+ this._protectedFolders = protectedFolders; // Folders which can't be deleted (but their content can)
19
+ this._libFolder = libFolder;
20
+ this._fileSeparator = fileSeparator;
21
+ }
22
+
23
+ get dataSource()
24
+ {
25
+ return this._dataSource;
26
+ }
27
+
28
+ init()
29
+ {
30
+ this._dataSource = new kendo.data.TreeListDataSource({
31
+ data: [],
32
+ schema: {
33
+ model: {
34
+ id: 'id',
35
+ parentId: 'parentId',
36
+ expanded: false
37
+ }
38
+ },
39
+ sort: { field: 'name', dir: 'asc' }
40
+ });
41
+ }
42
+
43
+ addFile(fileObj, parentLevel = null)
44
+ {
45
+ let file = {};
46
+
47
+ file.name = fileObj.getUtfString('name');
48
+ file.isDir = fileObj.getBool('isDir');
49
+ file.lastMod = fileObj.getLong('lastMod');
50
+ file.isLib = (file.isDir && file.name == this._libFolder);
51
+ file.isProtected = (file.isDir && this._protectedFolders.indexOf(file.name) > -1);
52
+ file.size = 0;
53
+
54
+ if (parentLevel == null)
55
+ file.level = 0;
56
+ else
57
+ file.level = parentLevel + 1;
58
+
59
+ if (fileObj.containsKey('parent'))
60
+ {
61
+ file.parentId = fileObj.getUtfString('parent');
62
+ file.id = file.parentId + this._fileSeparator + file.name;
63
+ }
64
+ else
65
+ {
66
+ file.parentId = null;
67
+ file.id = file.name;
68
+ }
69
+
70
+ // Add child files
71
+ if (file.isDir)
72
+ {
73
+ let filesArr = fileObj.getSFSArray('files');
74
+
75
+ for (let i = 0; i < filesArr.size(); i++)
76
+ file.size += this.addFile(filesArr.getSFSObject(i), file.level);
77
+ }
78
+ else
79
+ file.size = fileObj.getLong('size');
80
+
81
+ // Add file to data source
82
+ this._dataSource.add(file);
83
+
84
+ // Return file size
85
+ return file.size;
86
+ }
87
+
88
+ removeFile(id)
89
+ {
90
+ let fileItem = this._dataSource.get(id);
91
+
92
+ if (fileItem)
93
+ {
94
+ if (fileItem.parentId)
95
+ {
96
+ // Subtract old size from parent size
97
+ let parentItem = this._dataSource.get(fileItem.parentId);
98
+ this._updateParentSize(parentItem, -fileItem.size);
99
+ }
100
+
101
+ this._dataSource.remove(fileItem);
102
+
103
+ // Return parent item
104
+ if (fileItem.parentId)
105
+ return this._dataSource.get(fileItem.parentId);
106
+ }
107
+ }
108
+
109
+ getFileById(id)
110
+ {
111
+ return this._dataSource.get(id);
112
+ }
113
+
114
+ addFileToParent(fileObj, parentId)
115
+ {
116
+ let parentItem = this._dataSource.get(parentId);
117
+
118
+ if (parentItem != null && parentItem.isDir)
119
+ {
120
+ const fileId = parentId + this._fileSeparator + fileObj.getUtfString('name');
121
+ let fileItem = this._dataSource.get(fileId);
122
+
123
+ if (fileItem != null)
124
+ {
125
+ // Subtract old size from parent size
126
+ this._updateParentSize(parentItem, -fileItem.size);
127
+
128
+ // Update existing item
129
+ fileItem.name = fileObj.getUtfString('name');
130
+ fileItem.lastMod = fileObj.getLong('lastMod');
131
+ fileItem.size = fileObj.getLong('size');
132
+ }
133
+ else
134
+ {
135
+ // Add new item
136
+ this.addFile(fileObj, parentItem.level);
137
+ }
138
+
139
+ // Update parent item size
140
+ this._updateParentSize(parentItem, fileObj.getLong('size'));
141
+
142
+ return fileId;
143
+ }
144
+ else
145
+ throw new Error(`An unexpected error occurred while adding file '${fileObj.getUtfString('name')}' (target: ${parentId}).`);
146
+ }
147
+
148
+ _updateParentSize(parentItem, value)
149
+ {
150
+ parentItem.size += value;
151
+
152
+ if (parentItem.parentId)
153
+ {
154
+ let grandParent = this._dataSource.get(parentItem.parentId);
155
+ this._updateParentSize(grandParent, value);
156
+ }
157
+ }
158
+ }
159
+
160
+
161
+ /***/ }),
162
+
163
+ /***/ "./src/modules/extension-manager.js":
164
+ /*!******************************************!*\
165
+ !*** ./src/modules/extension-manager.js ***!
166
+ \******************************************/
167
+ /*! exports provided: default */
168
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
169
+
170
+ "use strict";
171
+ __webpack_require__.r(__webpack_exports__);
172
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ExtensionManager; });
173
+ /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-module */ "./src/modules/base-module.js");
174
+ /* harmony import */ var _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../managers/file-datasource-manager */ "./src/managers/file-datasource-manager.js");
175
+ /* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/utilities */ "./src/utils/utilities.js");
176
+
177
+
178
+
179
+
180
+ class ExtensionManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
181
+ {
182
+ constructor()
183
+ {
184
+ super('extensionMan');
185
+
186
+ // Outgoing requests
187
+ this.REQ_INIT = 'init';
188
+ this.REQ_GET_EXTENSIONS = 'getExtensions';
189
+ this.REQ_CREATE_FOLDER = 'createFolder';
190
+ this.REQ_DELETE_FILES = 'deleteExtFiles';
191
+ this.REQ_RELOAD_EXTENSIONS = 'reloadExt';
192
+
193
+ // Incoming responses
194
+ this.RESP_LOCKED = 'lock';
195
+ this.RESP_INIT = 'init';
196
+ this.RESP_EXTENSIONS = 'extensions';
197
+ this.RESP_FILE_ADDED = 'fileAdded';
198
+ this.RESP_FILES_DELETED = 'filesDeleted';
199
+ this.RESP_ERROR = 'error';
200
+ }
201
+
202
+ //------------------------------------
203
+ // COMMON MODULE INTERFACE METHODS
204
+ // This members are used by the main controller
205
+ // to communicate with the module's controller.
206
+ //------------------------------------
207
+
208
+ initialize(idData, shellController)
209
+ {
210
+ // Call super method
211
+ super.initialize(idData, shellController);
212
+
213
+ // Initialize progress bar
214
+ $('#exm-progressBar').kendoProgressBar({
215
+ min: 0,
216
+ max: 100,
217
+ value: false,
218
+ type: 'value',
219
+ animation: {
220
+ duration: 400
221
+ }
222
+ });
223
+
224
+ // Add listeners to buttons
225
+ $('#exm-retryBt').on('click', $.proxy(this._onRetryClick, this));
226
+ $('#exm-refreshBt').on('click', $.proxy(this._onRefreshClick, this));
227
+
228
+ // Initialize files list
229
+ this._filesList = $('#exm-fileList').kendoTreeList({
230
+ dataSource: [],
231
+ resizable: true,
232
+ selectable: true,
233
+ columns: [
234
+ {
235
+ field: 'name',
236
+ title: 'Name',
237
+ template: kendo.template(`
238
+ <div >
239
+ # if (isDir) { #
240
+ # if (expanded) { #
241
+ <i class="fas fa-folder-open"></i>
242
+ # } else { #
243
+ <i class="fas fa-folder"></i>
244
+ # } #
245
+ # } else { #
246
+ <i class="far fa-file"></i>
247
+ # } #
248
+
249
+ #: name #
250
+
251
+ </div>
252
+ <div class="file-controls flex-grow-1 text-right" data-item-id="#:id#">
253
+ # if (isDir) { #
254
+ <button type="button" class="k-button k-primary my-1 create-folder-bt"><i class="fas fa-folder-plus"></i></button>
255
+ # if (level > 0) { #
256
+ <button type="button" class="k-button k-primary my-1 upload-files-bt"><i class="fas fa-file-upload"></i></button>
257
+ # } #
258
+ # } #
259
+
260
+ # if (level > 0 && !isProtected) { #
261
+ <button type="button" class="k-button k-primary my-1 remove-file-bt"><i class="fas fa-minus-circle"></i></button>
262
+ # } #
263
+
264
+ # if (level == 1 && !isLib) { #
265
+ <button type="button" class="k-button k-primary my-1 reload-ext-bt"><i class="fas fa-redo-alt"></i></button>
266
+ # } #
267
+ </div>
268
+ `),
269
+ },
270
+ {
271
+ field: 'size',
272
+ title: 'Size',
273
+ template: function(dataItem) {
274
+ dataItem.bytesToSize = _utils_utilities__WEBPACK_IMPORTED_MODULE_2__["bytesToSize"]; // Pass bytesToSize utility function to template
275
+ return kendo.template(`
276
+ #: bytesToSize(size, 2, 'KB') #
277
+ `)(dataItem);
278
+ },
279
+ width: 120,
280
+ minScreenWidth: 576
281
+ },
282
+ {
283
+ field: 'lastMod',
284
+ title: 'Last Modified',
285
+ template: kendo.template(`
286
+ #: kendo.toString(new Date(lastMod), 'dd MMM yyyy HH:mm:ss') #
287
+ `),
288
+ width: 200,
289
+ minScreenWidth: 768
290
+ },
291
+ ],
292
+ change: $.proxy(this._onFileSelectedChange, this)
293
+ }).data('kendoTreeList');
294
+
295
+ //-------------------------------------------
296
+
297
+ // Add listeners to catch control button clicks on rows
298
+ $('#exm-fileList').on('click', '.create-folder-bt', $.proxy(this._showAddFolderModalClick, this));
299
+ $('#exm-fileList').on('click', '.upload-files-bt', $.proxy(this._showUploadFilesModalClick, this));
300
+ $('#exm-fileList').on('click', '.remove-file-bt', $.proxy(this._onRemoveFileClick, this));
301
+ $('#exm-fileList').on('click', '.reload-ext-bt', $.proxy(this._onReloadExtClick, this));
302
+
303
+ //-------------------------------------------
304
+
305
+ // Initialize "add folder" modal
306
+ this._addFolderModal = $('#exm-addFolderModal');
307
+ this._addFolderModal.modal({
308
+ backdrop: 'static',
309
+ keyboard: false,
310
+ show: false
311
+ });
312
+
313
+ // Add listener to modal hide event
314
+ this._addFolderModal.on('hidden.bs.modal', $.proxy(this._onAddFolderModalHidden, this));
315
+
316
+ // Add listener to Add button click
317
+ $('#exm-addFolderBt').on('click', $.proxy(this._onAddFolderClick, this));
318
+
319
+ // Initialize kendo validation on folder name form
320
+ this._addFolderValidator = $('#exm-addFolderForm').kendoValidator({}).data('kendoValidator');
321
+
322
+ //-------------------------------------------
323
+
324
+ // Initialize "upload files" modal
325
+ this._uploadFilesModal = $('#exm-uploadModal');
326
+ this._uploadFilesModal.modal({
327
+ backdrop: 'static',
328
+ keyboard: false,
329
+ show: false
330
+ });
331
+
332
+ // Initialize kendo uploader
333
+ this._uploader = $('#exm-uploader').kendoUpload({
334
+ multiple: true,
335
+ async: {
336
+ saveUrl: 'http://localhost', // This will be changed later in _onUploadStart method
337
+ autoUpload: true,
338
+ },
339
+ directoryDrop: true,
340
+ upload: $.proxy(this._onUploadStart, this),
341
+ complete: $.proxy(this._onUploadEnd, this),
342
+ localization: {
343
+ select: 'Select files...'
344
+ }
345
+ }).data('kendoUpload');
346
+
347
+ // Add listener to Upload button click
348
+ $('#exm-clearFilesBt').on('click', $.proxy(this._onClearFilesClick, this));
349
+
350
+ //-------------------------------------------
351
+
352
+ // Send initialization request
353
+ this.sendExtensionRequest(this.REQ_INIT);
354
+ }
355
+
356
+ destroy()
357
+ {
358
+ // Call super method
359
+ super.destroy();
360
+
361
+ $('#exm-retryBt').off('click');
362
+ $('#exm-refreshBt').off('click');
363
+
364
+ $('#exm-fileList').off('click');
365
+
366
+ this._addFolderModal.off('hidden.bs.modal');
367
+ this._addFolderModal.modal('dispose');
368
+ $('#exm-addFolderBt').off('click');
369
+
370
+ this._uploadFilesModal.modal('dispose');
371
+ $('#exm-clearFilesBt').off('click');
372
+ }
373
+
374
+ onExtensionCommand(command, data)
375
+ {
376
+ // Module can be enabled (no locking file exists)
377
+ if (command == this.RESP_INIT)
378
+ {
379
+ // Retrieve file separator
380
+ this._fileSeparator = data.getUtfString('sep');
381
+
382
+ // Retrieve Extensions' __lib__ folder name
383
+ const libFolder = data.getUtfString('lib');
384
+
385
+ // Create file data source manager
386
+ this._fileManager = new _managers_file_datasource_manager__WEBPACK_IMPORTED_MODULE_1__["FileDataSourceManager"](libFolder, [libFolder], this._fileSeparator);
387
+
388
+ // Retrieve HTTP port to be used for files uploading
389
+ const uploadHttpPort = data.getInt('httpPort');
390
+
391
+ // Retrieve module id sent by the server (required because multiple modules use file uploading service)
392
+ const uploadModuleId = data.getUtfString('modId');
393
+
394
+ // Set file uploading target configuration
395
+ this._uploadTargetConfig = {
396
+ sessionToken: this.smartFox.sessionToken,
397
+ host: this.smartFox.config.host,
398
+ httpPort: uploadHttpPort,
399
+ moduleId: uploadModuleId,
400
+ };
401
+
402
+ // Request Extension files data to server instance
403
+ this._refreshDataList();
404
+ }
405
+
406
+ /*
407
+ * This response is returned if the file UploadsLock.txt exists in the /config folder of the server.
408
+ * This is an additional security measure to avoid unwanted files to be uploaded by malicius users accessing the server
409
+ * with the default credentials, in case they have not been changed by the administrator after the installation.
410
+ * The file must be removed manually before accessing the Extension Manager module for the first time
411
+ */
412
+ else if (command == this.RESP_LOCKED)
413
+ {
414
+ // Show warning
415
+ this._switchView('exm-locked');
416
+ }
417
+
418
+ // Extensions folders and files
419
+ else if (command == this.RESP_EXTENSIONS)
420
+ {
421
+ // Retrieve Extension file list
422
+ let extensionsObj = data.getSFSObject('extensions');
423
+
424
+ // Initialize manager
425
+ this._fileManager.init();
426
+
427
+ // Add list to manager
428
+ this._fileManager.addFile(extensionsObj);
429
+
430
+ // Set TreeList data source
431
+ this._filesList.setDataSource(this._fileManager.dataSource);
432
+
433
+ // Expand first level
434
+ this._filesList.expand($('#exm-fileList tbody>tr:eq(0)'));
435
+
436
+ // Enable interface
437
+ this._enableInterface(true);
438
+
439
+ // Show module's main view
440
+ this._switchView('exm-main');
441
+ }
442
+
443
+ // An error occurred while managing extension files
444
+ else if (command == this.RESP_ERROR)
445
+ {
446
+ // Hide add folder modal
447
+ this._addFolderModal.modal('hide');
448
+
449
+ // Re-enable interface
450
+ this._enableInterface(true);
451
+
452
+ // Show an alert
453
+ this.shellCtrl.showSimpleAlert(data.getUtfString('error'));
454
+ }
455
+
456
+ // Extension folder or file added
457
+ else if (command == this.RESP_FILE_ADDED)
458
+ {
459
+ // Get name of the user who added the file/folder
460
+ const requester = data.getUtfString('user');
461
+
462
+ // Get the object representing the file/folder being added
463
+ const fileObj = data.getSFSObject('file');
464
+
465
+ // Get the target folder where the new file/folder should be added
466
+ const parentPath = data.getUtfString('parent');
467
+
468
+ // Get the flag notifying this was a file upload
469
+ const isUpload = data.getBool('isUpload');
470
+
471
+ try
472
+ {
473
+ // Add/update item on data source
474
+ const filePath = this._fileManager.addFileToParent(fileObj, parentPath);
475
+
476
+ // Refresh view
477
+ this._filesList.refresh();
478
+
479
+ if (requester == this.smartFox.mySelf.name)
480
+ {
481
+ // Expand parent
482
+ this._filesList.expand($(`#exm-fileList .file-controls[data-item-id="${parentPath}"]`).closest('tr'));
483
+
484
+ if (!isUpload)
485
+ {
486
+ // Hide modal
487
+ this._addFolderModal.modal('hide');
488
+
489
+ // Select upload file
490
+ this._filesList.select($(`#exm-fileList .file-controls[data-item-id="${filePath}"]`).closest('tr'));
491
+ }
492
+
493
+ // Update selection
494
+ this._onFileSelectedChange();
495
+ }
496
+ else
497
+ {
498
+ // Display notification
499
+ if (!isUpload)
500
+ this.shellCtrl.showNotification(`Folder created`, `Administrator ${requester} created folder: <strong>${filePath}</strong>`);
501
+ else
502
+ this.shellCtrl.showNotification(`File uploaded`, `Administrator ${requester} uploaded file: <strong>${filePath}</strong>`);
503
+ }
504
+ }
505
+ catch (e)
506
+ {
507
+ // This should not happen... data source is corrupted?
508
+ if (requester == this.smartFox.mySelf.name)
509
+ this.shellCtrl.showSimpleAlert(e.message, true);
510
+ }
511
+
512
+ // Enable interface
513
+ this._enableInterface(true);
514
+ }
515
+
516
+ // Extension files deleted
517
+ else if (command == this.RESP_FILES_DELETED)
518
+ {
519
+ // Get name of the user who deleted the file/s
520
+ const requester = data.getUtfString('user');
521
+
522
+ // Get the list of deleted files
523
+ let files = data.getSFSArray('files');
524
+
525
+ let filesArr = [];
526
+
527
+ // Update data source
528
+ for (let j = 0; j < files.size(); j++)
529
+ {
530
+ let path = files.getUtfString(j);
531
+ filesArr.push(path);
532
+
533
+ //------------------------
534
+
535
+ // Remove item from data source; parent item is returned
536
+ let parentItem = this._fileManager.removeFile(path);
537
+
538
+ // Collapse parent if the last of its children was deleted
539
+ if (parentItem && !parentItem.hasChildren)
540
+ this._filesList.collapse($(`#exm-fileList .file-controls[data-item-id="${parentItem.id}"]`).closest('tr'));
541
+ }
542
+
543
+ if (requester == this.smartFox.mySelf.name)
544
+ {
545
+ // Display notification
546
+ this.shellCtrl.showNotification(`${this._selectedItem.isDir ? 'Folder' : 'File'} deleted`, `${this._selectedItem.isDir ? 'Folder' : 'File'} '${this._selectedItem.name}' deleted successfully`);
547
+
548
+ this._selectedItem = null;
549
+
550
+ this._enableInterface(true);
551
+ }
552
+ else
553
+ {
554
+ // Display notification
555
+ this.shellCtrl.showNotification(`File deleted`, `Administrator ${requester} deleted the following file${filesArr.length > 1 ? 's' : ''}: <strong>${filesArr.join('<br> ')}</strong>`);
556
+ }
557
+
558
+ // Reset selection
559
+ this._onFileSelectedChange();
560
+ }
561
+
562
+ // else if ()
563
+ }
564
+
565
+ //---------------------------------
566
+ // UI EVENT LISTENERS
567
+ //---------------------------------
568
+
569
+ _onRetryClick()
570
+ {
571
+ this._switchView('exm-init');
572
+
573
+ // Re-send initialization request
574
+ this.sendExtensionRequest(this.REQ_INIT);
575
+ }
576
+
577
+ _onRefreshClick()
578
+ {
579
+ this._filesList.clearSelection();
580
+ this._refreshDataList();
581
+ }
582
+
583
+ _onFileSelectedChange()
584
+ {
585
+ // Hide control buttons on currently selected item
586
+ if (this._selectedItem)
587
+ $(`#exm-fileList .file-controls[data-item-id="${this._selectedItem.id}"]`).hide();
588
+
589
+ // Get selected item
590
+ let selectedRows = this._filesList.select();
591
+
592
+ if (selectedRows.length > 0)
593
+ {
594
+ // Save ref. to selected item
595
+ this._selectedItem = this._filesList.dataItem(selectedRows[0]);
596
+
597
+ // Show control buttons on new selected item
598
+ $(`#exm-fileList .file-controls[data-item-id="${this._selectedItem.id}"]`).show();
599
+ }
600
+ else
601
+ this._selectedItem = null;
602
+ }
603
+
604
+ _showAddFolderModalClick()
605
+ {
606
+ if (this._selectedItem && this._selectedItem.isDir)
607
+ {
608
+ this._addFolderModal.modal('show');
609
+ $('#exm-folderNameIn').focus();
610
+ }
611
+ }
612
+
613
+ _onAddFolderClick()
614
+ {
615
+ // The parent folder could have been deleted while user is still typing the name of the new child folder
616
+ if (!this._selectedItem)
617
+ {
618
+ this._addFolderModal.modal('hide');
619
+ this.shellCtrl.showSimpleAlert('Unable to create folder; the parent folder doesn\'t exist.');
620
+ return;
621
+ }
622
+
623
+ if (this._addFolderValidator.validate())
624
+ {
625
+ // Disable modal interface
626
+ this._enableAddFolderModal(false);
627
+
628
+ let data = new SFS2X.SFSObject();
629
+ data.putUtfString('folder', this._selectedItem.id + this._fileSeparator + $('#exm-folderNameIn').val());
630
+
631
+ // Send request to server
632
+ this.sendExtensionRequest(this.REQ_CREATE_FOLDER, data);
633
+ }
634
+ }
635
+
636
+ _onAddFolderModalHidden()
637
+ {
638
+ $('#exm-folderNameIn').val('');
639
+ this._resetAddFolderValidation();
640
+
641
+ // Enable modal interface
642
+ this._enableAddFolderModal(true);
643
+ }
644
+
645
+ _showUploadFilesModalClick()
646
+ {
647
+ if (this._selectedItem)
648
+ this._uploadFilesModal.modal('show');
649
+ }
650
+
651
+ _onClearFilesClick()
652
+ {
653
+ this._uploader.clearAllFiles();
654
+ }
655
+
656
+ _onUploadStart(e)
657
+ {
658
+ // Disable clear button
659
+ $('#exm-clearFilesBt').attr('disabled', true);
660
+
661
+ // Set destination url
662
+ const url = 'http://' + this._uploadTargetConfig.host + ':' + this._uploadTargetConfig.httpPort + '/BlueBox/SFS2XFileUpload?sessHashId=' + this._uploadTargetConfig.sessionToken;
663
+
664
+ e.sender.options.async.saveUrl = url;
665
+
666
+ // Set payload
667
+ const params = new FormData();
668
+ params.append('__module', this._uploadTargetConfig.moduleId);
669
+ params.append('__target', this._selectedItem.id);
670
+
671
+ for (let f = 0; f < e.files.length; f++)
672
+ params.append('files[]', e.files[f].rawFile);
673
+
674
+ e.formData = params;
675
+ }
676
+
677
+ _onUploadEnd(e)
678
+ {
679
+ // Enable clear button
680
+ $('#exm-clearFilesBt').attr('disabled', false);
681
+ }
682
+
683
+ _onFilesUploadEnd(response)
684
+ {
685
+ // Nothing to do: we have to wait the upload process completion to be signaled by the server through the dedicated Extension response
686
+
687
+ //=================================================================
688
+
689
+ // TODO Should we handle this response in some way? For some unknown reason we always get ok=false and status=0
690
+ // console.log(response)
691
+ // console.log(response.ok)
692
+ // console.log(response.status)
693
+ }
694
+
695
+ _onRemoveFileClick()
696
+ {
697
+ if (this._selectedItem)
698
+ this.shellCtrl.showConfirmWarning(`Are you sure you want to delete the selected ${this._selectedItem.isDir ? 'folder' : 'file'}?<br><br>Path: <strong>${this._selectedItem.id}</strong>`, $.proxy(this._onRemoveFileConfirm, this));
699
+ }
700
+
701
+ _onRemoveFileConfirm()
702
+ {
703
+ // Disable interface
704
+ this._enableInterface(false);
705
+
706
+ // Request Extension files removal
707
+ // NOTE: for compatibility with older AdminTool, the file to be deleted is sent
708
+ // in an array of strings, even if we can't delete more than 1 file at once in this AdminTool
709
+
710
+ let files = new SFS2X.SFSArray();
711
+ files.addUtfString(this._selectedItem.id);
712
+
713
+ let params = new SFS2X.SFSObject();
714
+ params.putSFSArray('files', files);
715
+
716
+ this.sendExtensionRequest(this.REQ_DELETE_FILES, params);
717
+ }
718
+
719
+ _onReloadExtClick()
720
+ {
721
+ if (this._selectedItem)
722
+ {
723
+ let pathArr = this._selectedItem.id.split(this._fileSeparator);
724
+
725
+ if (pathArr.length > 1)
726
+ {
727
+ // Request Extension reload
728
+ // NOTE: for compatibility with older AdminTool, the Extension to be reloaded is sent
729
+ // in an array of strings, even if we can't reload more than 1 Extension at once in this AdminTool
730
+
731
+ let extToReload = [];
732
+ extToReload.push(pathArr[1]);
733
+
734
+ let params = new SFS2X.SFSObject();
735
+ params.putUtfStringArray('extensions', extToReload);
736
+
737
+ // Send request to server
738
+ this.sendExtensionRequest(this.REQ_RELOAD_EXTENSIONS, params);
739
+ }
740
+ }
741
+ }
742
+
743
+ //------------------------------------
744
+ // PRIVATE METHODS
745
+ //------------------------------------
746
+
747
+ _switchView(viewId)
748
+ {
749
+ document.getElementById('exm-viewstack').selectedElement = document.getElementById(viewId);
750
+ }
751
+
752
+ _enableInterface(enable)
753
+ {
754
+ $('#exm-fileList').attr('disabled', !enable);
755
+ $('#exm-refreshBt').attr('disabled', !enable);
756
+ }
757
+
758
+ _refreshDataList()
759
+ {
760
+ // Disable interface
761
+ this._enableInterface(false);
762
+
763
+ // Send request to server
764
+ this.sendExtensionRequest(this.REQ_GET_EXTENSIONS)
765
+ }
766
+
767
+ _resetAddFolderValidation()
768
+ {
769
+ this._addFolderValidator.hideMessages();
770
+
771
+ // The method above doesn't remove the k-invalid classes and aria-invalid="true" attributes from inputs
772
+ // Let's do it manually
773
+ $('#exm-addFolderForm .k-invalid').removeClass('k-invalid');
774
+ $('#exm-addFolderForm [aria-invalid="true"]').removeAttr('aria-invalid');
775
+ }
776
+
777
+ _enableAddFolderModal(enable)
778
+ {
779
+ // Disable modal close buttons
780
+ $('#exm-addFolderModal button[data-dismiss="modal"]').attr('disabled', !enable);
781
+
782
+ // Disable add button
783
+ $('#exm-addFolderBt').attr('disabled', !enable);
784
+
785
+ // Disable fieldset
786
+ $('#exm-addFolderForm').attr('disabled', !enable);
787
+ }
788
+
789
+ //---------------------------------
790
+ // PRIVATE GETTERS
791
+ //---------------------------------
792
+
793
+
794
+ }
795
+
796
+ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "jquery")))
797
+
798
+ /***/ })
799
+
800
+ }]);
801
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtNi5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tYW5hZ2Vycy9maWxlLWRhdGFzb3VyY2UtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL2V4dGVuc2lvbi1tYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBGaWxlRGF0YVNvdXJjZU1hbmFnZXJcbntcblx0Y29uc3RydWN0b3IobGliRm9sZGVyLCBwcm90ZWN0ZWRGb2xkZXJzLCBmaWxlU2VwYXJhdG9yKVxuXHR7XG5cdFx0dGhpcy5fcHJvdGVjdGVkRm9sZGVycyA9IHByb3RlY3RlZEZvbGRlcnM7IC8vIEZvbGRlcnMgd2hpY2ggY2FuJ3QgYmUgZGVsZXRlZCAoYnV0IHRoZWlyIGNvbnRlbnQgY2FuKVxuXHRcdHRoaXMuX2xpYkZvbGRlciA9IGxpYkZvbGRlcjtcblx0XHR0aGlzLl9maWxlU2VwYXJhdG9yID0gZmlsZVNlcGFyYXRvcjtcblx0fVxuXG5cdGdldCBkYXRhU291cmNlKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuXHR9XG5cblx0aW5pdCgpXG5cdHtcblx0XHR0aGlzLl9kYXRhU291cmNlID0gbmV3IGtlbmRvLmRhdGEuVHJlZUxpc3REYXRhU291cmNlKHtcblx0XHRcdGRhdGE6IFtdLFxuXHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0aWQ6ICdpZCcsXG5cdFx0XHRcdFx0cGFyZW50SWQ6ICdwYXJlbnRJZCcsXG5cdFx0XHRcdFx0ZXhwYW5kZWQ6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRzb3J0OiB7IGZpZWxkOiAnbmFtZScsIGRpcjogJ2FzYycgfVxuXHRcdH0pO1xuXHR9XG5cblx0YWRkRmlsZShmaWxlT2JqLCBwYXJlbnRMZXZlbCA9IG51bGwpXG5cdHtcblx0XHRsZXQgZmlsZSA9IHt9O1xuXG5cdFx0ZmlsZS5uYW1lID0gZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblx0XHRmaWxlLmlzRGlyID0gZmlsZU9iai5nZXRCb29sKCdpc0RpcicpO1xuXHRcdGZpbGUubGFzdE1vZCA9IGZpbGVPYmouZ2V0TG9uZygnbGFzdE1vZCcpO1xuXHRcdGZpbGUuaXNMaWIgPSAoZmlsZS5pc0RpciAmJiBmaWxlLm5hbWUgPT0gdGhpcy5fbGliRm9sZGVyKTtcblx0XHRmaWxlLmlzUHJvdGVjdGVkID0gKGZpbGUuaXNEaXIgJiYgdGhpcy5fcHJvdGVjdGVkRm9sZGVycy5pbmRleE9mKGZpbGUubmFtZSkgPiAtMSk7XG5cdFx0ZmlsZS5zaXplID0gMDtcblxuXHRcdGlmIChwYXJlbnRMZXZlbCA9PSBudWxsKVxuXHRcdFx0ZmlsZS5sZXZlbCA9IDA7XG5cdFx0ZWxzZVxuXHRcdFx0ZmlsZS5sZXZlbCA9IHBhcmVudExldmVsICsgMTtcblxuXHRcdGlmIChmaWxlT2JqLmNvbnRhaW5zS2V5KCdwYXJlbnQnKSlcblx0XHR7XG5cdFx0XHRmaWxlLnBhcmVudElkID0gZmlsZU9iai5nZXRVdGZTdHJpbmcoJ3BhcmVudCcpO1xuXHRcdFx0ZmlsZS5pZCA9IGZpbGUucGFyZW50SWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgZmlsZS5uYW1lO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0ZmlsZS5wYXJlbnRJZCA9IG51bGw7XG5cdFx0XHRmaWxlLmlkID0gZmlsZS5uYW1lO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBjaGlsZCBmaWxlc1xuXHRcdGlmIChmaWxlLmlzRGlyKVxuXHRcdHtcblx0XHRcdGxldCBmaWxlc0FyciA9IGZpbGVPYmouZ2V0U0ZTQXJyYXkoJ2ZpbGVzJyk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXNBcnIuc2l6ZSgpOyBpKyspXG5cdFx0XHRcdGZpbGUuc2l6ZSArPSB0aGlzLmFkZEZpbGUoZmlsZXNBcnIuZ2V0U0ZTT2JqZWN0KGkpLCBmaWxlLmxldmVsKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0ZmlsZS5zaXplID0gZmlsZU9iai5nZXRMb25nKCdzaXplJyk7XG5cblx0XHQvLyBBZGQgZmlsZSB0byBkYXRhIHNvdXJjZVxuXHRcdHRoaXMuX2RhdGFTb3VyY2UuYWRkKGZpbGUpO1xuXG5cdFx0Ly8gUmV0dXJuIGZpbGUgc2l6ZVxuXHRcdHJldHVybiBmaWxlLnNpemU7XG5cdH1cblxuXHRyZW1vdmVGaWxlKGlkKVxuXHR7XG5cdFx0bGV0IGZpbGVJdGVtID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQoaWQpO1xuXG5cdFx0aWYgKGZpbGVJdGVtKVxuXHRcdHtcblx0XHRcdGlmIChmaWxlSXRlbS5wYXJlbnRJZClcblx0XHRcdHtcblx0XHRcdFx0Ly8gU3VidHJhY3Qgb2xkIHNpemUgZnJvbSBwYXJlbnQgc2l6ZVxuXHRcdFx0XHRsZXQgcGFyZW50SXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJdGVtLnBhcmVudElkKTtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUGFyZW50U2l6ZShwYXJlbnRJdGVtLCAtZmlsZUl0ZW0uc2l6ZSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2RhdGFTb3VyY2UucmVtb3ZlKGZpbGVJdGVtKTtcblxuXHRcdFx0Ly8gUmV0dXJuIHBhcmVudCBpdGVtXG5cdFx0XHRpZiAoZmlsZUl0ZW0ucGFyZW50SWQpXG5cdFx0XHRcdHJldHVybiB0aGlzLl9kYXRhU291cmNlLmdldChmaWxlSXRlbS5wYXJlbnRJZCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0RmlsZUJ5SWQoaWQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZS5nZXQoaWQpO1xuXHR9XG5cblx0YWRkRmlsZVRvUGFyZW50KGZpbGVPYmosIHBhcmVudElkKVxuXHR7XG5cdFx0bGV0IHBhcmVudEl0ZW0gPSB0aGlzLl9kYXRhU291cmNlLmdldChwYXJlbnRJZCk7XG5cblx0XHRpZiAocGFyZW50SXRlbSAhPSBudWxsICYmIHBhcmVudEl0ZW0uaXNEaXIpXG5cdFx0e1xuXHRcdFx0Y29uc3QgZmlsZUlkID0gcGFyZW50SWQgKyB0aGlzLl9maWxlU2VwYXJhdG9yICsgZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKTtcblx0XHRcdGxldCBmaWxlSXRlbSA9IHRoaXMuX2RhdGFTb3VyY2UuZ2V0KGZpbGVJZCk7XG5cblx0XHRcdGlmIChmaWxlSXRlbSAhPSBudWxsKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTdWJ0cmFjdCBvbGQgc2l6ZSBmcm9tIHBhcmVudCBzaXplXG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgLWZpbGVJdGVtLnNpemUpO1xuXG5cdFx0XHRcdC8vIFVwZGF0ZSBleGlzdGluZyBpdGVtXG5cdFx0XHRcdGZpbGVJdGVtLm5hbWUgPSBmaWxlT2JqLmdldFV0ZlN0cmluZygnbmFtZScpO1xuXHRcdFx0XHRmaWxlSXRlbS5sYXN0TW9kID0gZmlsZU9iai5nZXRMb25nKCdsYXN0TW9kJyk7XG5cdFx0XHRcdGZpbGVJdGVtLnNpemUgPSBmaWxlT2JqLmdldExvbmcoJ3NpemUnKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gQWRkIG5ldyBpdGVtXG5cdFx0XHRcdHRoaXMuYWRkRmlsZShmaWxlT2JqLCBwYXJlbnRJdGVtLmxldmVsKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHBhcmVudCBpdGVtIHNpemVcblx0XHRcdHRoaXMuX3VwZGF0ZVBhcmVudFNpemUocGFyZW50SXRlbSwgZmlsZU9iai5nZXRMb25nKCdzaXplJykpO1xuXG5cdFx0XHRyZXR1cm4gZmlsZUlkO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRkaW5nIGZpbGUgJyR7ZmlsZU9iai5nZXRVdGZTdHJpbmcoJ25hbWUnKX0nICh0YXJnZXQ6ICR7cGFyZW50SWR9KS5gKTtcblx0fVxuXG5cdF91cGRhdGVQYXJlbnRTaXplKHBhcmVudEl0ZW0sIHZhbHVlKVxuXHR7XG5cdFx0cGFyZW50SXRlbS5zaXplICs9IHZhbHVlO1xuXG5cdFx0aWYgKHBhcmVudEl0ZW0ucGFyZW50SWQpXG5cdFx0e1xuXHRcdFx0bGV0IGdyYW5kUGFyZW50ID0gdGhpcy5fZGF0YVNvdXJjZS5nZXQocGFyZW50SXRlbS5wYXJlbnRJZCk7XG5cdFx0XHR0aGlzLl91cGRhdGVQYXJlbnRTaXplKGdyYW5kUGFyZW50LCB2YWx1ZSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQge0Jhc2VNb2R1bGV9IGZyb20gJy4vYmFzZS1tb2R1bGUnO1xuaW1wb3J0IHtGaWxlRGF0YVNvdXJjZU1hbmFnZXJ9IGZyb20gJy4uL21hbmFnZXJzL2ZpbGUtZGF0YXNvdXJjZS1tYW5hZ2VyJztcbmltcG9ydCB7Ynl0ZXNUb1NpemV9IGZyb20gJy4uL3V0aWxzL3V0aWxpdGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4dGVuc2lvbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2V4dGVuc2lvbk1hbicpO1xuXG5cdFx0Ly8gT3V0Z29pbmcgcmVxdWVzdHNcblx0XHR0aGlzLlJFUV9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVRX0dFVF9FWFRFTlNJT05TID0gJ2dldEV4dGVuc2lvbnMnO1xuXHRcdHRoaXMuUkVRX0NSRUFURV9GT0xERVIgPSAnY3JlYXRlRm9sZGVyJztcblx0XHR0aGlzLlJFUV9ERUxFVEVfRklMRVMgPSAnZGVsZXRlRXh0RmlsZXMnO1xuXHRcdHRoaXMuUkVRX1JFTE9BRF9FWFRFTlNJT05TID0gJ3JlbG9hZEV4dCc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfTE9DS0VEID0gJ2xvY2snO1xuXHRcdHRoaXMuUkVTUF9JTklUID0gJ2luaXQnO1xuXHRcdHRoaXMuUkVTUF9FWFRFTlNJT05TID0gJ2V4dGVuc2lvbnMnO1xuXHRcdHRoaXMuUkVTUF9GSUxFX0FEREVEID0gJ2ZpbGVBZGRlZCc7XG5cdFx0dGhpcy5SRVNQX0ZJTEVTX0RFTEVURUQgPSAnZmlsZXNEZWxldGVkJztcblx0XHR0aGlzLlJFU1BfRVJST1IgPSAnZXJyb3InO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBwcm9ncmVzcyBiYXJcblx0XHQkKCcjZXhtLXByb2dyZXNzQmFyJykua2VuZG9Qcm9ncmVzc0Jhcih7XG5cdFx0XHRtaW46IDAsXG4gICAgICAgICAgICBtYXg6IDEwMCxcblx0XHRcdHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsXG4gICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNDAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBidXR0b25zXG5cdFx0JCgnI2V4bS1yZXRyeUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJldHJ5Q2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjZXhtLXJlZnJlc2hCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUgZmlsZXMgbGlzdFxuXHRcdHRoaXMuX2ZpbGVzTGlzdCA9ICQoJyNleG0tZmlsZUxpc3QnKS5rZW5kb1RyZWVMaXN0KHtcbiAgICAgICAgICAgIGRhdGFTb3VyY2U6IFtdLFxuXHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICB7XG5cdFx0XHRcdFx0ZmllbGQ6ICduYW1lJyxcblx0XHRcdFx0XHR0aXRsZTogJ05hbWUnLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0XHQ8ZGl2ID5cblx0XHRcdFx0XHRcdFx0IyBpZiAoaXNEaXIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdCMgaWYgKGV4cGFuZGVkKSB7ICNcblx0XHRcdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFzIGZhLWZvbGRlci1vcGVuXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHRcdCMgfSBlbHNlIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGkgY2xhc3M9XCJmYXMgZmEtZm9sZGVyXCI+PC9pPlxuXHRcdFx0XHRcdFx0XHRcdCMgfSAjXG5cdFx0XHRcdFx0XHRcdCMgfSBlbHNlIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwiZmFyIGZhLWZpbGVcIj48L2k+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IzogbmFtZSAjXG5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZpbGUtY29udHJvbHMgZmxleC1ncm93LTEgdGV4dC1yaWdodFwiIGRhdGEtaXRlbS1pZD1cIiM6aWQjXCI+XG5cdFx0XHRcdFx0XHRcdCMgaWYgKGlzRGlyKSB7ICNcblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImstYnV0dG9uIGstcHJpbWFyeSBteS0xIGNyZWF0ZS1mb2xkZXItYnRcIj48aSBjbGFzcz1cImZhcyBmYS1mb2xkZXItcGx1c1wiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQjIGlmIChsZXZlbCA+IDApIHsgI1xuXHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJrLWJ1dHRvbiBrLXByaW1hcnkgbXktMSB1cGxvYWQtZmlsZXMtYnRcIj48aSBjbGFzcz1cImZhcyBmYS1maWxlLXVwbG9hZFwiPjwvaT48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXG5cdFx0XHRcdFx0XHRcdCMgaWYgKGxldmVsID4gMCAmJiAhaXNQcm90ZWN0ZWQpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgcmVtb3ZlLWZpbGUtYnRcIj48aSBjbGFzcz1cImZhcyBmYS1taW51cy1jaXJjbGVcIj48L2k+PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdCMgfSAjXG5cblx0XHRcdFx0XHRcdFx0IyBpZiAobGV2ZWwgPT0gMSAmJiAhaXNMaWIpIHsgI1xuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiay1idXR0b24gay1wcmltYXJ5IG15LTEgcmVsb2FkLWV4dC1idFwiPjxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQjIH0gI1xuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0YCksXG5cdFx0XHRcdH0sXG4gICAgICAgICAgICAgICAge1xuXHRcdFx0XHRcdGZpZWxkOiAnc2l6ZScsXG5cdFx0XHRcdFx0dGl0bGU6ICdTaXplJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0XHRcdGRhdGFJdGVtLmJ5dGVzVG9TaXplID0gYnl0ZXNUb1NpemU7IC8vIFBhc3MgYnl0ZXNUb1NpemUgdXRpbGl0eSBmdW5jdGlvbiB0byB0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGtlbmRvLnRlbXBsYXRlKGBcblx0XHRcdFx0XHRcdFx0IzogYnl0ZXNUb1NpemUoc2l6ZSwgMiwgJ0tCJykgI1xuXHRcdFx0XHRcdFx0YCkoZGF0YUl0ZW0pO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0d2lkdGg6IDEyMCxcblx0XHRcdFx0XHRtaW5TY3JlZW5XaWR0aDogNTc2XG5cdFx0XHRcdH0sXG4gICAgICAgICAgICAgICAge1xuXHRcdFx0XHRcdGZpZWxkOiAnbGFzdE1vZCcsXG5cdFx0XHRcdFx0dGl0bGU6ICdMYXN0IE1vZGlmaWVkJyxcblx0XHRcdFx0XHR0ZW1wbGF0ZToga2VuZG8udGVtcGxhdGUoYFxuXHRcdFx0XHRcdFx0Izoga2VuZG8udG9TdHJpbmcobmV3IERhdGUobGFzdE1vZCksICdkZCBNTU0geXl5eSBISDptbTpzcycpICNcblx0XHRcdFx0XHRgKSxcblx0XHRcdFx0XHR3aWR0aDogMjAwLFxuXHRcdFx0XHRcdG1pblNjcmVlbldpZHRoOiA3Njhcblx0XHRcdFx0fSxcbiAgICAgICAgICAgIF0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25GaWxlU2VsZWN0ZWRDaGFuZ2UsIHRoaXMpXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvVHJlZUxpc3QnKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBjYXRjaCBjb250cm9sIGJ1dHRvbiBjbGlja3Mgb24gcm93c1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5vbignY2xpY2snLCAnLmNyZWF0ZS1mb2xkZXItYnQnLCAkLnByb3h5KHRoaXMuX3Nob3dBZGRGb2xkZXJNb2RhbENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcudXBsb2FkLWZpbGVzLWJ0JywgJC5wcm94eSh0aGlzLl9zaG93VXBsb2FkRmlsZXNNb2RhbENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcucmVtb3ZlLWZpbGUtYnQnLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlRmlsZUNsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9uKCdjbGljaycsICcucmVsb2FkLWV4dC1idCcsICQucHJveHkodGhpcy5fb25SZWxvYWRFeHRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwiYWRkIGZvbGRlclwiIG1vZGFsXG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwgPSAkKCcjZXhtLWFkZEZvbGRlck1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBoaWRlIGV2ZW50XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25BZGRGb2xkZXJNb2RhbEhpZGRlbiwgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEFkZCBidXR0b24gY2xpY2tcblx0XHQkKCcjZXhtLWFkZEZvbGRlckJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkFkZEZvbGRlckNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvciA9ICQoJyNleG0tYWRkRm9sZGVyRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHQvLyBJbml0aWFsaXplIFwidXBsb2FkIGZpbGVzXCIgbW9kYWxcblx0XHR0aGlzLl91cGxvYWRGaWxlc01vZGFsID0gJCgnI2V4bS11cGxvYWRNb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZEZpbGVzTW9kYWwubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2Vcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdXBsb2FkZXJcblx0XHR0aGlzLl91cGxvYWRlciA9ICQoJyNleG0tdXBsb2FkZXInKS5rZW5kb1VwbG9hZCh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdGFzeW5jOiB7XG5cdFx0XHRcdHNhdmVVcmw6ICdodHRwOi8vbG9jYWxob3N0JywgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgbGF0ZXIgaW4gX29uVXBsb2FkU3RhcnQgbWV0aG9kXG5cdFx0XHRcdGF1dG9VcGxvYWQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0ZGlyZWN0b3J5RHJvcDogdHJ1ZSxcblx0XHRcdHVwbG9hZDogJC5wcm94eSh0aGlzLl9vblVwbG9hZFN0YXJ0LCB0aGlzKSxcblx0XHRcdGNvbXBsZXRlOiAkLnByb3h5KHRoaXMuX29uVXBsb2FkRW5kLCB0aGlzKSxcblx0XHRcdGxvY2FsaXphdGlvbjoge1xuXHRcdFx0XHRzZWxlY3Q6ICdTZWxlY3QgZmlsZXMuLi4nXG5cdFx0XHR9XG5cdFx0fSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBVcGxvYWQgYnV0dG9uIGNsaWNrXG5cdFx0JCgnI2V4bS1jbGVhckZpbGVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJGaWxlc0NsaWNrLCB0aGlzKSk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIFNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0JCgnI2V4bS1yZXRyeUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNleG0tcmVmcmVzaEJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCgnI2V4bS1maWxlTGlzdCcpLm9mZignY2xpY2snKTtcblxuXHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm9mZignaGlkZGVuLmJzLm1vZGFsJyk7XG5cdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ2Rpc3Bvc2UnKTtcblx0XHQkKCcjZXhtLWFkZEZvbGRlckJ0Jykub2ZmKCdjbGljaycpO1xuXG5cdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnZGlzcG9zZScpO1xuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0Jykub2ZmKCdjbGljaycpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBNb2R1bGUgY2FuIGJlIGVuYWJsZWQgKG5vIGxvY2tpbmcgZmlsZSBleGlzdHMpXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0lOSVQpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgZmlsZSBzZXBhcmF0b3Jcblx0XHRcdHRoaXMuX2ZpbGVTZXBhcmF0b3IgPSBkYXRhLmdldFV0ZlN0cmluZygnc2VwJyk7XG5cblx0XHRcdC8vIFJldHJpZXZlIEV4dGVuc2lvbnMnIF9fbGliX18gZm9sZGVyIG5hbWVcblx0XHRcdGNvbnN0IGxpYkZvbGRlciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdsaWInKTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGZpbGUgZGF0YSBzb3VyY2UgbWFuYWdlclxuXHRcdFx0dGhpcy5fZmlsZU1hbmFnZXIgPSBuZXcgRmlsZURhdGFTb3VyY2VNYW5hZ2VyKGxpYkZvbGRlciwgW2xpYkZvbGRlcl0sIHRoaXMuX2ZpbGVTZXBhcmF0b3IpO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSBIVFRQIHBvcnQgdG8gYmUgdXNlZCBmb3IgZmlsZXMgdXBsb2FkaW5nXG5cdFx0XHRjb25zdCB1cGxvYWRIdHRwUG9ydCA9IGRhdGEuZ2V0SW50KCdodHRwUG9ydCcpO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSBtb2R1bGUgaWQgc2VudCBieSB0aGUgc2VydmVyIChyZXF1aXJlZCBiZWNhdXNlIG11bHRpcGxlIG1vZHVsZXMgdXNlIGZpbGUgdXBsb2FkaW5nIHNlcnZpY2UpXG5cdFx0XHRjb25zdCB1cGxvYWRNb2R1bGVJZCA9IGRhdGEuZ2V0VXRmU3RyaW5nKCdtb2RJZCcpO1xuXG5cdFx0XHQvLyBTZXQgZmlsZSB1cGxvYWRpbmcgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cblx0XHRcdHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZyA9IHtcblx0XHRcdFx0c2Vzc2lvblRva2VuOiB0aGlzLnNtYXJ0Rm94LnNlc3Npb25Ub2tlbixcblx0XHRcdFx0aG9zdDogdGhpcy5zbWFydEZveC5jb25maWcuaG9zdCxcblx0XHRcdFx0aHR0cFBvcnQ6IHVwbG9hZEh0dHBQb3J0LFxuXHRcdFx0XHRtb2R1bGVJZDogdXBsb2FkTW9kdWxlSWQsXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBSZXF1ZXN0IEV4dGVuc2lvbiBmaWxlcyBkYXRhIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdFx0dGhpcy5fcmVmcmVzaERhdGFMaXN0KCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBUaGlzIHJlc3BvbnNlIGlzIHJldHVybmVkIGlmIHRoZSBmaWxlIFVwbG9hZHNMb2NrLnR4dCBleGlzdHMgaW4gdGhlIC9jb25maWcgZm9sZGVyIG9mIHRoZSBzZXJ2ZXIuXG5cdFx0ICogVGhpcyBpcyBhbiBhZGRpdGlvbmFsIHNlY3VyaXR5IG1lYXN1cmUgdG8gYXZvaWQgdW53YW50ZWQgZmlsZXMgdG8gYmUgdXBsb2FkZWQgYnkgbWFsaWNpdXMgdXNlcnMgYWNjZXNzaW5nIHRoZSBzZXJ2ZXJcblx0XHQgKiB3aXRoIHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBub3QgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBhZG1pbmlzdHJhdG9yIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24uXG5cdFx0ICogVGhlIGZpbGUgbXVzdCBiZSByZW1vdmVkIG1hbnVhbGx5IGJlZm9yZSBhY2Nlc3NpbmcgdGhlIEV4dGVuc2lvbiBNYW5hZ2VyIG1vZHVsZSBmb3IgdGhlIGZpcnN0IHRpbWVcblx0XHQgKi9cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9MT0NLRUQpXG5cdFx0e1xuXHRcdFx0Ly8gU2hvdyB3YXJuaW5nXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdleG0tbG9ja2VkJyk7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0ZW5zaW9ucyBmb2xkZXJzIGFuZCBmaWxlc1xuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0VYVEVOU0lPTlMpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgRXh0ZW5zaW9uIGZpbGUgbGlzdFxuXHRcdFx0bGV0IGV4dGVuc2lvbnNPYmogPSBkYXRhLmdldFNGU09iamVjdCgnZXh0ZW5zaW9ucycpO1xuXG5cdFx0XHQvLyBJbml0aWFsaXplIG1hbmFnZXJcblx0XHRcdHRoaXMuX2ZpbGVNYW5hZ2VyLmluaXQoKTtcblxuXHRcdFx0Ly8gQWRkIGxpc3QgdG8gbWFuYWdlclxuXHRcdFx0dGhpcy5fZmlsZU1hbmFnZXIuYWRkRmlsZShleHRlbnNpb25zT2JqKTtcblxuXHRcdFx0Ly8gU2V0IFRyZWVMaXN0IGRhdGEgc291cmNlXG5cdFx0XHR0aGlzLl9maWxlc0xpc3Quc2V0RGF0YVNvdXJjZSh0aGlzLl9maWxlTWFuYWdlci5kYXRhU291cmNlKTtcblxuXHRcdFx0Ly8gRXhwYW5kIGZpcnN0IGxldmVsXG5cdFx0XHR0aGlzLl9maWxlc0xpc3QuZXhwYW5kKCQoJyNleG0tZmlsZUxpc3QgdGJvZHk+dHI6ZXEoMCknKSk7XG5cblx0XHRcdC8vIEVuYWJsZSBpbnRlcmZhY2Vcblx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSh0cnVlKTtcblxuXHRcdFx0Ly8gU2hvdyBtb2R1bGUncyBtYWluIHZpZXdcblx0XHRcdHRoaXMuX3N3aXRjaFZpZXcoJ2V4bS1tYWluJyk7XG5cdFx0fVxuXG5cdFx0Ly8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbWFuYWdpbmcgZXh0ZW5zaW9uIGZpbGVzXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRVJST1IpXG5cdFx0e1xuXHRcdFx0Ly8gSGlkZSBhZGQgZm9sZGVyIG1vZGFsXG5cdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHQvLyBSZS1lbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdC8vIFNob3cgYW4gYWxlcnRcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChkYXRhLmdldFV0ZlN0cmluZygnZXJyb3InKSk7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0ZW5zaW9uIGZvbGRlciBvciBmaWxlIGFkZGVkXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfRklMRV9BRERFRClcblx0XHR7XG5cdFx0XHQvLyBHZXQgbmFtZSBvZiB0aGUgdXNlciB3aG8gYWRkZWQgdGhlIGZpbGUvZm9sZGVyXG5cdFx0XHRjb25zdCByZXF1ZXN0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpbGUvZm9sZGVyIGJlaW5nIGFkZGVkXG5cdFx0XHRjb25zdCBmaWxlT2JqID0gZGF0YS5nZXRTRlNPYmplY3QoJ2ZpbGUnKTtcblxuXHRcdFx0Ly8gR2V0IHRoZSB0YXJnZXQgZm9sZGVyIHdoZXJlIHRoZSBuZXcgZmlsZS9mb2xkZXIgc2hvdWxkIGJlIGFkZGVkXG5cdFx0XHRjb25zdCBwYXJlbnRQYXRoID0gZGF0YS5nZXRVdGZTdHJpbmcoJ3BhcmVudCcpO1xuXG5cdFx0XHQvLyBHZXQgdGhlIGZsYWcgbm90aWZ5aW5nIHRoaXMgd2FzIGEgZmlsZSB1cGxvYWRcblx0XHRcdGNvbnN0IGlzVXBsb2FkID0gZGF0YS5nZXRCb29sKCdpc1VwbG9hZCcpO1xuXG5cdFx0XHR0cnlcblx0XHRcdHtcblx0XHRcdFx0Ly8gQWRkL3VwZGF0ZSBpdGVtIG9uIGRhdGEgc291cmNlXG5cdFx0XHRcdGNvbnN0IGZpbGVQYXRoID0gdGhpcy5fZmlsZU1hbmFnZXIuYWRkRmlsZVRvUGFyZW50KGZpbGVPYmosIHBhcmVudFBhdGgpO1xuXG5cdFx0XHRcdC8vIFJlZnJlc2ggdmlld1xuXHRcdFx0XHR0aGlzLl9maWxlc0xpc3QucmVmcmVzaCgpO1xuXG5cdFx0XHRcdGlmIChyZXF1ZXN0ZXIgPT0gdGhpcy5zbWFydEZveC5teVNlbGYubmFtZSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIEV4cGFuZCBwYXJlbnRcblx0XHRcdFx0XHR0aGlzLl9maWxlc0xpc3QuZXhwYW5kKCQoYCNleG0tZmlsZUxpc3QgLmZpbGUtY29udHJvbHNbZGF0YS1pdGVtLWlkPVwiJHtwYXJlbnRQYXRofVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXG5cdFx0XHRcdFx0aWYgKCFpc1VwbG9hZClcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQvLyBIaWRlIG1vZGFsXG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRGb2xkZXJNb2RhbC5tb2RhbCgnaGlkZScpO1xuXG5cdFx0XHRcdFx0XHQvLyBTZWxlY3QgdXBsb2FkIGZpbGVcblx0XHRcdFx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5zZWxlY3QoJChgI2V4bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke2ZpbGVQYXRofVwiXWApLmNsb3Nlc3QoJ3RyJykpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBzZWxlY3Rpb25cblx0XHRcdFx0XHR0aGlzLl9vbkZpbGVTZWxlY3RlZENoYW5nZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIERpc3BsYXkgbm90aWZpY2F0aW9uXG5cdFx0XHRcdFx0aWYgKCFpc1VwbG9hZClcblx0XHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dOb3RpZmljYXRpb24oYEZvbGRlciBjcmVhdGVkYCwgYEFkbWluaXN0cmF0b3IgJHtyZXF1ZXN0ZXJ9IGNyZWF0ZWQgZm9sZGVyOiA8c3Ryb25nPiR7ZmlsZVBhdGh9PC9zdHJvbmc+YCk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgRmlsZSB1cGxvYWRlZGAsIGBBZG1pbmlzdHJhdG9yICR7cmVxdWVzdGVyfSB1cGxvYWRlZCBmaWxlOiA8c3Ryb25nPiR7ZmlsZVBhdGh9PC9zdHJvbmc+YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNhdGNoIChlKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLi4uIGRhdGEgc291cmNlIGlzIGNvcnJ1cHRlZD9cblx0XHRcdFx0aWYgKHJlcXVlc3RlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydChlLm1lc3NhZ2UsIHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFbmFibGUgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0Ly8gRXh0ZW5zaW9uIGZpbGVzIGRlbGV0ZWRcblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9GSUxFU19ERUxFVEVEKVxuXHRcdHtcblx0XHRcdC8vIEdldCBuYW1lIG9mIHRoZSB1c2VyIHdobyBkZWxldGVkIHRoZSBmaWxlL3Ncblx0XHRcdGNvbnN0IHJlcXVlc3RlciA9IGRhdGEuZ2V0VXRmU3RyaW5nKCd1c2VyJyk7XG5cblx0XHRcdC8vIEdldCB0aGUgbGlzdCBvZiBkZWxldGVkIGZpbGVzXG5cdFx0XHRsZXQgZmlsZXMgPSBkYXRhLmdldFNGU0FycmF5KCdmaWxlcycpO1xuXG5cdFx0XHRsZXQgZmlsZXNBcnIgPSBbXTtcblxuXHRcdFx0Ly8gVXBkYXRlIGRhdGEgc291cmNlXG5cdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGZpbGVzLnNpemUoKTsgaisrKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgcGF0aCA9IGZpbGVzLmdldFV0ZlN0cmluZyhqKTtcblx0XHRcdFx0ZmlsZXNBcnIucHVzaChwYXRoKTtcblxuXHRcdFx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0XHRcdC8vIFJlbW92ZSBpdGVtIGZyb20gZGF0YSBzb3VyY2U7IHBhcmVudCBpdGVtIGlzIHJldHVybmVkXG5cdFx0XHRcdGxldCBwYXJlbnRJdGVtID0gdGhpcy5fZmlsZU1hbmFnZXIucmVtb3ZlRmlsZShwYXRoKTtcblxuXHRcdFx0XHQvLyBDb2xsYXBzZSBwYXJlbnQgaWYgdGhlIGxhc3Qgb2YgaXRzIGNoaWxkcmVuIHdhcyBkZWxldGVkXG5cdFx0XHRcdGlmIChwYXJlbnRJdGVtICYmICFwYXJlbnRJdGVtLmhhc0NoaWxkcmVuKVxuXHRcdFx0XHRcdHRoaXMuX2ZpbGVzTGlzdC5jb2xsYXBzZSgkKGAjZXhtLWZpbGVMaXN0IC5maWxlLWNvbnRyb2xzW2RhdGEtaXRlbS1pZD1cIiR7cGFyZW50SXRlbS5pZH1cIl1gKS5jbG9zZXN0KCd0cicpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJlcXVlc3RlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBEaXNwbGF5IG5vdGlmaWNhdGlvblxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Tm90aWZpY2F0aW9uKGAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdGb2xkZXInIDogJ0ZpbGUnfSBkZWxldGVkYCwgYCR7dGhpcy5fc2VsZWN0ZWRJdGVtLmlzRGlyID8gJ0ZvbGRlcicgOiAnRmlsZSd9ICcke3RoaXMuX3NlbGVjdGVkSXRlbS5uYW1lfScgZGVsZXRlZCBzdWNjZXNzZnVsbHlgKTtcblxuXHRcdFx0XHR0aGlzLl9zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXG5cdFx0XHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZSh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbihgRmlsZSBkZWxldGVkYCwgYEFkbWluaXN0cmF0b3IgJHtyZXF1ZXN0ZXJ9IGRlbGV0ZWQgdGhlIGZvbGxvd2luZyBmaWxlJHtmaWxlc0Fyci5sZW5ndGggPiAxID8gJ3MnIDogJyd9OiA8c3Ryb25nPiR7ZmlsZXNBcnIuam9pbignPGJyPiAnKX08L3N0cm9uZz5gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzZXQgc2VsZWN0aW9uXG5cdFx0XHR0aGlzLl9vbkZpbGVTZWxlY3RlZENoYW5nZSgpO1xuXHRcdH1cblxuXHRcdC8vIGVsc2UgaWYgKClcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9vblJldHJ5Q2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fc3dpdGNoVmlldygnZXhtLWluaXQnKTtcblxuXHRcdC8vIFJlLXNlbmQgaW5pdGlhbGl6YXRpb24gcmVxdWVzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfSU5JVCk7XG5cdH1cblxuXHRfb25SZWZyZXNoQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fZmlsZXNMaXN0LmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0dGhpcy5fcmVmcmVzaERhdGFMaXN0KCk7XG5cdH1cblxuXHRfb25GaWxlU2VsZWN0ZWRDaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gSGlkZSBjb250cm9sIGJ1dHRvbnMgb24gY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1cblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0JChgI2V4bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke3RoaXMuX3NlbGVjdGVkSXRlbS5pZH1cIl1gKS5oaWRlKCk7XG5cblx0XHQvLyBHZXQgc2VsZWN0ZWQgaXRlbVxuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9maWxlc0xpc3Quc2VsZWN0KCk7XG5cblx0XHRpZiAoc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0Ly8gU2F2ZSByZWYuIHRvIHNlbGVjdGVkIGl0ZW1cblx0XHRcdHRoaXMuX3NlbGVjdGVkSXRlbSA9IHRoaXMuX2ZpbGVzTGlzdC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbMF0pO1xuXG5cdFx0XHQvLyBTaG93IGNvbnRyb2wgYnV0dG9ucyBvbiBuZXcgc2VsZWN0ZWQgaXRlbVxuXHRcdFx0JChgI2V4bS1maWxlTGlzdCAuZmlsZS1jb250cm9sc1tkYXRhLWl0ZW0taWQ9XCIke3RoaXMuX3NlbGVjdGVkSXRlbS5pZH1cIl1gKS5zaG93KCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuX3NlbGVjdGVkSXRlbSA9IG51bGw7XG5cdH1cblxuXHRfc2hvd0FkZEZvbGRlck1vZGFsQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlbGVjdGVkSXRlbSAmJiB0aGlzLl9zZWxlY3RlZEl0ZW0uaXNEaXIpXG5cdFx0e1xuXHRcdFx0dGhpcy5fYWRkRm9sZGVyTW9kYWwubW9kYWwoJ3Nob3cnKTtcblx0XHRcdCQoJyNleG0tZm9sZGVyTmFtZUluJykuZm9jdXMoKTtcblx0XHR9XG5cdH1cblxuXHRfb25BZGRGb2xkZXJDbGljaygpXG5cdHtcblx0XHQvLyBUaGUgcGFyZW50IGZvbGRlciBjb3VsZCBoYXZlIGJlZW4gZGVsZXRlZCB3aGlsZSB1c2VyIGlzIHN0aWxsIHR5cGluZyB0aGUgbmFtZSBvZiB0aGUgbmV3IGNoaWxkIGZvbGRlclxuXHRcdGlmICghdGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdHtcblx0XHRcdHRoaXMuX2FkZEZvbGRlck1vZGFsLm1vZGFsKCdoaWRlJyk7XG5cdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoJ1VuYWJsZSB0byBjcmVhdGUgZm9sZGVyOyB0aGUgcGFyZW50IGZvbGRlciBkb2VzblxcJ3QgZXhpc3QuJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvci52YWxpZGF0ZSgpKVxuXHRcdHtcblx0XHRcdC8vIERpc2FibGUgbW9kYWwgaW50ZXJmYWNlXG5cdFx0XHR0aGlzLl9lbmFibGVBZGRGb2xkZXJNb2RhbChmYWxzZSk7XG5cblx0XHRcdGxldCBkYXRhID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0ZGF0YS5wdXRVdGZTdHJpbmcoJ2ZvbGRlcicsIHRoaXMuX3NlbGVjdGVkSXRlbS5pZCArIHRoaXMuX2ZpbGVTZXBhcmF0b3IgKyAkKCcjZXhtLWZvbGRlck5hbWVJbicpLnZhbCgpKTtcblxuXHRcdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9DUkVBVEVfRk9MREVSLCBkYXRhKTtcblx0XHR9XG5cdH1cblxuXHRfb25BZGRGb2xkZXJNb2RhbEhpZGRlbigpXG5cdHtcblx0XHQkKCcjZXhtLWZvbGRlck5hbWVJbicpLnZhbCgnJyk7XG5cdFx0dGhpcy5fcmVzZXRBZGRGb2xkZXJWYWxpZGF0aW9uKCk7XG5cblx0XHQvLyBFbmFibGUgbW9kYWwgaW50ZXJmYWNlXG5cdFx0dGhpcy5fZW5hYmxlQWRkRm9sZGVyTW9kYWwodHJ1ZSk7XG5cdH1cblxuXHRfc2hvd1VwbG9hZEZpbGVzTW9kYWxDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0dGhpcy5fdXBsb2FkRmlsZXNNb2RhbC5tb2RhbCgnc2hvdycpO1xuXHR9XG5cblx0X29uQ2xlYXJGaWxlc0NsaWNrKClcblx0e1xuXHRcdHRoaXMuX3VwbG9hZGVyLmNsZWFyQWxsRmlsZXMoKTtcblx0fVxuXG5cdF9vblVwbG9hZFN0YXJ0KGUpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0JykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcblxuXHRcdC8vIFNldCBkZXN0aW5hdGlvbiB1cmxcblx0XHRjb25zdCB1cmwgPSAnaHR0cDovLycgKyB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcuaG9zdCArICc6JyArIHRoaXMuX3VwbG9hZFRhcmdldENvbmZpZy5odHRwUG9ydCArICcvQmx1ZUJveC9TRlMyWEZpbGVVcGxvYWQ/c2Vzc0hhc2hJZD0nICsgdGhpcy5fdXBsb2FkVGFyZ2V0Q29uZmlnLnNlc3Npb25Ub2tlbjtcblxuXHRcdGUuc2VuZGVyLm9wdGlvbnMuYXN5bmMuc2F2ZVVybCA9IHVybDtcblxuXHRcdC8vIFNldCBwYXlsb2FkXG5cdFx0Y29uc3QgcGFyYW1zID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0cGFyYW1zLmFwcGVuZCgnX19tb2R1bGUnLCB0aGlzLl91cGxvYWRUYXJnZXRDb25maWcubW9kdWxlSWQpO1xuXHRcdHBhcmFtcy5hcHBlbmQoJ19fdGFyZ2V0JywgdGhpcy5fc2VsZWN0ZWRJdGVtLmlkKTtcblxuXHRcdGZvciAobGV0IGYgPSAwOyBmIDwgZS5maWxlcy5sZW5ndGg7IGYrKylcblx0XHRcdHBhcmFtcy5hcHBlbmQoJ2ZpbGVzW10nLCBlLmZpbGVzW2ZdLnJhd0ZpbGUpO1xuXG5cdFx0ZS5mb3JtRGF0YSA9IHBhcmFtcztcblx0fVxuXG5cdF9vblVwbG9hZEVuZChlKVxuXHR7XG5cdFx0Ly8gRW5hYmxlIGNsZWFyIGJ1dHRvblxuXHRcdCQoJyNleG0tY2xlYXJGaWxlc0J0JykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cdH1cblxuXHRfb25GaWxlc1VwbG9hZEVuZChyZXNwb25zZSlcblx0e1xuXHRcdC8vIE5vdGhpbmcgdG8gZG86IHdlIGhhdmUgdG8gd2FpdCB0aGUgdXBsb2FkIHByb2Nlc3MgY29tcGxldGlvbiB0byBiZSBzaWduYWxlZCBieSB0aGUgc2VydmVyIHRocm91Z2ggdGhlIGRlZGljYXRlZCBFeHRlbnNpb24gcmVzcG9uc2VcblxuXHRcdC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXHRcdC8vIFRPRE8gU2hvdWxkIHdlIGhhbmRsZSB0aGlzIHJlc3BvbnNlIGluIHNvbWUgd2F5PyBGb3Igc29tZSB1bmtub3duIHJlYXNvbiB3ZSBhbHdheXMgZ2V0IG9rPWZhbHNlIGFuZCBzdGF0dXM9MFxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLm9rKVxuXHRcdC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlLnN0YXR1cylcblx0fVxuXG5cdF9vblJlbW92ZUZpbGVDbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJdGVtKVxuXHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCAke3RoaXMuX3NlbGVjdGVkSXRlbS5pc0RpciA/ICdmb2xkZXInIDogJ2ZpbGUnfT88YnI+PGJyPlBhdGg6IDxzdHJvbmc+JHt0aGlzLl9zZWxlY3RlZEl0ZW0uaWR9PC9zdHJvbmc+YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUZpbGVDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25SZW1vdmVGaWxlQ29uZmlybSgpXG5cdHtcblx0XHQvLyBEaXNhYmxlIGludGVyZmFjZVxuXHRcdHRoaXMuX2VuYWJsZUludGVyZmFjZShmYWxzZSk7XG5cblx0XHQvLyBSZXF1ZXN0IEV4dGVuc2lvbiBmaWxlcyByZW1vdmFsXG5cdFx0Ly8gTk9URTogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBBZG1pblRvb2wsIHRoZSBmaWxlIHRvIGJlIGRlbGV0ZWQgaXMgc2VudFxuXHRcdC8vIGluIGFuIGFycmF5IG9mIHN0cmluZ3MsIGV2ZW4gaWYgd2UgY2FuJ3QgZGVsZXRlIG1vcmUgdGhhbiAxIGZpbGUgYXQgb25jZSBpbiB0aGlzIEFkbWluVG9vbFxuXG5cdFx0bGV0IGZpbGVzID0gbmV3IFNGUzJYLlNGU0FycmF5KCk7XG5cdFx0ZmlsZXMuYWRkVXRmU3RyaW5nKHRoaXMuX3NlbGVjdGVkSXRlbS5pZCk7XG5cblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdHBhcmFtcy5wdXRTRlNBcnJheSgnZmlsZXMnLCBmaWxlcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0RFTEVURV9GSUxFUywgcGFyYW1zKTtcblx0fVxuXG5cdF9vblJlbG9hZEV4dENsaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWxlY3RlZEl0ZW0pXG5cdFx0e1xuXHRcdFx0bGV0IHBhdGhBcnIgPSB0aGlzLl9zZWxlY3RlZEl0ZW0uaWQuc3BsaXQodGhpcy5fZmlsZVNlcGFyYXRvcik7XG5cblx0XHRcdGlmIChwYXRoQXJyLmxlbmd0aCA+IDEpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJlcXVlc3QgRXh0ZW5zaW9uIHJlbG9hZFxuXHRcdFx0XHQvLyBOT1RFOiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIEFkbWluVG9vbCwgdGhlIEV4dGVuc2lvbiB0byBiZSByZWxvYWRlZCBpcyBzZW50XG5cdFx0XHRcdC8vIGluIGFuIGFycmF5IG9mIHN0cmluZ3MsIGV2ZW4gaWYgd2UgY2FuJ3QgcmVsb2FkIG1vcmUgdGhhbiAxIEV4dGVuc2lvbiBhdCBvbmNlIGluIHRoaXMgQWRtaW5Ub29sXG5cblx0XHRcdFx0bGV0IGV4dFRvUmVsb2FkID0gW107XG5cdFx0XHRcdGV4dFRvUmVsb2FkLnB1c2gocGF0aEFyclsxXSk7XG5cblx0XHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCdleHRlbnNpb25zJywgZXh0VG9SZWxvYWQpO1xuXG5cdFx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRUxPQURfRVhURU5TSU9OUywgcGFyYW1zKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfc3dpdGNoVmlldyh2aWV3SWQpXG5cdHtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhtLXZpZXdzdGFjaycpLnNlbGVjdGVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXdJZCk7XG5cdH1cblxuXHRfZW5hYmxlSW50ZXJmYWNlKGVuYWJsZSlcblx0e1xuXHRcdCQoJyNleG0tZmlsZUxpc3QnKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXHRcdCQoJyNleG0tcmVmcmVzaEJ0JykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0fVxuXG5cdF9yZWZyZXNoRGF0YUxpc3QoKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBpbnRlcmZhY2Vcblx0XHR0aGlzLl9lbmFibGVJbnRlcmZhY2UoZmFsc2UpO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIHNlcnZlclxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0VYVEVOU0lPTlMpXG5cdH1cblxuXHRfcmVzZXRBZGRGb2xkZXJWYWxpZGF0aW9uKClcblx0e1xuXHRcdHRoaXMuX2FkZEZvbGRlclZhbGlkYXRvci5oaWRlTWVzc2FnZXMoKTtcblxuXHRcdC8vIFRoZSBtZXRob2QgYWJvdmUgZG9lc24ndCByZW1vdmUgdGhlIGstaW52YWxpZCBjbGFzc2VzIGFuZCBhcmlhLWludmFsaWQ9XCJ0cnVlXCIgYXR0cmlidXRlcyBmcm9tIGlucHV0c1xuXHRcdC8vIExldCdzIGRvIGl0IG1hbnVhbGx5XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtIC5rLWludmFsaWQnKS5yZW1vdmVDbGFzcygnay1pbnZhbGlkJyk7XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtIFthcmlhLWludmFsaWQ9XCJ0cnVlXCJdJykucmVtb3ZlQXR0cignYXJpYS1pbnZhbGlkJyk7XG5cdH1cblxuXHRfZW5hYmxlQWRkRm9sZGVyTW9kYWwoZW5hYmxlKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBtb2RhbCBjbG9zZSBidXR0b25zXG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJNb2RhbCBidXR0b25bZGF0YS1kaXNtaXNzPVwibW9kYWxcIl0nKS5hdHRyKCdkaXNhYmxlZCcsICFlbmFibGUpO1xuXG5cdFx0Ly8gRGlzYWJsZSBhZGQgYnV0dG9uXG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJCdCcpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZSk7XG5cblx0XHQvLyBEaXNhYmxlIGZpZWxkc2V0XG5cdFx0JCgnI2V4bS1hZGRGb2xkZXJGb3JtJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlKTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoSkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==