@openziti/ziti-console-lib 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (705) hide show
  1. package/README.md +24 -0
  2. package/assets/animations/ConstructionZiggy.json +15233 -0
  3. package/assets/animations/HelloZiggy.json +10008 -0
  4. package/assets/animations/SmartZiggy.json +9488 -0
  5. package/assets/components/add.html +1 -0
  6. package/assets/components/api.html +12 -0
  7. package/assets/components/customtags.html +4 -0
  8. package/assets/components/line.html +1 -0
  9. package/assets/components/noitems.html +1 -0
  10. package/assets/components/save.html +4 -0
  11. package/assets/components/search.html +8 -0
  12. package/assets/components/tabIdentities.html +6 -0
  13. package/assets/components/tabPolicies.html +7 -0
  14. package/assets/components/tabRouters.html +5 -0
  15. package/assets/components/tabServers.html +4 -0
  16. package/assets/components/tabServices.html +5 -0
  17. package/assets/components/tabSessions.html +4 -0
  18. package/assets/data/mail.json +0 -0
  19. package/assets/data/services.json +6 -0
  20. package/assets/data/settings.json +25 -0
  21. package/assets/data/site.json +31 -0
  22. package/assets/data/tags.json +7 -0
  23. package/assets/data/templates.json +1 -0
  24. package/assets/fonts/OpenSans-Regular.ttf +0 -0
  25. package/assets/fonts/OpenSans-Regular.woff +0 -0
  26. package/assets/fonts/OpenSans-Regular.woff2 +0 -0
  27. package/assets/fonts/RussoOne-Regular.ttf +0 -0
  28. package/assets/fonts/RussoOne-Regular.woff +0 -0
  29. package/assets/fonts/RussoOne-Regular.woff2 +0 -0
  30. package/assets/fonts/zac.eot +0 -0
  31. package/assets/fonts/zac.svg +55 -0
  32. package/assets/fonts/zac.ttf +0 -0
  33. package/assets/fonts/zac.woff +0 -0
  34. package/assets/fonts/zac.woff2 +0 -0
  35. package/assets/html/api-sessions.htm +153 -0
  36. package/assets/html/attributes.htm +260 -0
  37. package/assets/html/auth-policies.htm +410 -0
  38. package/assets/html/cas.htm +445 -0
  39. package/assets/html/config-types.htm +168 -0
  40. package/assets/html/configs.htm +238 -0
  41. package/assets/html/deprecated/fabric-links.htm +336 -0
  42. package/assets/html/deprecated/fabric-routers.htm +72 -0
  43. package/assets/html/deprecated/fabric-services.htm +494 -0
  44. package/assets/html/identities.htm +934 -0
  45. package/assets/html/index.htm +161 -0
  46. package/assets/html/jwt-signers.htm +260 -0
  47. package/assets/html/known.htm +115 -0
  48. package/assets/html/login.htm +131 -0
  49. package/assets/html/organization.htm +223 -0
  50. package/assets/html/posture-checks.htm +393 -0
  51. package/assets/html/profile.htm +52 -0
  52. package/assets/html/recipes.htm +455 -0
  53. package/assets/html/router-policies.htm +168 -0
  54. package/assets/html/routers.htm +323 -0
  55. package/assets/html/servers.htm +236 -0
  56. package/assets/html/service-policies.htm +197 -0
  57. package/assets/html/service-router-policies.htm +170 -0
  58. package/assets/html/services.htm +634 -0
  59. package/assets/html/sessions.htm +157 -0
  60. package/assets/html/settings.htm +146 -0
  61. package/assets/html/terminators.htm +244 -0
  62. package/assets/html/transit-routers.htm +173 -0
  63. package/assets/icons/android-icon-192x192.png +0 -0
  64. package/assets/icons/apple-icon-114x114.png +0 -0
  65. package/assets/icons/apple-icon-120x120.png +0 -0
  66. package/assets/icons/apple-icon-144x144.png +0 -0
  67. package/assets/icons/apple-icon-152x152.png +0 -0
  68. package/assets/icons/apple-icon-180x180.png +0 -0
  69. package/assets/icons/apple-icon-57x57.png +0 -0
  70. package/assets/icons/apple-icon-60x60.png +0 -0
  71. package/assets/icons/apple-icon-72x72.png +0 -0
  72. package/assets/icons/apple-icon-76x76.png +0 -0
  73. package/assets/icons/apple-icon-precomposed.png +0 -0
  74. package/assets/icons/favicon-16x16.png +0 -0
  75. package/assets/icons/favicon-32x32.png +0 -0
  76. package/assets/icons/favicon-96x96.png +0 -0
  77. package/assets/icons/favicon.ico +0 -0
  78. package/assets/icons/ms-icon-144x144.png +0 -0
  79. package/assets/images/Filter.png +0 -0
  80. package/assets/images/Login.jpg +0 -0
  81. package/assets/images/SortDown.png +0 -0
  82. package/assets/images/SortUp.png +0 -0
  83. package/assets/images/android.png +0 -0
  84. package/assets/images/anywhere.png +0 -0
  85. package/assets/images/apple.png +0 -0
  86. package/assets/images/bug.png +0 -0
  87. package/assets/images/check.png +0 -0
  88. package/assets/images/error.png +0 -0
  89. package/assets/images/info.png +0 -0
  90. package/assets/images/linux.png +0 -0
  91. package/assets/images/other.png +0 -0
  92. package/assets/images/scrollbar.png +0 -0
  93. package/assets/images/select.png +0 -0
  94. package/assets/images/success.png +0 -0
  95. package/assets/images/visualizer/ER.png +0 -0
  96. package/assets/images/visualizer/Routers.png +0 -0
  97. package/assets/images/visualizer/er_error.png +0 -0
  98. package/assets/images/visualizer/error_er.png +0 -0
  99. package/assets/images/visualizer/host-error.png +0 -0
  100. package/assets/images/visualizer/host.png +0 -0
  101. package/assets/images/visualizer/host_unregistered.png +0 -0
  102. package/assets/images/visualizer/link-cut.png +0 -0
  103. package/assets/images/visualizer/service.png +0 -0
  104. package/assets/images/visualizer/unregistered.png +0 -0
  105. package/assets/images/warning.png +0 -0
  106. package/assets/images/windows.png +0 -0
  107. package/assets/languages/en-us.json +330 -0
  108. package/assets/resources/avatar/man.svg +78 -0
  109. package/assets/resources/avatar/woman.svg +96 -0
  110. package/assets/resources/icon/analysis.svg +104 -0
  111. package/assets/resources/icon/appwans.svg +20 -0
  112. package/assets/resources/icon/architecture.svg +1 -0
  113. package/assets/resources/icon/bike.svg +94 -0
  114. package/assets/resources/icon/bus.svg +64 -0
  115. package/assets/resources/icon/cas.svg +46 -0
  116. package/assets/resources/icon/clusters.svg +28 -0
  117. package/assets/resources/icon/computer.svg +1 -0
  118. package/assets/resources/icon/data.svg +1 -0
  119. package/assets/resources/icon/delivery-truck.svg +1 -0
  120. package/assets/resources/icon/explosion.svg +81 -0
  121. package/assets/resources/icon/fabricServices.svg +31 -0
  122. package/assets/resources/icon/fabrics.svg +136 -0
  123. package/assets/resources/icon/front.svg +83 -0
  124. package/assets/resources/icon/gateway.svg +49 -0
  125. package/assets/resources/icon/gear.svg +122 -0
  126. package/assets/resources/icon/house.svg +72 -0
  127. package/assets/resources/icon/language.svg +1 -0
  128. package/assets/resources/icon/objective.svg +55 -0
  129. package/assets/resources/icon/route.svg +97 -0
  130. package/assets/resources/icon/routers.svg +27 -0
  131. package/assets/resources/icon/startup.svg +112 -0
  132. package/assets/resources/icon/switch.svg +101 -0
  133. package/assets/scripts/chart.min.js +7 -0
  134. package/assets/scripts/commands.js +112 -0
  135. package/assets/scripts/components/codemirror/codemirror.css +356 -0
  136. package/assets/scripts/components/codemirror/codemirror.js +9741 -0
  137. package/assets/scripts/components/codemirror/modes/addons/closetags.js +200 -0
  138. package/assets/scripts/components/codemirror/modes/addons/colorize.js +40 -0
  139. package/assets/scripts/components/codemirror/modes/addons/css-hint.js +66 -0
  140. package/assets/scripts/components/codemirror/modes/addons/formatting.js +124 -0
  141. package/assets/scripts/components/codemirror/modes/addons/html-hint.js +366 -0
  142. package/assets/scripts/components/codemirror/modes/addons/javascript-hint.js +159 -0
  143. package/assets/scripts/components/codemirror/modes/addons/show-hint.css +36 -0
  144. package/assets/scripts/components/codemirror/modes/addons/show-hint.js +482 -0
  145. package/assets/scripts/components/codemirror/modes/css.js +831 -0
  146. package/assets/scripts/components/codemirror/modes/htmlmixed.js +152 -0
  147. package/assets/scripts/components/codemirror/modes/javascript.js +930 -0
  148. package/assets/scripts/components/codemirror/modes/xml.js +413 -0
  149. package/assets/scripts/components/column.css +184 -0
  150. package/assets/scripts/components/column.js +165 -0
  151. package/assets/scripts/components/flows.css +0 -0
  152. package/assets/scripts/components/flows.js +48 -0
  153. package/assets/scripts/components/leaflet/images/layers-2x.png +0 -0
  154. package/assets/scripts/components/leaflet/images/layers.png +0 -0
  155. package/assets/scripts/components/leaflet/images/marker-icon-2x.png +0 -0
  156. package/assets/scripts/components/leaflet/images/marker-icon.png +0 -0
  157. package/assets/scripts/components/leaflet/images/marker-shadow.png +0 -0
  158. package/assets/scripts/components/leaflet/leaflet-src.esm.js +13926 -0
  159. package/assets/scripts/components/leaflet/leaflet-src.esm.js.map +1 -0
  160. package/assets/scripts/components/leaflet/leaflet-src.js +14020 -0
  161. package/assets/scripts/components/leaflet/leaflet-src.js.map +1 -0
  162. package/assets/scripts/components/leaflet/leaflet.css +640 -0
  163. package/assets/scripts/components/leaflet/leaflet.js +5 -0
  164. package/assets/scripts/components/leaflet/leaflet.js.map +1 -0
  165. package/assets/scripts/components/moment.js +4602 -0
  166. package/assets/scripts/components/multiselect.js +333 -0
  167. package/assets/scripts/components/network/img/network/acceptDeleteIcon.png +0 -0
  168. package/assets/scripts/components/network/img/network/addNodeIcon.png +0 -0
  169. package/assets/scripts/components/network/img/network/backIcon.png +0 -0
  170. package/assets/scripts/components/network/img/network/connectIcon.png +0 -0
  171. package/assets/scripts/components/network/img/network/cross.png +0 -0
  172. package/assets/scripts/components/network/img/network/cross2.png +0 -0
  173. package/assets/scripts/components/network/img/network/deleteIcon.png +0 -0
  174. package/assets/scripts/components/network/img/network/downArrow.png +0 -0
  175. package/assets/scripts/components/network/img/network/editIcon.png +0 -0
  176. package/assets/scripts/components/network/img/network/leftArrow.png +0 -0
  177. package/assets/scripts/components/network/img/network/minus.png +0 -0
  178. package/assets/scripts/components/network/img/network/plus.png +0 -0
  179. package/assets/scripts/components/network/img/network/rightArrow.png +0 -0
  180. package/assets/scripts/components/network/img/network/upArrow.png +0 -0
  181. package/assets/scripts/components/network/img/network/zoomExtends.png +0 -0
  182. package/assets/scripts/components/network/types/DOMutil.d.ts +99 -0
  183. package/assets/scripts/components/network/types/index-legacy-bundle.d.ts +4 -0
  184. package/assets/scripts/components/network/types/index-legacy-bundle.d.ts.map +1 -0
  185. package/assets/scripts/components/network/types/index-legacy.d.ts +24 -0
  186. package/assets/scripts/components/network/types/index-legacy.d.ts.map +1 -0
  187. package/assets/scripts/components/network/types/index-peer.d.ts +11 -0
  188. package/assets/scripts/components/network/types/index-peer.d.ts.map +1 -0
  189. package/assets/scripts/components/network/types/index-standalone.d.ts +7 -0
  190. package/assets/scripts/components/network/types/index-standalone.d.ts.map +1 -0
  191. package/assets/scripts/components/network/types/module/hammer.d.ts +2 -0
  192. package/assets/scripts/components/network/types/module/moment.d.ts +2 -0
  193. package/assets/scripts/components/network/types/network/Images.d.ts +2 -0
  194. package/assets/scripts/components/network/types/network/Network.d.ts +1030 -0
  195. package/assets/scripts/components/network/types/network/dotparser.d.ts +2 -0
  196. package/assets/scripts/components/network/types/network/gephiParser.d.ts +80 -0
  197. package/assets/scripts/components/network/types/network/gephiParser.d.ts.map +1 -0
  198. package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-dynamic.d.ts +55 -0
  199. package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-dynamic.d.ts.map +1 -0
  200. package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-static.d.ts +37 -0
  201. package/assets/scripts/components/network/types/network/modules/components/edges/bezier-edge-static.d.ts.map +1 -0
  202. package/assets/scripts/components/network/types/network/modules/components/edges/cubic-bezier-edge.d.ts +32 -0
  203. package/assets/scripts/components/network/types/network/modules/components/edges/cubic-bezier-edge.d.ts.map +1 -0
  204. package/assets/scripts/components/network/types/network/modules/components/edges/index.d.ts +10 -0
  205. package/assets/scripts/components/network/types/network/modules/components/edges/index.d.ts.map +1 -0
  206. package/assets/scripts/components/network/types/network/modules/components/edges/straight-edge.d.ts +26 -0
  207. package/assets/scripts/components/network/types/network/modules/components/edges/straight-edge.d.ts.map +1 -0
  208. package/assets/scripts/components/network/types/network/modules/components/edges/util/bezier-edge-base.d.ts +68 -0
  209. package/assets/scripts/components/network/types/network/modules/components/edges/util/bezier-edge-base.d.ts.map +1 -0
  210. package/assets/scripts/components/network/types/network/modules/components/edges/util/cubic-bezier-edge-base.d.ts +38 -0
  211. package/assets/scripts/components/network/types/network/modules/components/edges/util/cubic-bezier-edge-base.d.ts.map +1 -0
  212. package/assets/scripts/components/network/types/network/modules/components/edges/util/edge-base.d.ts +248 -0
  213. package/assets/scripts/components/network/types/network/modules/components/edges/util/edge-base.d.ts.map +1 -0
  214. package/assets/scripts/components/network/types/network/modules/components/edges/util/end-points.d.ts +58 -0
  215. package/assets/scripts/components/network/types/network/modules/components/edges/util/end-points.d.ts.map +1 -0
  216. package/assets/scripts/components/network/types/network/modules/components/edges/util/types.d.ts +196 -0
  217. package/assets/scripts/components/network/types/network/modules/components/edges/util/types.d.ts.map +1 -0
  218. package/assets/scripts/components/network/types/network/modules/layout-engine/index.d.ts +32 -0
  219. package/assets/scripts/components/network/types/network/modules/layout-engine/index.d.ts.map +1 -0
  220. package/assets/scripts/components/network/types/network/options.d.ts +2 -0
  221. package/assets/scripts/components/network/types/network/shapes.d.ts +122 -0
  222. package/assets/scripts/components/network/types/network/shapes.d.ts.map +1 -0
  223. package/assets/scripts/components/network/vis-network.css +716 -0
  224. package/assets/scripts/components/network/vis-network.esm.js +58974 -0
  225. package/assets/scripts/components/network/vis-network.esm.js.map +1 -0
  226. package/assets/scripts/components/network/vis-network.esm.min.js +53 -0
  227. package/assets/scripts/components/network/vis-network.esm.min.js.map +1 -0
  228. package/assets/scripts/components/network/vis-network.js +58994 -0
  229. package/assets/scripts/components/network/vis-network.js.map +1 -0
  230. package/assets/scripts/components/network/vis-network.min.css +1 -0
  231. package/assets/scripts/components/network/vis-network.min.js +53 -0
  232. package/assets/scripts/components/network/vis-network.min.js.map +1 -0
  233. package/assets/scripts/components/qrcode.min.js +1 -0
  234. package/assets/scripts/components/resources.js +26 -0
  235. package/assets/scripts/components/selector-new.js +300 -0
  236. package/assets/scripts/components/selector.js +300 -0
  237. package/assets/scripts/components/spectrum.js +2323 -0
  238. package/assets/scripts/components/timezone.js +1545 -0
  239. package/assets/scripts/components/uploader.js +74 -0
  240. package/assets/scripts/context.js +177 -0
  241. package/assets/scripts/dragging.js +58 -0
  242. package/assets/scripts/forms/forms.js +74 -0
  243. package/assets/scripts/forms/host.v1.htm +43 -0
  244. package/assets/scripts/forms/intercept.v1.htm +0 -0
  245. package/assets/scripts/forms/schema.js +693 -0
  246. package/assets/scripts/growler.js +133 -0
  247. package/assets/scripts/header.js +163 -0
  248. package/assets/scripts/jquery-3.6.3.min.js +2 -0
  249. package/assets/scripts/jquery.datetimepicker.js +2930 -0
  250. package/assets/scripts/locale.js +47 -0
  251. package/assets/scripts/modal.js +65 -0
  252. package/assets/scripts/model/data.js +558 -0
  253. package/assets/scripts/model/fabric.js +55 -0
  254. package/assets/scripts/model/fabricServices.js +45 -0
  255. package/assets/scripts/model/known.js +43 -0
  256. package/assets/scripts/model/links.js +44 -0
  257. package/assets/scripts/model/routers.js +51 -0
  258. package/assets/scripts/model/series.js +70 -0
  259. package/assets/scripts/model/sessions.js +61 -0
  260. package/assets/scripts/model/settings.js +60 -0
  261. package/assets/scripts/model/summary.js +49 -0
  262. package/assets/scripts/model/tags.js +330 -0
  263. package/assets/scripts/model/templates.js +42 -0
  264. package/assets/scripts/model/user.js +40 -0
  265. package/assets/scripts/restrictions.js +34 -0
  266. package/assets/scripts/service.js +76 -0
  267. package/assets/scripts/validation-tools.js +5119 -0
  268. package/assets/scripts/ziti.js +372 -0
  269. package/assets/styles/chart.min.css +1 -0
  270. package/assets/styles/dark.css +52 -0
  271. package/assets/styles/datetimepicker.css +1 -0
  272. package/assets/styles/forms.css +521 -0
  273. package/assets/styles/global.scss +890 -0
  274. package/assets/styles/growler.css +190 -0
  275. package/assets/styles/header.css +232 -0
  276. package/assets/styles/icons.css +160 -0
  277. package/assets/styles/navigation.css +183 -0
  278. package/assets/styles/select2.css +481 -0
  279. package/assets/styles/spectrum.css +507 -0
  280. package/assets/styles/tables.css +424 -0
  281. package/assets/styles/tooltip.css +134 -0
  282. package/assets/styles/ziti.css +3216 -0
  283. package/assets/svgs/Advanced.svg +89 -0
  284. package/assets/svgs/ArrowDown.svg +15 -0
  285. package/assets/svgs/ArrowDownDark.svg +15 -0
  286. package/assets/svgs/Confirm_Trash.svg +42 -0
  287. package/assets/svgs/DownloadKey.svg +50 -0
  288. package/assets/svgs/Filter.svg +13 -0
  289. package/assets/svgs/Growl_Bug.svg +47 -0
  290. package/assets/svgs/Growl_Error.svg +41 -0
  291. package/assets/svgs/Growl_Info.svg +45 -0
  292. package/assets/svgs/Growl_Success.svg +34 -0
  293. package/assets/svgs/Growl_Warning.svg +44 -0
  294. package/assets/svgs/MainMenuBlankUser.svg +14 -0
  295. package/assets/svgs/MainMenuNetworks.svg +37 -0
  296. package/assets/svgs/MainMenuNotifications.svg +32 -0
  297. package/assets/svgs/MainMenuOrg.svg +68 -0
  298. package/assets/svgs/MainMenuPlus.svg +13 -0
  299. package/assets/svgs/MainMenuSearch.svg +22 -0
  300. package/assets/svgs/MainMenuSupport.svg +417 -0
  301. package/assets/svgs/No_Clients.svg +94 -0
  302. package/assets/svgs/No_Plus.svg +30 -0
  303. package/assets/svgs/No_Routers.svg +56 -0
  304. package/assets/svgs/Resize.svg +33 -0
  305. package/assets/svgs/Simple.svg +62 -0
  306. package/assets/svgs/appwans.svg +20 -0
  307. package/assets/svgs/cas.svg +46 -0
  308. package/assets/svgs/cert.svg +69 -0
  309. package/assets/svgs/clear.svg +13 -0
  310. package/assets/svgs/close.svg +14 -0
  311. package/assets/svgs/clusters.svg +28 -0
  312. package/assets/svgs/copy.svg +64 -0
  313. package/assets/svgs/dashboard.svg +32 -0
  314. package/assets/svgs/dial.svg +83 -0
  315. package/assets/svgs/docs.svg +95 -0
  316. package/assets/svgs/downloads.svg +74 -0
  317. package/assets/svgs/fabricServices.svg +31 -0
  318. package/assets/svgs/fabrics.svg +134 -0
  319. package/assets/svgs/gateways.svg +49 -0
  320. package/assets/svgs/heart.svg +1 -0
  321. package/assets/svgs/ids.svg +20 -0
  322. package/assets/svgs/infoicon.svg +14 -0
  323. package/assets/svgs/lock.svg +12 -0
  324. package/assets/svgs/minus.svg +11 -0
  325. package/assets/svgs/nodata.svg +27 -0
  326. package/assets/svgs/qr.svg +56 -0
  327. package/assets/svgs/refresh.svg +24 -0
  328. package/assets/svgs/routers.svg +31 -0
  329. package/assets/svgs/select.svg +18 -0
  330. package/assets/svgs/services.svg +19 -0
  331. package/assets/svgs/settings.svg +1 -0
  332. package/assets/svgs/upload.svg +55 -0
  333. package/assets/templates/footer.htm +183 -0
  334. package/assets/templates/header.htm +298 -0
  335. package/assets/vectors/certificates.svg +1 -0
  336. package/assets/vectors/change.svg +1 -0
  337. package/assets/vectors/configuration.svg +2 -0
  338. package/assets/vectors/customize.svg +1 -0
  339. package/assets/vectors/dashboard.svg +1 -0
  340. package/assets/vectors/edgepolicies.svg +2 -0
  341. package/assets/vectors/globe.svg +63 -0
  342. package/assets/vectors/help.svg +48 -0
  343. package/assets/vectors/identity.svg +1 -0
  344. package/assets/vectors/notify.svg +1 -0
  345. package/assets/vectors/plus.svg +1 -0
  346. package/assets/vectors/posture.svg +1 -0
  347. package/assets/vectors/profile.svg +1 -0
  348. package/assets/vectors/router.svg +1 -0
  349. package/assets/vectors/routerpolicies.svg +1 -0
  350. package/assets/vectors/schema.svg +1 -0
  351. package/assets/vectors/server (1).svg +293 -0
  352. package/assets/vectors/servers.svg +103 -0
  353. package/assets/vectors/servicepolicy.svg +1 -0
  354. package/assets/vectors/services.svg +126 -0
  355. package/assets/vectors/settings.svg +130 -0
  356. package/assets/vectors/terminators.svg +1 -0
  357. package/assets/vectors/transitrouter.svg +1 -0
  358. package/esm2022/lib/app.initializer.mjs +24 -0
  359. package/esm2022/lib/features/card/card.component.mjs +29 -0
  360. package/esm2022/lib/features/card-list/card-list.component.mjs +50 -0
  361. package/esm2022/lib/features/config-editor/config-editor.component.mjs +239 -0
  362. package/esm2022/lib/features/confirm/confirm.component.mjs +59 -0
  363. package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +92 -0
  364. package/esm2022/lib/features/custom-tags/custom-tags.component.mjs +77 -0
  365. package/esm2022/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.mjs +47 -0
  366. package/esm2022/lib/features/data-table/cells/table-cell-select/table-cell-select.component.mjs +46 -0
  367. package/esm2022/lib/features/data-table/cells/table-cell-token/table-cell-token.component.mjs +124 -0
  368. package/esm2022/lib/features/data-table/column-headers/table-column-default/table-column-default.component.mjs +269 -0
  369. package/esm2022/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.mjs +94 -0
  370. package/esm2022/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.mjs +38 -0
  371. package/esm2022/lib/features/data-table/column-headers/table-column-select/table-column-select.component.mjs +34 -0
  372. package/esm2022/lib/features/data-table/data-table-filter.service.mjs +66 -0
  373. package/esm2022/lib/features/data-table/data-table.component.mjs +848 -0
  374. package/esm2022/lib/features/data-table/data-table.service.mjs +99 -0
  375. package/esm2022/lib/features/data-table/table-filter-bar/filter-bar.component.mjs +95 -0
  376. package/esm2022/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.mjs +27 -0
  377. package/esm2022/lib/features/data-table/tooltips/os-tooltip.component.mjs +30 -0
  378. package/esm2022/lib/features/data-table/tooltips/sdk-tooltip.component.mjs +35 -0
  379. package/esm2022/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.mjs +73 -0
  380. package/esm2022/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.mjs +131 -0
  381. package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.mjs +169 -0
  382. package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.mjs +51 -0
  383. package/esm2022/lib/features/dynamic-widgets/number/number-input.component.mjs +74 -0
  384. package/esm2022/lib/features/dynamic-widgets/object/object.component.mjs +122 -0
  385. package/esm2022/lib/features/dynamic-widgets/password/password-input.component.mjs +72 -0
  386. package/esm2022/lib/features/dynamic-widgets/port-ranges/port-ranges.component.mjs +98 -0
  387. package/esm2022/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.mjs +180 -0
  388. package/esm2022/lib/features/dynamic-widgets/selector/selector-input.component.mjs +104 -0
  389. package/esm2022/lib/features/dynamic-widgets/string/string-input.component.mjs +72 -0
  390. package/esm2022/lib/features/dynamic-widgets/text-list/text-list-input.component.mjs +119 -0
  391. package/esm2022/lib/features/extendable/extendable.component.mjs +56 -0
  392. package/esm2022/lib/features/extendable/extensions-noop.service.mjs +50 -0
  393. package/esm2022/lib/features/json-view/json-view.component.mjs +197 -0
  394. package/esm2022/lib/features/list-page-features/list-page-form/list-page-form.component.mjs +139 -0
  395. package/esm2022/lib/features/list-page-features/list-page-header/list-page-header.component.mjs +48 -0
  396. package/esm2022/lib/features/loading-indicator/loading-indicator.component.mjs +21 -0
  397. package/esm2022/lib/features/messaging/growler.component.mjs +63 -0
  398. package/esm2022/lib/features/messaging/growler.model.mjs +24 -0
  399. package/esm2022/lib/features/messaging/growler.module.mjs +35 -0
  400. package/esm2022/lib/features/messaging/growler.service.mjs +72 -0
  401. package/esm2022/lib/features/messaging/logger.service.mjs +175 -0
  402. package/esm2022/lib/features/no-items/no-items.component.mjs +47 -0
  403. package/esm2022/lib/features/overrides/overrides.component.mjs +119 -0
  404. package/esm2022/lib/features/overrides/overrides.service.mjs +115 -0
  405. package/esm2022/lib/features/preview-list/preview-list.component.mjs +91 -0
  406. package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +223 -0
  407. package/esm2022/lib/features/projectable-forms/configuration/configuration.service.mjs +150 -0
  408. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +188 -0
  409. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.service.mjs +131 -0
  410. package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +72 -0
  411. package/esm2022/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.mjs +55 -0
  412. package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +96 -0
  413. package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +322 -0
  414. package/esm2022/lib/features/projectable-forms/identity/identity-form.service.mjs +144 -0
  415. package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +172 -0
  416. package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +240 -0
  417. package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +453 -0
  418. package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +680 -0
  419. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +252 -0
  420. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.service.mjs +214 -0
  421. package/esm2022/lib/features/qr-code/qr-code.component.mjs +143 -0
  422. package/esm2022/lib/features/reset-enrollment/reset-enrollment.component.mjs +87 -0
  423. package/esm2022/lib/features/reset-enrollment/reset-enrollment.service.mjs +62 -0
  424. package/esm2022/lib/features/side-modal/side-modal.component.mjs +46 -0
  425. package/esm2022/lib/features/sidebars/side-banner/side-banner.component.mjs +17 -0
  426. package/esm2022/lib/features/sidebars/side-navbar/side-navbar.component.mjs +55 -0
  427. package/esm2022/lib/features/sidebars/side-toolbar/side-toolbar.component.mjs +128 -0
  428. package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +292 -0
  429. package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.component.mjs +588 -0
  430. package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.helper.mjs +370 -0
  431. package/esm2022/lib/features/wrappers/node-wrapper.service.mjs +51 -0
  432. package/esm2022/lib/features/wrappers/zac-wrapper-service.class.mjs +92 -0
  433. package/esm2022/lib/features/wrappers/zac-wrapper.component.mjs +147 -0
  434. package/esm2022/lib/features/wrappers/zac-wrapper.service.mjs +937 -0
  435. package/esm2022/lib/models/config.mjs +9 -0
  436. package/esm2022/lib/models/edge-router.mjs +13 -0
  437. package/esm2022/lib/models/identity.mjs +34 -0
  438. package/esm2022/lib/models/service-policy.mjs +12 -0
  439. package/esm2022/lib/models/service.mjs +12 -0
  440. package/esm2022/lib/pages/configurations/configurations-page.component.mjs +102 -0
  441. package/esm2022/lib/pages/configurations/configurations-page.service.mjs +246 -0
  442. package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +149 -0
  443. package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +361 -0
  444. package/esm2022/lib/pages/identities/identities-page.component.mjs +233 -0
  445. package/esm2022/lib/pages/identities/identities-page.service.mjs +498 -0
  446. package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +132 -0
  447. package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +457 -0
  448. package/esm2022/lib/pages/services/services-page.component.mjs +141 -0
  449. package/esm2022/lib/pages/services/services-page.service.mjs +215 -0
  450. package/esm2022/lib/safe.pipe.mjs +19 -0
  451. package/esm2022/lib/services/console-events.service.mjs +32 -0
  452. package/esm2022/lib/services/csv-download.service.mjs +92 -0
  453. package/esm2022/lib/services/deactivate-guard.service.mjs +18 -0
  454. package/esm2022/lib/services/login-service.class.mjs +28 -0
  455. package/esm2022/lib/services/node-data.service.mjs +292 -0
  456. package/esm2022/lib/services/noop-login.service.mjs +45 -0
  457. package/esm2022/lib/services/schema.service.mjs +808 -0
  458. package/esm2022/lib/services/settings-service.class.mjs +131 -0
  459. package/esm2022/lib/services/settings.service.mjs +193 -0
  460. package/esm2022/lib/services/tab-name.service.mjs +65 -0
  461. package/esm2022/lib/services/validation.service.mjs +124 -0
  462. package/esm2022/lib/services/ziti-controller-data.service.mjs +260 -0
  463. package/esm2022/lib/services/ziti-data.service.mjs +54 -0
  464. package/esm2022/lib/services/ziti-domain-controller.service.mjs +3 -0
  465. package/esm2022/lib/shared/list-page-component.class.mjs +145 -0
  466. package/esm2022/lib/shared/list-page-service.class.mjs +151 -0
  467. package/esm2022/lib/version.mjs +4 -0
  468. package/esm2022/lib/zac-routing.module.mjs +41 -0
  469. package/esm2022/lib/ziti-console-lib.module.mjs +364 -0
  470. package/esm2022/lib/ziti-console.constants.mjs +19 -0
  471. package/esm2022/openziti-ziti-console-lib.mjs +5 -0
  472. package/esm2022/public-api.mjs +71 -0
  473. package/fesm2022/openziti-ziti-console-lib.mjs +15813 -0
  474. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -0
  475. package/index.d.ts +6 -0
  476. package/lib/app.initializer.d.ts +3 -0
  477. package/lib/app.initializer.d.ts.map +1 -0
  478. package/lib/features/card/card.component.d.ts +11 -0
  479. package/lib/features/card/card.component.d.ts.map +1 -0
  480. package/lib/features/card-list/card-list.component.d.ts +23 -0
  481. package/lib/features/card-list/card-list.component.d.ts.map +1 -0
  482. package/lib/features/config-editor/config-editor.component.d.ts +39 -0
  483. package/lib/features/config-editor/config-editor.component.d.ts.map +1 -0
  484. package/lib/features/confirm/confirm.component.d.ts +23 -0
  485. package/lib/features/confirm/confirm.component.d.ts.map +1 -0
  486. package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts +31 -0
  487. package/lib/features/creation-summary-dialog/creation-summary-dialog.component.d.ts.map +1 -0
  488. package/lib/features/custom-tags/custom-tags.component.d.ts +20 -0
  489. package/lib/features/custom-tags/custom-tags.component.d.ts.map +1 -0
  490. package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts +16 -0
  491. package/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.d.ts.map +1 -0
  492. package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts +19 -0
  493. package/lib/features/data-table/cells/table-cell-select/table-cell-select.component.d.ts.map +1 -0
  494. package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts +22 -0
  495. package/lib/features/data-table/cells/table-cell-token/table-cell-token.component.d.ts.map +1 -0
  496. package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts +52 -0
  497. package/lib/features/data-table/column-headers/table-column-default/table-column-default.component.d.ts.map +1 -0
  498. package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts +27 -0
  499. package/lib/features/data-table/column-headers/table-column-filter/table-column-filter.component.d.ts.map +1 -0
  500. package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts +19 -0
  501. package/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.d.ts.map +1 -0
  502. package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts +15 -0
  503. package/lib/features/data-table/column-headers/table-column-select/table-column-select.component.d.ts.map +1 -0
  504. package/lib/features/data-table/data-table-filter.service.d.ts +24 -0
  505. package/lib/features/data-table/data-table-filter.service.d.ts.map +1 -0
  506. package/lib/features/data-table/data-table.component.d.ts +154 -0
  507. package/lib/features/data-table/data-table.component.d.ts.map +1 -0
  508. package/lib/features/data-table/data-table.service.d.ts +20 -0
  509. package/lib/features/data-table/data-table.service.d.ts.map +1 -0
  510. package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts +22 -0
  511. package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts.map +1 -0
  512. package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts +10 -0
  513. package/lib/features/data-table/table-hidden-columns-bar/hidden-columns-bar.component.d.ts.map +1 -0
  514. package/lib/features/data-table/tooltips/os-tooltip.component.d.ts +15 -0
  515. package/lib/features/data-table/tooltips/os-tooltip.component.d.ts.map +1 -0
  516. package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts +15 -0
  517. package/lib/features/data-table/tooltips/sdk-tooltip.component.d.ts.map +1 -0
  518. package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts +19 -0
  519. package/lib/features/dynamic-widgets/boolean/boolean-toggle-input.component.d.ts.map +1 -0
  520. package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts +26 -0
  521. package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts.map +1 -0
  522. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts +45 -0
  523. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts.map +1 -0
  524. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts +14 -0
  525. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.service.d.ts.map +1 -0
  526. package/lib/features/dynamic-widgets/number/number-input.component.d.ts +20 -0
  527. package/lib/features/dynamic-widgets/number/number-input.component.d.ts.map +1 -0
  528. package/lib/features/dynamic-widgets/object/object.component.d.ts +26 -0
  529. package/lib/features/dynamic-widgets/object/object.component.d.ts.map +1 -0
  530. package/lib/features/dynamic-widgets/password/password-input.component.d.ts +20 -0
  531. package/lib/features/dynamic-widgets/password/password-input.component.d.ts.map +1 -0
  532. package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts +21 -0
  533. package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts.map +1 -0
  534. package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts +58 -0
  535. package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts.map +1 -0
  536. package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts +23 -0
  537. package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts.map +1 -0
  538. package/lib/features/dynamic-widgets/string/string-input.component.d.ts +20 -0
  539. package/lib/features/dynamic-widgets/string/string-input.component.d.ts.map +1 -0
  540. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts +23 -0
  541. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts.map +1 -0
  542. package/lib/features/extendable/extendable.component.d.ts +15 -0
  543. package/lib/features/extendable/extendable.component.d.ts.map +1 -0
  544. package/lib/features/extendable/extensions-noop.service.d.ts +31 -0
  545. package/lib/features/extendable/extensions-noop.service.d.ts.map +1 -0
  546. package/lib/features/json-view/json-view.component.d.ts +37 -0
  547. package/lib/features/json-view/json-view.component.d.ts.map +1 -0
  548. package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts +35 -0
  549. package/lib/features/list-page-features/list-page-form/list-page-form.component.d.ts.map +1 -0
  550. package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts +13 -0
  551. package/lib/features/list-page-features/list-page-header/list-page-header.component.d.ts.map +1 -0
  552. package/lib/features/loading-indicator/loading-indicator.component.d.ts +9 -0
  553. package/lib/features/loading-indicator/loading-indicator.component.d.ts.map +1 -0
  554. package/lib/features/messaging/growler.component.d.ts +19 -0
  555. package/lib/features/messaging/growler.component.d.ts.map +1 -0
  556. package/lib/features/messaging/growler.model.d.ts +8 -0
  557. package/lib/features/messaging/growler.model.d.ts.map +1 -0
  558. package/lib/features/messaging/growler.module.d.ts +10 -0
  559. package/lib/features/messaging/growler.module.d.ts.map +1 -0
  560. package/lib/features/messaging/growler.service.d.ts +18 -0
  561. package/lib/features/messaging/growler.service.d.ts.map +1 -0
  562. package/lib/features/messaging/logger.service.d.ts +27 -0
  563. package/lib/features/messaging/logger.service.d.ts.map +1 -0
  564. package/lib/features/no-items/no-items.component.d.ts +19 -0
  565. package/lib/features/no-items/no-items.component.d.ts.map +1 -0
  566. package/lib/features/overrides/overrides.component.d.ts +33 -0
  567. package/lib/features/overrides/overrides.component.d.ts.map +1 -0
  568. package/lib/features/overrides/overrides.service.d.ts +18 -0
  569. package/lib/features/overrides/overrides.service.d.ts.map +1 -0
  570. package/lib/features/preview-list/preview-list.component.d.ts +24 -0
  571. package/lib/features/preview-list/preview-list.component.d.ts.map +1 -0
  572. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +52 -0
  573. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -0
  574. package/lib/features/projectable-forms/configuration/configuration.service.d.ts +33 -0
  575. package/lib/features/projectable-forms/configuration/configuration.service.d.ts.map +1 -0
  576. package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +45 -0
  577. package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -0
  578. package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts +29 -0
  579. package/lib/features/projectable-forms/edge-router/edge-router-form.service.d.ts.map +1 -0
  580. package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +22 -0
  581. package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +1 -0
  582. package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts +15 -0
  583. package/lib/features/projectable-forms/form-field-toggle/form-field-toggle.component.d.ts.map +1 -0
  584. package/lib/features/projectable-forms/form-header/form-header.component.d.ts +23 -0
  585. package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +1 -0
  586. package/lib/features/projectable-forms/identity/identity-form.component.d.ts +70 -0
  587. package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -0
  588. package/lib/features/projectable-forms/identity/identity-form.service.d.ts +20 -0
  589. package/lib/features/projectable-forms/identity/identity-form.service.d.ts.map +1 -0
  590. package/lib/features/projectable-forms/projectable-form.class.d.ts +39 -0
  591. package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -0
  592. package/lib/features/projectable-forms/service/service-form.component.d.ts +62 -0
  593. package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -0
  594. package/lib/features/projectable-forms/service/service-form.service.d.ts +96 -0
  595. package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -0
  596. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +140 -0
  597. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -0
  598. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +58 -0
  599. package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -0
  600. package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts +37 -0
  601. package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts.map +1 -0
  602. package/lib/features/qr-code/qr-code.component.d.ts +40 -0
  603. package/lib/features/qr-code/qr-code.component.d.ts.map +1 -0
  604. package/lib/features/reset-enrollment/reset-enrollment.component.d.ts +27 -0
  605. package/lib/features/reset-enrollment/reset-enrollment.component.d.ts.map +1 -0
  606. package/lib/features/reset-enrollment/reset-enrollment.service.d.ts +13 -0
  607. package/lib/features/reset-enrollment/reset-enrollment.service.d.ts.map +1 -0
  608. package/lib/features/side-modal/side-modal.component.d.ts +15 -0
  609. package/lib/features/side-modal/side-modal.component.d.ts.map +1 -0
  610. package/lib/features/sidebars/side-banner/side-banner.component.d.ts +7 -0
  611. package/lib/features/sidebars/side-banner/side-banner.component.d.ts.map +1 -0
  612. package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts +16 -0
  613. package/lib/features/sidebars/side-navbar/side-navbar.component.d.ts.map +1 -0
  614. package/lib/features/sidebars/side-toolbar/side-toolbar.component.d.ts +34 -0
  615. package/lib/features/sidebars/side-toolbar/side-toolbar.component.d.ts.map +1 -0
  616. package/lib/features/tag-selector/tag-selector.component.d.ts +59 -0
  617. package/lib/features/tag-selector/tag-selector.component.d.ts.map +1 -0
  618. package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts +53 -0
  619. package/lib/features/visualizer/identity-service-path/identity-service-path.component.d.ts.map +1 -0
  620. package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts +21 -0
  621. package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts.map +1 -0
  622. package/lib/features/wrappers/node-wrapper.service.d.ts +24 -0
  623. package/lib/features/wrappers/node-wrapper.service.d.ts.map +1 -0
  624. package/lib/features/wrappers/zac-wrapper-service.class.d.ts +38 -0
  625. package/lib/features/wrappers/zac-wrapper-service.class.d.ts.map +1 -0
  626. package/lib/features/wrappers/zac-wrapper.component.d.ts +31 -0
  627. package/lib/features/wrappers/zac-wrapper.component.d.ts.map +1 -0
  628. package/lib/features/wrappers/zac-wrapper.service.d.ts +56 -0
  629. package/lib/features/wrappers/zac-wrapper.service.d.ts.map +1 -0
  630. package/lib/models/config.d.ts +6 -0
  631. package/lib/models/config.d.ts.map +1 -0
  632. package/lib/models/edge-router.d.ts +10 -0
  633. package/lib/models/edge-router.d.ts.map +1 -0
  634. package/lib/models/identity.d.ts +16 -0
  635. package/lib/models/identity.d.ts.map +1 -0
  636. package/lib/models/service-policy.d.ts +9 -0
  637. package/lib/models/service-policy.d.ts.map +1 -0
  638. package/lib/models/service.d.ts +9 -0
  639. package/lib/models/service.d.ts.map +1 -0
  640. package/lib/pages/configurations/configurations-page.component.d.ts +29 -0
  641. package/lib/pages/configurations/configurations-page.component.d.ts.map +1 -0
  642. package/lib/pages/configurations/configurations-page.service.d.ts +78 -0
  643. package/lib/pages/configurations/configurations-page.service.d.ts.map +1 -0
  644. package/lib/pages/edge-routers/edge-routers-page.component.d.ts +38 -0
  645. package/lib/pages/edge-routers/edge-routers-page.component.d.ts.map +1 -0
  646. package/lib/pages/edge-routers/edge-routers-page.service.d.ts +47 -0
  647. package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -0
  648. package/lib/pages/identities/identities-page.component.d.ts +44 -0
  649. package/lib/pages/identities/identities-page.component.d.ts.map +1 -0
  650. package/lib/pages/identities/identities-page.service.d.ts +54 -0
  651. package/lib/pages/identities/identities-page.service.d.ts.map +1 -0
  652. package/lib/pages/service-policies/service-policies-page.component.d.ts +36 -0
  653. package/lib/pages/service-policies/service-policies-page.component.d.ts.map +1 -0
  654. package/lib/pages/service-policies/service-policies-page.service.d.ts +63 -0
  655. package/lib/pages/service-policies/service-policies-page.service.d.ts.map +1 -0
  656. package/lib/pages/services/services-page.component.d.ts +37 -0
  657. package/lib/pages/services/services-page.component.d.ts.map +1 -0
  658. package/lib/pages/services/services-page.service.d.ts +46 -0
  659. package/lib/pages/services/services-page.service.d.ts.map +1 -0
  660. package/lib/safe.pipe.d.ts +11 -0
  661. package/lib/safe.pipe.d.ts.map +1 -0
  662. package/lib/services/console-events.service.d.ts +12 -0
  663. package/lib/services/console-events.service.d.ts.map +1 -0
  664. package/lib/services/csv-download.service.d.ts +11 -0
  665. package/lib/services/csv-download.service.d.ts.map +1 -0
  666. package/lib/services/deactivate-guard.service.d.ts +14 -0
  667. package/lib/services/deactivate-guard.service.d.ts.map +1 -0
  668. package/lib/services/login-service.class.d.ts +22 -0
  669. package/lib/services/login-service.class.d.ts.map +1 -0
  670. package/lib/services/node-data.service.d.ts +32 -0
  671. package/lib/services/node-data.service.d.ts.map +1 -0
  672. package/lib/services/noop-login.service.d.ts +23 -0
  673. package/lib/services/noop-login.service.d.ts.map +1 -0
  674. package/lib/services/schema.service.d.ts +63 -0
  675. package/lib/services/schema.service.d.ts.map +1 -0
  676. package/lib/services/settings-service.class.d.ts +35 -0
  677. package/lib/services/settings-service.class.d.ts.map +1 -0
  678. package/lib/services/settings.service.d.ts +18 -0
  679. package/lib/services/settings.service.d.ts.map +1 -0
  680. package/lib/services/tab-name.service.d.ts +20 -0
  681. package/lib/services/tab-name.service.d.ts.map +1 -0
  682. package/lib/services/validation.service.d.ts +13 -0
  683. package/lib/services/validation.service.d.ts.map +1 -0
  684. package/lib/services/ziti-controller-data.service.d.ts +32 -0
  685. package/lib/services/ziti-controller-data.service.d.ts.map +1 -0
  686. package/lib/services/ziti-data.service.d.ts +40 -0
  687. package/lib/services/ziti-data.service.d.ts.map +1 -0
  688. package/lib/services/ziti-domain-controller.service.d.ts +13 -0
  689. package/lib/services/ziti-domain-controller.service.d.ts.map +1 -0
  690. package/lib/shared/list-page-component.class.d.ts +52 -0
  691. package/lib/shared/list-page-component.class.d.ts.map +1 -0
  692. package/lib/shared/list-page-service.class.d.ts +47 -0
  693. package/lib/shared/list-page-service.class.d.ts.map +1 -0
  694. package/lib/version.d.ts +4 -0
  695. package/lib/version.d.ts.map +1 -0
  696. package/lib/zac-routing.module.d.ts +8 -0
  697. package/lib/zac-routing.module.d.ts.map +1 -0
  698. package/lib/ziti-console-lib.module.d.ts +85 -0
  699. package/lib/ziti-console-lib.module.d.ts.map +1 -0
  700. package/lib/ziti-console.constants.d.ts +4 -0
  701. package/lib/ziti-console.constants.d.ts.map +1 -0
  702. package/openziti-ziti-console-lib.d.ts.map +1 -0
  703. package/package.json +48 -0
  704. package/public-api.d.ts +68 -0
  705. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,588 @@
1
+ /* eslint prefer-const: 1 */
2
+ import { Component, Inject, ViewEncapsulation, } from '@angular/core';
3
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
4
+ import { SETTINGS_SERVICE, } from '../../../services/settings.service';
5
+ import { ZITI_DATA_SERVICE, } from '../../../services/ziti-data.service';
6
+ import * as d3 from 'd3';
7
+ import _ from 'lodash';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./identity-service-path.helper";
10
+ import * as i2 from "@angular/router";
11
+ import * as i3 from "@angular/material/dialog";
12
+ import * as i4 from "@angular/common";
13
+ import * as i5 from "@angular/forms";
14
+ import * as i6 from "@angular/material/autocomplete";
15
+ import * as i7 from "@angular/material/core";
16
+ import * as i8 from "../../loading-indicator/loading-indicator.component";
17
+ import * as i9 from "../../../services/settings.service";
18
+ import * as i10 from "../../../services/ziti-data.service";
19
+ class IdentityServicePathComponent {
20
+ constructor(identityServicePathHelper, settingsService, zitiService, router, dialogRef, data) {
21
+ this.identityServicePathHelper = identityServicePathHelper;
22
+ this.settingsService = settingsService;
23
+ this.zitiService = zitiService;
24
+ this.router = router;
25
+ this.dialogRef = dialogRef;
26
+ this.data = data;
27
+ this.refreshRotate = false;
28
+ this.closeRotate = true;
29
+ this.filterText = 'fetching services..';
30
+ this.noSearchResults = false;
31
+ this.autocompleteOptions = [];
32
+ this.fullScreen = false;
33
+ this.endpoints = [];
34
+ this.selectedService = '';
35
+ this.doEndpointHasAppwans = false;
36
+ this.doEndpointHasPublicRouters = false;
37
+ this.doEndpointHasServicesInPrivateNw = false;
38
+ this.isLoading = false;
39
+ this.countGrp2Nds = 0;
40
+ this.countGrp3Nds = 0;
41
+ this.endpointData = data.identity;
42
+ }
43
+ ngOnInit() {
44
+ this.getEndpointNetworkAsCode();
45
+ this.autocompleteOptions = [];
46
+ this.isLoading = true;
47
+ }
48
+ getEndpointNetworkAsCode() {
49
+ const pagesize = 500;
50
+ const services_paging = {
51
+ searchOn: 'name',
52
+ filter: '',
53
+ total: pagesize,
54
+ page: 1,
55
+ sort: 'name',
56
+ order: 'asc',
57
+ };
58
+ this.zitiService
59
+ .get(`identities/${this.endpointData.id}/services`, services_paging, [])
60
+ .then((result) => {
61
+ this.services = result.data;
62
+ this.closeRotate = false;
63
+ if (!this.services || this.services.length === 0) {
64
+ this.services = [];
65
+ this.serviceOptions = [];
66
+ this.serviceOptions.push(noServices());
67
+ this.selectedService = 'Services not found for a selected identity';
68
+ this.isLoading = false;
69
+ }
70
+ else {
71
+ const pages = Math.ceil(result.meta.pagination.totalCount / pagesize);
72
+ const promises = [];
73
+ for (let page = 2; page <= pages; page++) {
74
+ services_paging.page = page;
75
+ const tmp_promise = this.zitiService
76
+ .get(`identities/${this.endpointData.id}/services`, services_paging, [])
77
+ .then((pageResult) => {
78
+ pageResult.data.forEach((serv) => {
79
+ this.services.push(serv);
80
+ });
81
+ });
82
+ promises.push(tmp_promise);
83
+ }
84
+ Promise.all(promises).then(() => {
85
+ this.zitiService
86
+ .get(`identities/${this.endpointData.id}/edge-routers`, {}, [])
87
+ .then((result) => {
88
+ this.edgerouters = [];
89
+ result.data.forEach((rec) => {
90
+ this.edgerouters.push(rec);
91
+ });
92
+ });
93
+ this.serviceOptions = createServiceOptions(this.services);
94
+ this.filterText =
95
+ this.serviceOptions.length === 0
96
+ ? ''
97
+ : this.serviceOptions[0].name;
98
+ this.selectedService =
99
+ this.serviceOptions.length === 0
100
+ ? 'Services not found for a selected identity'
101
+ : this.serviceOptions[0].name;
102
+ this.autocompleteOptions = this.serviceOptions;
103
+ this.serviceChanged();
104
+ });
105
+ }
106
+ });
107
+ function createServiceOptions(_services) {
108
+ const options = [];
109
+ const serviceNames = [];
110
+ _services?.find((srvice) => {
111
+ if (!serviceNames.includes(srvice.name)) {
112
+ serviceNames.push(srvice.name);
113
+ const sd = new ServiceData();
114
+ sd.id = srvice.id;
115
+ sd.name = srvice.name;
116
+ options.push(sd);
117
+ }
118
+ });
119
+ return options;
120
+ }
121
+ function noServices() {
122
+ const sd = new ServiceData();
123
+ sd.id = '';
124
+ sd.name = 'NO SERVICES';
125
+ return sd;
126
+ }
127
+ } // end of getEndpointNetworkAsCode
128
+ filterSearchArray() {
129
+ this.autocompleteOptions = [];
130
+ this.autocompleteOptions = this.serviceOptions.filter((option) => option.name.toLowerCase().includes(this.selectedService.toLowerCase()));
131
+ }
132
+ clearSearchFilter() {
133
+ this.filterText = 'You can filter services by typing here';
134
+ this.autocompleteOptions = this.serviceOptions;
135
+ this.selectedService = '';
136
+ }
137
+ autocompleteSearch(event) {
138
+ this.serviceChanged();
139
+ }
140
+ serviceChanged() {
141
+ this.isLoading = true;
142
+ const allPromises = [];
143
+ let serviceOb = null;
144
+ let service_configs = [];
145
+ serviceOb = this.services && this.services.find((rec) => {
146
+ return (rec.name === this.selectedService);
147
+ });
148
+ if (!serviceOb) {
149
+ this.isLoading = false;
150
+ return;
151
+ }
152
+ const configs_url = this.getLinkForResource(serviceOb, 'configs');
153
+ const configPromise = this.zitiService
154
+ .get(configs_url, {}, [])
155
+ .then((configs) => {
156
+ service_configs = configs && configs.data ? configs.data : [];
157
+ });
158
+ const service_edge_router_policies_url = this.getLinkForResource(serviceOb, 'service-edge-router-policies');
159
+ const service_policies_url = this.getLinkForResource(serviceOb, 'service-policies').replace('./', ''); // dial, Bind info
160
+ let bindPolicies = [];
161
+ let bindIdnetities = [];
162
+ const promise2 = this.zitiService
163
+ .get(service_policies_url, {}, [])
164
+ .then((policies) => {
165
+ const identityPromises = [];
166
+ _.isArray(policies.data) && policies.data.forEach((policy) => {
167
+ if (policy.type === 'Bind') {
168
+ const bindIdentitiesUrl = this.getLinkForResource(policy, 'identities');
169
+ const promse = this.zitiService
170
+ .get(bindIdentitiesUrl.replace('./', ''), {}, [])
171
+ .then((res) => {
172
+ if (res && res.data.length > 0) {
173
+ res.data.forEach((rs) => {
174
+ this.addItemToArray(bindIdnetities, rs);
175
+ });
176
+ }
177
+ else {
178
+ this.addItemToArray(bindIdnetities, res.data);
179
+ }
180
+ });
181
+ identityPromises.push(promse);
182
+ }
183
+ });
184
+ Promise.all(identityPromises).then(() => {
185
+ this.startVisProcess(bindIdnetities, serviceOb, service_configs);
186
+ this.isLoading = false;
187
+ });
188
+ });
189
+ }
190
+ addItemToArray(bindIdnetities, ob) {
191
+ if (!bindIdnetities.find((item) => item.id === ob.id)) {
192
+ bindIdnetities.push(ob);
193
+ }
194
+ return bindIdnetities;
195
+ }
196
+ getLinkForResource(ob, resource) {
197
+ return ob['_links'][resource]['href'];
198
+ }
199
+ startVisProcess(bindIdnetities, selectedServiceOb, serviceConfigs) {
200
+ this.countGrp2Nds = 0;
201
+ this.countGrp3Nds = 0;
202
+ if (_.isEmpty(this.selectedService)) {
203
+ this.serviceSelectError = !_.isEmpty(this.selectedService);
204
+ return;
205
+ }
206
+ try {
207
+ this.graphJsonObj = this.identityServicePathHelper.getEndpointGraphObj(this.endpointData, bindIdnetities, this.edgerouters, selectedServiceOb, serviceConfigs);
208
+ }
209
+ catch (err) {
210
+ console.log('Error in creating graph', err);
211
+ return;
212
+ }
213
+ let countGrp1Nds = 0;
214
+ this.doEndpointHasServicesInPrivateNw = false;
215
+ this.doEndpointHasPublicRouters = false;
216
+ this.doEndpointHasAppwans = false;
217
+ this.graphJsonObj.nodes.forEach((nd) => {
218
+ if (nd.group === '3') {
219
+ this.countGrp3Nds++;
220
+ }
221
+ if (nd.group.includes('2')) {
222
+ this.countGrp2Nds++;
223
+ }
224
+ if (nd.group === '1') {
225
+ countGrp1Nds++;
226
+ }
227
+ });
228
+ if (this.countGrp3Nds > 0) {
229
+ this.doEndpointHasServicesInPrivateNw = true; // show private/customer network box, will be decided with this variable.
230
+ }
231
+ if (this.countGrp2Nds > 0) {
232
+ this.doEndpointHasPublicRouters = true; // show public network box, will be decided with this variable.
233
+ }
234
+ if (countGrp1Nds > 0) {
235
+ this.doEndpointHasAppwans = true; // show private network box, will be decided with this variable.
236
+ }
237
+ this.initTopoView();
238
+ }
239
+ toggleModalSize() {
240
+ this.fullScreen = !this.fullScreen;
241
+ }
242
+ hide() {
243
+ this.dialogRef.close();
244
+ }
245
+ initTopoView() {
246
+ const margin = { top: 10, right: 90, bottom: 30, left: 0 };
247
+ const width = 1100 - margin.left - margin.right;
248
+ const height = 1100 - margin.top - margin.bottom;
249
+ const colors = d3.scaleOrdinal(d3.schemeCategory10);
250
+ const tooltip = d3.select('#epTooltip');
251
+ let svg = d3.select('#IdentityTopology'), node, link;
252
+ const handleZoom = (e) => svg.attr('transform', e.transform);
253
+ const zoom = d3.zoom().on('zoom', handleZoom);
254
+ svg
255
+ .attr('width', '100%')
256
+ .attr('height', '100%')
257
+ // .call(zoom)
258
+ .attr('viewBox', '0 ' + -10 + ' ' + width + ' ' + height)
259
+ .append('g')
260
+ .attr('transform', 'translate(' + -300 + ',' + 225 + ')');
261
+ svg.selectAll('g').remove();
262
+ const simulation = d3
263
+ .forceSimulation()
264
+ .force('link', d3
265
+ .forceLink()
266
+ .id(function (d) {
267
+ return d.id;
268
+ })
269
+ .distance(100)
270
+ .strength(1))
271
+ .force('charge', d3.forceManyBody())
272
+ .force('center', d3.forceCenter(width / 2, height / 2));
273
+ const links = this.graphJsonObj.links;
274
+ const nodes = this.graphJsonObj.nodes;
275
+ link = svg
276
+ .selectAll('g.line.line')
277
+ .data(links)
278
+ .enter()
279
+ .append('g')
280
+ .attr('class', 'link')
281
+ .attr('marker-end', 'url(#arrowhead)');
282
+ link
283
+ .append('line')
284
+ .style('stroke-width', function (d) {
285
+ if (d.status === 1 || d.status === -1) {
286
+ return 1.5; //Math.sqrt(d.weight);
287
+ }
288
+ else {
289
+ return 1;
290
+ }
291
+ })
292
+ .style('stroke', function (d) {
293
+ if (d.status === 1) {
294
+ let doInUsage = false;
295
+ return '#00cd13';
296
+ }
297
+ else if (d.status === -1) {
298
+ return '#d8dce7';
299
+ }
300
+ else {
301
+ return '#ff004e';
302
+ }
303
+ });
304
+ link.each(function (d, i) {
305
+ const _this = d3.select(this);
306
+ if (d.status === 1) {
307
+ let doInUsage = true; // false;
308
+ _this
309
+ .append('text')
310
+ // .text(d.netspeed)
311
+ .style('fill', 'rgb(255,198,22)')
312
+ .style('font-size', '11');
313
+ _this
314
+ .append('rect')
315
+ .attr('fill', function (d) {
316
+ return '#555';
317
+ })
318
+ .attr('width', function (d) {
319
+ if (doInUsage) {
320
+ return 3;
321
+ }
322
+ else {
323
+ return 0.1;
324
+ }
325
+ })
326
+ .attr('height', function (d) {
327
+ if (doInUsage) {
328
+ return 3;
329
+ }
330
+ else {
331
+ return 0.1;
332
+ }
333
+ })
334
+ .append('animate');
335
+ _this.select('rect').append('animate');
336
+ }
337
+ else if (d.status === 0) {
338
+ _this
339
+ .append('image')
340
+ .attr('xlink:href', function () {
341
+ return '/assets/images/visualizer/link-cut.png';
342
+ })
343
+ .attr('width', '20')
344
+ .attr('height', '24');
345
+ }
346
+ });
347
+ node = svg
348
+ .selectAll('.node')
349
+ .data(nodes)
350
+ .enter()
351
+ .append('g')
352
+ .attr('class', 'node');
353
+ node
354
+ .append('image')
355
+ .attr('xlink:href', function (d) {
356
+ const routerImagePath = '/assets/images/visualizer/Routers.png';
357
+ const nonProvisionedRouterImagePath = '/assets/images/visualizer/ER.png';
358
+ const errRouterImagePath = '/assets/images/visualizer/error_er.png';
359
+ const errEndpointImagePath = '/assets/images/visualizer/host-error.png';
360
+ const unregisteredEndpointImagePath = '/assets/images/visualizer/host_unregistered.png';
361
+ const endPointPath = '/assets/images/visualizer/host.png';
362
+ if (d.type.includes('Identity') && d.status === 'Un-Registered') {
363
+ return unregisteredEndpointImagePath;
364
+ }
365
+ else if (d.type.includes('Identity') &&
366
+ d.apiSession === 'Yes' &&
367
+ d.status === 'Registered') {
368
+ return endPointPath;
369
+ }
370
+ else if (d.type.includes('Identity') &&
371
+ (d.routerConnection === 'No' || d.apiSession === 'No')) {
372
+ return errEndpointImagePath;
373
+ }
374
+ else if (d.type.includes('Identity')) {
375
+ return endPointPath;
376
+ }
377
+ else if (d.type.includes('Router') &&
378
+ (d.status === 'ERROR' || d.online === 'No')) {
379
+ return errRouterImagePath;
380
+ }
381
+ else if (d.type.includes('Router') && d.status === 'PROVISIONED') {
382
+ return routerImagePath;
383
+ }
384
+ else if (d.type.includes('Router')) {
385
+ return nonProvisionedRouterImagePath;
386
+ }
387
+ if (d.group === '4') {
388
+ return '/assets/images/visualizer/service.png';
389
+ }
390
+ else {
391
+ return '';
392
+ }
393
+ })
394
+ .attr('x', -25)
395
+ .attr('y', -25)
396
+ .attr('width', '40')
397
+ .attr('height', '40');
398
+ // node.append('title') .text(function (d) {return d.name;});
399
+ node
400
+ .append('text')
401
+ .attr('x', 10)
402
+ .attr('y', 12)
403
+ .style('font-weight', '600')
404
+ .text(function (d) {
405
+ // const name = d.type.includes('Service') ? d.alias : d.name;
406
+ return d.name;
407
+ });
408
+ simulation.nodes(nodes).on('tick', ticked);
409
+ simulation.force('link').links(links);
410
+ node.on('mouseover', (event, d) => {
411
+ const endpointUtlizationJson = {};
412
+ drawTooltip(event, d, endpointUtlizationJson);
413
+ });
414
+ node.on('mouseout', function () {
415
+ removeTooltip();
416
+ });
417
+ function ticked() {
418
+ node.attr('transform', function (d) {
419
+ return 'translate(' + d.posx + ',' + d.posy + ')';
420
+ });
421
+ link
422
+ .select('line')
423
+ .attr('x1', function (d) {
424
+ return d.source.posx;
425
+ })
426
+ .attr('y1', function (d) {
427
+ return d.source.posy;
428
+ })
429
+ .attr('x2', function (d) {
430
+ return d.target.posx;
431
+ })
432
+ .attr('y2', function (d) {
433
+ return d.target.posy;
434
+ });
435
+ link
436
+ .select('image')
437
+ .attr('x', function (d) {
438
+ const x1 = d.source.posx, x2 = d.target.posx, x = x1 - (x1 - x2) / 2;
439
+ return x - 8;
440
+ })
441
+ .attr('y', function (d) {
442
+ const y1 = d.source.posy, y2 = d.target.posy, y = y1 - (y1 - y2) / 2;
443
+ return y - 12;
444
+ });
445
+ link
446
+ .select('rect')
447
+ .attr('opacity', 1)
448
+ .attr('x', function (d) {
449
+ return d.source.posx;
450
+ })
451
+ .attr('y', function (d) {
452
+ return d.source.posy;
453
+ })
454
+ .selectAll('animate')
455
+ .each(function (d, i) {
456
+ if (i === 0) {
457
+ d3.select(this)
458
+ .attr('attributeName', function (d) {
459
+ return 'x';
460
+ })
461
+ .attr('from', function (d) {
462
+ const n = d.source.posx - 1;
463
+ return n;
464
+ })
465
+ .attr('to', function (d) {
466
+ return d.target.posx;
467
+ });
468
+ }
469
+ else {
470
+ d3.select(this)
471
+ .attr('attributeName', function (d) {
472
+ return 'y';
473
+ })
474
+ .attr('from', function (d) {
475
+ return d.source.posy;
476
+ })
477
+ .attr('to', function (d) {
478
+ return d.target.posy;
479
+ });
480
+ }
481
+ d3.select(this)
482
+ .attr('attributeType', 'XML')
483
+ .attr('begin', '0.5s')
484
+ .attr('dur', function (d) {
485
+ return '1.0s';
486
+ })
487
+ .attr('repeatCount', 'indefinite');
488
+ });
489
+ } // end of ticked
490
+ function removeTooltip() {
491
+ if (tooltip) {
492
+ tooltip.style('display', 'none');
493
+ }
494
+ }
495
+ function drawTooltip(event, d, endpointUtlizationJson) {
496
+ document.getElementById('epTooltip').innerHTML = readKeyValues(d, endpointUtlizationJson); // readObjectValues(d);
497
+ tooltip.style('display', 'block');
498
+ tooltip.style('white-space', 'pre-wrap');
499
+ const x = event.pageX + 'px';
500
+ const y = event.pageY + 'px';
501
+ tooltip.style('left', x);
502
+ tooltip.style('top', y);
503
+ }
504
+ function readKeyValues(d, endpointUtlizationJson) {
505
+ let info = "<div class='tool-tip-container' style='font-size:14px;font-family:Open Sans; font-weight: 600; font-color: var(--tableText);'>";
506
+ const keys = Object.keys(d);
507
+ keys.forEach(function (k) {
508
+ if (k === 'status' ||
509
+ k === 'posy' ||
510
+ k === 'posx' ||
511
+ k === 'group' ||
512
+ k === 'hostedEdgeId' ||
513
+ k === 'value' ||
514
+ k === 'index' ||
515
+ k === 'parent' ||
516
+ k === 'depth' ||
517
+ k === 'x' ||
518
+ k === 'y' ||
519
+ k === 'id' ||
520
+ k === 'x0' ||
521
+ k === 'y0' ||
522
+ k === 'vy' ||
523
+ k === 'vx') {
524
+ // continue;
525
+ }
526
+ else if (k === 'children') {
527
+ const kVal = d[k];
528
+ if (kVal && kVal !== '') {
529
+ info = info + '<div class="prop-row"><div class="prop-name">' + k + ':</div><div class="prop-val">' + kVal.length + '</div></div>';
530
+ }
531
+ }
532
+ else {
533
+ if (isAnObject(d[k])) {
534
+ const kVal = d[k];
535
+ if (kVal && kVal !== '') {
536
+ info = info + '<div class="prop-row"><div class="prop-name">' + k + ':</div><div class="prop-val">' + kVal.name + '</div></div>';
537
+ }
538
+ }
539
+ else if (d[k] instanceof Array) {
540
+ info =
541
+ info +
542
+ '<div class="prop-row"><div class="prop-name">' +
543
+ k +
544
+ ':</div><div class="prop-val">' +
545
+ d[k].join('<br> &nbsp;&nbsp; &nbsp;&nbsp;') +
546
+ '</div></div>';
547
+ }
548
+ else {
549
+ const vo = d[k];
550
+ if (vo && vo !== '') {
551
+ info =
552
+ info +
553
+ '<div class="prop-row"><div class="prop-name">' +
554
+ k +
555
+ ':</div><div class="prop-val">' +
556
+ (vo !== null || vo !== '' ? d[k] : 'N/A') +
557
+ '</div></div>';
558
+ }
559
+ }
560
+ }
561
+ });
562
+ return info + '</div>';
563
+ }
564
+ function isAnObject(o) {
565
+ return o instanceof Object && o.constructor === Object;
566
+ }
567
+ this.refreshRotate = false;
568
+ } // end of initTopoView
569
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IdentityServicePathComponent, deps: [{ token: i1.IdentityServicePathHelper }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i2.Router }, { token: i3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
570
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: IdentityServicePathComponent, selector: "app-identity-visualizer", ngImport: i0, template: "<div [ngClass]=\"{ 'full-screen': fullScreen }\" class=\"modal solid\" id=\"IdentityVisualizerDataModal\">\n <div class=\"tp-data-header\">\n <div class=\"modaltitle\">Identity Service Path</div>\n <div (click)=\"hide()\" class=\"buttonBall icon-close\" id=\"EscZEndpointClose\"></div>\n <div (click)=\"toggleModalSize()\" class=\"buttonBall resize\" id=\"ResizeModalButton\"></div>\n </div>\n\n <div class=\"identity-topology-container\">\n\n <div style=\"width: 100%; height: 80px; float: left\">\n <div class=\"ep-topology-filter-container listBox row\">\n <input\n (keyup)=\"filterSearchArray()\"\n [(ngModel)]=\"selectedService\"\n [matAutocomplete]=\"auto\"\n class=\"topology-filter-input\"\n id=\"filterText\"\n matInput\n placeholder=\"Type to search identity accessible services.\"\n />\n\n <div\n (click)=\"clearSearchFilter()\"\n *ngIf=\"filterText\"\n class=\"clear-svc-icon icon-close\"\n id=\"ClearSearchFilter\"\n ></div>\n <div [hidden]=\"!noSearchResults\" class=\"no-results-warning\">No Results Found</div>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"autocompleteSearch($event)\">\n <mat-option *ngFor=\"let option of autocompleteOptions\" [value]=\"option.name\">\n {{ option.name }}\n </mat-option>\n </mat-autocomplete>\n </div>\n </div>\n\n <div class=\"topotip\" id=\"epTooltip\"></div>\n\n <svg style='pointer-events:all' height=\"1000\" id=\"IdentityTopology\" width=\"1200\">\n </svg>\n <lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n\n <div class=\"topology-legendA\">\n <div class=\"legend-item-head\">\n <div class=\"legend-text-heading\">Component Status</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle unregistered\"></div>\n <div class=\"legend-text\">Unregistered / Offline</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_in_use\"></div>\n <div class=\"legend-text\">Registered, Online</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle errored\"></div>\n <div class=\"legend-text\">Errored</div>\n </div>\n </div>\n\n <div class=\"topology-legendB\">\n <div class=\"legend-item-head\">\n <div class=\"legend-text-heading\">Link Status</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle unregistered\"></div>\n <div class=\"legend-text\">Offline</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_in_use\"></div>\n <div class=\"legend-text\">In Usage</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_not_in_use\"></div>\n <div class=\"legend-text\">Usage Date N/A</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle linkerrored\"></div>\n <div class=\"legend-text\">Errored</div>\n </div>\n </div>\n\n </div>\n</div>\n", styles: ["#IdentityVisualizerDataModal{overflow:hidden;width:75%;height:85%;background-color:var(--background);border-radius:25px;z-index:1001;margin:auto;inset:0;position:fixed}#IdentityVisualizerDataModal .buttonBall{cursor:pointer;font-weight:600}#IdentityVisualizerDataModal .buttonBall.icon-close{position:absolute;top:20px;right:20px;font-size:23px;color:var(--icon)}#IdentityVisualizerDataModal .buttonBall:hover{filter:brightness(50%)}#IdentityVisualizerDataModal .clear-svc-icon{font-size:23px;font-weight:600;position:absolute;top:15px;right:40px;color:var(--icon);cursor:pointer}#IdentityVisualizerDataModal .clear-svc-icon:hover{filter:brightness(50%)}#IdentityVisualizerDataModal.full-screen{width:100%;height:100%;border-radius:0}#IdentityVisualizerDataModal .ep-topology-filter-container{width:37%;display:flex;flex-direction:row;position:absolute;margin:20px;padding:0}#IdentityVisualizerDataModal .buttonBall.resize{top:20px;width:23px;height:23px;right:55px;background-image:url(/assets/svgs/Resize.svg);background-size:23px 23px;position:absolute;cursor:pointer}#IdentityVisualizerDataModal .identity-topology-container{display:flex;margin-left:-5px;margin-top:10px;flex-direction:column;cursor:grab;background:#f5e9f2;background-image:linear-gradient(#ecd3e6 2px,transparent 0),linear-gradient(90deg,#ecd3e6 2px,transparent 0),linear-gradient(#ecd3e6 1px,transparent 0),linear-gradient(90deg,#ecd3e6 1px,transparent 0);background-size:40px 40px,40px 40px,10px 10px,10px 10px}#IdentityVisualizerDataModal .tp-data-header{height:40px;font-size:25px;font-weight:600;margin-left:20px;margin-top:10px;margin-bottom:5px;font-family:Russo One;color:var(--primaryColor);font-size:30px;text-transform:uppercase;font-weight:400}#IdentityVisualizerDataModal .node text{font:12px Open Sans,Arial,sans-serif}#IdentityVisualizerDataModal .modaltitle{filter:brightness(50%);padding-top:6px;padding-left:5px}#IdentityVisualizerDataModal .modalbuttons{padding-right:20px}#IdentityVisualizerDataModal .listBox.row .close{position:fixed;display:flex;flex-direction:column;font-family:icomoon!important;font-style:normal;font-weight:600;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--icon);text-align:center;font-size:35px;line-height:40px;left:35%;top:17%;width:40px;height:40px;background-image:url(/assets/svgs/close.svg);z-index:600;background-position:center center;background-size:75%;cursor:pointer;transition:.3s;justify-content:end;align-items:center}#IdentityVisualizerDataModal .tp-topo-data-header{border:0px solid black;height:1200px;font-size:12px;font-weight:400;margin-left:12px;margin-top:3px;color:var(--primaryColor)}#IdentityVisualizerDataModal .services-select{width:400px;flex-shrink:0;border-radius:27px;height:51px;margin-left:22px;margin-top:10px;background-color:#fff;border-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);color:var(--tableText);padding-left:20px}#IdentityVisualizerDataModal select{background-image:url(/assets/svgs/ArrowDown.svg);background-position:center right 15px;background-repeat:no-repeat;background-size:18px;padding-right:47px}#IdentityVisualizerDataModal .topology-filter-input{height:50px;width:95%;border-radius:25px;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding-left:20px}#IdentityVisualizerDataModal .topotip{display:none;position:fixed;background:var(--navigation);border:0px;border-radius:12px;pointer-events:none;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .3s;padding:5px 0;font-size:17px;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:450px}#IdentityVisualizerDataModal .topology-legendA{border:0px solid blue;width:200px;border-radius:12px;margin-bottom:10px;margin-right:10px;position:absolute;display:inline-block;top:75px;right:0;background:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding:0 10px 5px;margin-top:0}#IdentityVisualizerDataModal .topology-legendB{width:200px;border:0px solid blue;border-radius:12px;margin-bottom:10px;margin-right:10px;position:absolute;top:200px;right:0;background:var(--navigation);display:inline-block;box-shadow:0 20px 23px 0 var(--shadow);padding:0 10px 5px;margin-left:10px}#IdentityVisualizerDataModal .legend-item{width:100%;height:100%;display:inline-block}#IdentityVisualizerDataModal .legend-item-head{width:105%;height:100%;display:inline-block;border:0px solid blue;left:-3px}#IdentityVisualizerDataModal .legend-circle{height:12px;width:12px;border-radius:15px;display:inline-block;margin-top:7px}#IdentityVisualizerDataModal .legend-circle.unregistered{background-color:#d8dce7}#IdentityVisualizerDataModal .legend-circle.registered_not_in_use{border:1px solid #08dc5a;background-color:#fff}#IdentityVisualizerDataModal .legend-circle.registered_in_use{background-color:#08dc5a}#IdentityVisualizerDataModal .legend-circle.errored{background-color:#fb0d3d}#IdentityVisualizerDataModal .legend-circle.linkerrored{background-image:url(/assets/images/visualizer/link-cut.png);background-size:contain}#IdentityVisualizerDataModal .legend-text{display:inline-block;font-size:15px;font-weight:600;color:var(--tableText);padding-left:7px;padding-bottom:4px}#IdentityVisualizerDataModal .legend-text-heading{text-align:center;display:inline-block;font-size:14px;font-weight:600;color:var(--tableText);padding-left:10px;padding-top:2px;padding-bottom:2px;color:#8a2be2}#IdentityVisualizerDataModal .legend-text2{display:inline-block;font-size:10px;font-weight:400;color:var(--tableText);padding-left:2px;padding-bottom:4px}#IdentityVisualizerDataModal .filters-area{display:flex;flex-direction:row;align-items:center;justify-content:flex-end;margin-top:10px}#IdentityVisualizerDataModal .dateTimeField input{height:40px;vertical-align:middle;margin-right:1px}#IdentityVisualizerDataModal .p-datepicker table td{padding:0}#IdentityVisualizerDataModal .p-datepicker table td>span{padding:0}#IdentityVisualizerDataModal .p-timepicker{padding:1px}#IdentityVisualizerDataModal .p-datepicker-header,#IdentityVisualizerDataModal .p-datepicker-header-group{padding:0}#IdentityVisualizerDataModal .p-datepicker .p-timepicker button:last-child{height:15px}#IdentityVisualizerDataModal .p-datepicker .p-timepicker button{height:15px}#IdentityVisualizerDataModal .ng-tns-c15-3{font-size:15px;font-weight:700}#IdentityVisualizerDataModal .p-datepicker .p-datepicker-buttonbar{padding:0}#IdentityVisualizerDataModal .reset-button{height:50px;width:50px;margin-top:-7%;margin-left:70%;border-radius:50px;margin-right:10px;background-size:contain;--background-image: url(/assets/svgs/refresh.svg);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:.3s}#IdentityVisualizerDataModal .refresh-button{position:absolute;display:inline-block;height:43px;width:122px;margin-top:-85px;margin-left:65%;border-radius:10px;margin-right:10px;font-color:blue;font-weight:700}#IdentityVisualizerDataModal .reset-button:hover{filter:brightness(90%);transform:scale(.97);transition:.3s}#IdentityVisualizerDataModal .reset-button:active{transform:scale(.9);transition:.3s}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#IdentityVisualizerDataModal .rotating{animation:rotating 2s linear infinite}.tool-tip-container .prop-row{display:grid;grid-template-columns:2fr 3fr;grid-gap:10px;grid-template-areas:\"propName propVal\";height:-moz-fit-content;height:fit-content;min-height:25px;align-items:center;padding:0 10px}.tool-tip-container .prop-row:nth-child(2n){background-color:var(--formBackground)}.tool-tip-container .prop-row .prop-name{grid-area:propName;font-weight:700}.tool-tip-container .prop-row .prop-val{grid-area:propVal}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple", "hideSingleSelectionIndicator"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i8.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }], encapsulation: i0.ViewEncapsulation.None }); }
571
+ }
572
+ export { IdentityServicePathComponent };
573
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IdentityServicePathComponent, decorators: [{
574
+ type: Component,
575
+ args: [{ selector: 'app-identity-visualizer', encapsulation: ViewEncapsulation.None, template: "<div [ngClass]=\"{ 'full-screen': fullScreen }\" class=\"modal solid\" id=\"IdentityVisualizerDataModal\">\n <div class=\"tp-data-header\">\n <div class=\"modaltitle\">Identity Service Path</div>\n <div (click)=\"hide()\" class=\"buttonBall icon-close\" id=\"EscZEndpointClose\"></div>\n <div (click)=\"toggleModalSize()\" class=\"buttonBall resize\" id=\"ResizeModalButton\"></div>\n </div>\n\n <div class=\"identity-topology-container\">\n\n <div style=\"width: 100%; height: 80px; float: left\">\n <div class=\"ep-topology-filter-container listBox row\">\n <input\n (keyup)=\"filterSearchArray()\"\n [(ngModel)]=\"selectedService\"\n [matAutocomplete]=\"auto\"\n class=\"topology-filter-input\"\n id=\"filterText\"\n matInput\n placeholder=\"Type to search identity accessible services.\"\n />\n\n <div\n (click)=\"clearSearchFilter()\"\n *ngIf=\"filterText\"\n class=\"clear-svc-icon icon-close\"\n id=\"ClearSearchFilter\"\n ></div>\n <div [hidden]=\"!noSearchResults\" class=\"no-results-warning\">No Results Found</div>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"autocompleteSearch($event)\">\n <mat-option *ngFor=\"let option of autocompleteOptions\" [value]=\"option.name\">\n {{ option.name }}\n </mat-option>\n </mat-autocomplete>\n </div>\n </div>\n\n <div class=\"topotip\" id=\"epTooltip\"></div>\n\n <svg style='pointer-events:all' height=\"1000\" id=\"IdentityTopology\" width=\"1200\">\n </svg>\n <lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n\n <div class=\"topology-legendA\">\n <div class=\"legend-item-head\">\n <div class=\"legend-text-heading\">Component Status</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle unregistered\"></div>\n <div class=\"legend-text\">Unregistered / Offline</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_in_use\"></div>\n <div class=\"legend-text\">Registered, Online</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle errored\"></div>\n <div class=\"legend-text\">Errored</div>\n </div>\n </div>\n\n <div class=\"topology-legendB\">\n <div class=\"legend-item-head\">\n <div class=\"legend-text-heading\">Link Status</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle unregistered\"></div>\n <div class=\"legend-text\">Offline</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_in_use\"></div>\n <div class=\"legend-text\">In Usage</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle registered_not_in_use\"></div>\n <div class=\"legend-text\">Usage Date N/A</div>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-circle linkerrored\"></div>\n <div class=\"legend-text\">Errored</div>\n </div>\n </div>\n\n </div>\n</div>\n", styles: ["#IdentityVisualizerDataModal{overflow:hidden;width:75%;height:85%;background-color:var(--background);border-radius:25px;z-index:1001;margin:auto;inset:0;position:fixed}#IdentityVisualizerDataModal .buttonBall{cursor:pointer;font-weight:600}#IdentityVisualizerDataModal .buttonBall.icon-close{position:absolute;top:20px;right:20px;font-size:23px;color:var(--icon)}#IdentityVisualizerDataModal .buttonBall:hover{filter:brightness(50%)}#IdentityVisualizerDataModal .clear-svc-icon{font-size:23px;font-weight:600;position:absolute;top:15px;right:40px;color:var(--icon);cursor:pointer}#IdentityVisualizerDataModal .clear-svc-icon:hover{filter:brightness(50%)}#IdentityVisualizerDataModal.full-screen{width:100%;height:100%;border-radius:0}#IdentityVisualizerDataModal .ep-topology-filter-container{width:37%;display:flex;flex-direction:row;position:absolute;margin:20px;padding:0}#IdentityVisualizerDataModal .buttonBall.resize{top:20px;width:23px;height:23px;right:55px;background-image:url(/assets/svgs/Resize.svg);background-size:23px 23px;position:absolute;cursor:pointer}#IdentityVisualizerDataModal .identity-topology-container{display:flex;margin-left:-5px;margin-top:10px;flex-direction:column;cursor:grab;background:#f5e9f2;background-image:linear-gradient(#ecd3e6 2px,transparent 0),linear-gradient(90deg,#ecd3e6 2px,transparent 0),linear-gradient(#ecd3e6 1px,transparent 0),linear-gradient(90deg,#ecd3e6 1px,transparent 0);background-size:40px 40px,40px 40px,10px 10px,10px 10px}#IdentityVisualizerDataModal .tp-data-header{height:40px;font-size:25px;font-weight:600;margin-left:20px;margin-top:10px;margin-bottom:5px;font-family:Russo One;color:var(--primaryColor);font-size:30px;text-transform:uppercase;font-weight:400}#IdentityVisualizerDataModal .node text{font:12px Open Sans,Arial,sans-serif}#IdentityVisualizerDataModal .modaltitle{filter:brightness(50%);padding-top:6px;padding-left:5px}#IdentityVisualizerDataModal .modalbuttons{padding-right:20px}#IdentityVisualizerDataModal .listBox.row .close{position:fixed;display:flex;flex-direction:column;font-family:icomoon!important;font-style:normal;font-weight:600;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--icon);text-align:center;font-size:35px;line-height:40px;left:35%;top:17%;width:40px;height:40px;background-image:url(/assets/svgs/close.svg);z-index:600;background-position:center center;background-size:75%;cursor:pointer;transition:.3s;justify-content:end;align-items:center}#IdentityVisualizerDataModal .tp-topo-data-header{border:0px solid black;height:1200px;font-size:12px;font-weight:400;margin-left:12px;margin-top:3px;color:var(--primaryColor)}#IdentityVisualizerDataModal .services-select{width:400px;flex-shrink:0;border-radius:27px;height:51px;margin-left:22px;margin-top:10px;background-color:#fff;border-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);color:var(--tableText);padding-left:20px}#IdentityVisualizerDataModal select{background-image:url(/assets/svgs/ArrowDown.svg);background-position:center right 15px;background-repeat:no-repeat;background-size:18px;padding-right:47px}#IdentityVisualizerDataModal .topology-filter-input{height:50px;width:95%;border-radius:25px;border-color:var(--navigation);background-color:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding-left:20px}#IdentityVisualizerDataModal .topotip{display:none;position:fixed;background:var(--navigation);border:0px;border-radius:12px;pointer-events:none;box-shadow:0 20px 23px 0 var(--shadow);transition:background-color .3s;padding:5px 0;font-size:17px;font-weight:700;color:var(--tableText);z-index:2000;opacity:1;max-width:450px}#IdentityVisualizerDataModal .topology-legendA{border:0px solid blue;width:200px;border-radius:12px;margin-bottom:10px;margin-right:10px;position:absolute;display:inline-block;top:75px;right:0;background:var(--navigation);box-shadow:0 20px 23px 0 var(--shadow);padding:0 10px 5px;margin-top:0}#IdentityVisualizerDataModal .topology-legendB{width:200px;border:0px solid blue;border-radius:12px;margin-bottom:10px;margin-right:10px;position:absolute;top:200px;right:0;background:var(--navigation);display:inline-block;box-shadow:0 20px 23px 0 var(--shadow);padding:0 10px 5px;margin-left:10px}#IdentityVisualizerDataModal .legend-item{width:100%;height:100%;display:inline-block}#IdentityVisualizerDataModal .legend-item-head{width:105%;height:100%;display:inline-block;border:0px solid blue;left:-3px}#IdentityVisualizerDataModal .legend-circle{height:12px;width:12px;border-radius:15px;display:inline-block;margin-top:7px}#IdentityVisualizerDataModal .legend-circle.unregistered{background-color:#d8dce7}#IdentityVisualizerDataModal .legend-circle.registered_not_in_use{border:1px solid #08dc5a;background-color:#fff}#IdentityVisualizerDataModal .legend-circle.registered_in_use{background-color:#08dc5a}#IdentityVisualizerDataModal .legend-circle.errored{background-color:#fb0d3d}#IdentityVisualizerDataModal .legend-circle.linkerrored{background-image:url(/assets/images/visualizer/link-cut.png);background-size:contain}#IdentityVisualizerDataModal .legend-text{display:inline-block;font-size:15px;font-weight:600;color:var(--tableText);padding-left:7px;padding-bottom:4px}#IdentityVisualizerDataModal .legend-text-heading{text-align:center;display:inline-block;font-size:14px;font-weight:600;color:var(--tableText);padding-left:10px;padding-top:2px;padding-bottom:2px;color:#8a2be2}#IdentityVisualizerDataModal .legend-text2{display:inline-block;font-size:10px;font-weight:400;color:var(--tableText);padding-left:2px;padding-bottom:4px}#IdentityVisualizerDataModal .filters-area{display:flex;flex-direction:row;align-items:center;justify-content:flex-end;margin-top:10px}#IdentityVisualizerDataModal .dateTimeField input{height:40px;vertical-align:middle;margin-right:1px}#IdentityVisualizerDataModal .p-datepicker table td{padding:0}#IdentityVisualizerDataModal .p-datepicker table td>span{padding:0}#IdentityVisualizerDataModal .p-timepicker{padding:1px}#IdentityVisualizerDataModal .p-datepicker-header,#IdentityVisualizerDataModal .p-datepicker-header-group{padding:0}#IdentityVisualizerDataModal .p-datepicker .p-timepicker button:last-child{height:15px}#IdentityVisualizerDataModal .p-datepicker .p-timepicker button{height:15px}#IdentityVisualizerDataModal .ng-tns-c15-3{font-size:15px;font-weight:700}#IdentityVisualizerDataModal .p-datepicker .p-datepicker-buttonbar{padding:0}#IdentityVisualizerDataModal .reset-button{height:50px;width:50px;margin-top:-7%;margin-left:70%;border-radius:50px;margin-right:10px;background-size:contain;--background-image: url(/assets/svgs/refresh.svg);cursor:pointer;overflow:hidden;z-index:24;box-shadow:0 20px 23px 0 var(--shadow);transition:.3s}#IdentityVisualizerDataModal .refresh-button{position:absolute;display:inline-block;height:43px;width:122px;margin-top:-85px;margin-left:65%;border-radius:10px;margin-right:10px;font-color:blue;font-weight:700}#IdentityVisualizerDataModal .reset-button:hover{filter:brightness(90%);transform:scale(.97);transition:.3s}#IdentityVisualizerDataModal .reset-button:active{transform:scale(.9);transition:.3s}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#IdentityVisualizerDataModal .rotating{animation:rotating 2s linear infinite}.tool-tip-container .prop-row{display:grid;grid-template-columns:2fr 3fr;grid-gap:10px;grid-template-areas:\"propName propVal\";height:-moz-fit-content;height:fit-content;min-height:25px;align-items:center;padding:0 10px}.tool-tip-container .prop-row:nth-child(2n){background-color:var(--formBackground)}.tool-tip-container .prop-row .prop-name{grid-area:propName;font-weight:700}.tool-tip-container .prop-row .prop-val{grid-area:propVal}\n"] }]
576
+ }], ctorParameters: function () { return [{ type: i1.IdentityServicePathHelper }, { type: i9.SettingsService, decorators: [{
577
+ type: Inject,
578
+ args: [SETTINGS_SERVICE]
579
+ }] }, { type: i10.ZitiDataService, decorators: [{
580
+ type: Inject,
581
+ args: [ZITI_DATA_SERVICE]
582
+ }] }, { type: i2.Router }, { type: i3.MatDialogRef }, { type: undefined, decorators: [{
583
+ type: Inject,
584
+ args: [MAT_DIALOG_DATA]
585
+ }] }]; } });
586
+ class ServiceData {
587
+ }
588
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHktc2VydmljZS1wYXRoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy92aXN1YWxpemVyL2lkZW50aXR5LXNlcnZpY2UtcGF0aC9pZGVudGl0eS1zZXJ2aWNlLXBhdGguY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMveml0aS1jb25zb2xlLWxpYi9zcmMvbGliL2ZlYXR1cmVzL3Zpc3VhbGl6ZXIvaWRlbnRpdHktc2VydmljZS1wYXRoL2lkZW50aXR5LXNlcnZpY2UtcGF0aC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUNMLFNBQVMsRUFFVCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFFekUsT0FBTyxFQUNMLGdCQUFnQixHQUVqQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxpQkFBaUIsR0FFbEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUV6QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7OztBQU12QixNQU1hLDRCQUE0QjtJQXdCdkMsWUFDVSx5QkFBb0QsRUFDM0IsZUFBZ0MsRUFDOUIsV0FBNEIsRUFDdkQsTUFBYyxFQUNkLFNBQXFELEVBQzdCLElBQVM7UUFMakMsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQ3ZELFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUE0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ZXNsaW50IHByZWZlci1jb25zdDogMSAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIEluamVjdCxcbiAgT25Jbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgU0VUVElOR1NfU0VSVklDRSxcbiAgU2V0dGluZ3NTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFpJVElfREFUQV9TRVJWSUNFLFxuICBaaXRpRGF0YVNlcnZpY2UsXG59IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ppdGktZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IElkZW50aXR5U2VydmljZVBhdGhIZWxwZXIgfSBmcm9tICcuL2lkZW50aXR5LXNlcnZpY2UtcGF0aC5oZWxwZXInO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWlkZW50aXR5LXZpc3VhbGl6ZXInLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZVVybDogJy4vaWRlbnRpdHktc2VydmljZS1wYXRoLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaWRlbnRpdHktc2VydmljZS1wYXRoLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIElkZW50aXR5U2VydmljZVBhdGhDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgZDM7XG4gIHJlZnJlc2hSb3RhdGUgPSBmYWxzZTtcbiAgY2xvc2VSb3RhdGUgPSB0cnVlO1xuICBmaWx0ZXJUZXh0ID0gJ2ZldGNoaW5nIHNlcnZpY2VzLi4nO1xuICBub1NlYXJjaFJlc3VsdHMgPSBmYWxzZTtcbiAgYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICBmdWxsU2NyZWVuID0gZmFsc2U7XG4gIHNlcnZpY2VPcHRpb25zOiBhbnk7XG4gIGVuZHBvaW50RGF0YTtcbiAgbmV0d29ya0dyYXBoO1xuICBncmFwaEpzb25PYmo7XG4gIHNlcnZpY2VzO1xuICBlZGdlcm91dGVycztcbiAgZW5kcG9pbnRzID0gW107XG4gIHNlbGVjdGVkU2VydmljZSA9ICcnO1xuICBzZXJ2aWNlU2VsZWN0RXJyb3I7XG4gIGRvRW5kcG9pbnRIYXNBcHB3YW5zID0gZmFsc2U7XG4gIGRvRW5kcG9pbnRIYXNQdWJsaWNSb3V0ZXJzID0gZmFsc2U7XG4gIGRvRW5kcG9pbnRIYXNTZXJ2aWNlc0luUHJpdmF0ZU53ID0gZmFsc2U7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBjb3VudEdycDJOZHMgPSAwO1xuICBjb3VudEdycDNOZHMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlUGF0aEhlbHBlcjogSWRlbnRpdHlTZXJ2aWNlUGF0aEhlbHBlcixcbiAgICBASW5qZWN0KFNFVFRJTkdTX1NFUlZJQ0UpIHB1YmxpYyBzZXR0aW5nc1NlcnZpY2U6IFNldHRpbmdzU2VydmljZSxcbiAgICBASW5qZWN0KFpJVElfREFUQV9TRVJWSUNFKSBwcml2YXRlIHppdGlTZXJ2aWNlOiBaaXRpRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPElkZW50aXR5U2VydmljZVBhdGhDb21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55XG4gICkge1xuICAgIHRoaXMuZW5kcG9pbnREYXRhID0gZGF0YS5pZGVudGl0eTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RW5kcG9pbnROZXR3b3JrQXNDb2RlKCk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gW107XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICB9XG5cbiAgZ2V0RW5kcG9pbnROZXR3b3JrQXNDb2RlKCkge1xuICAgIGNvbnN0IHBhZ2VzaXplID0gNTAwO1xuICAgIGNvbnN0IHNlcnZpY2VzX3BhZ2luZyA9IHtcbiAgICAgIHNlYXJjaE9uOiAnbmFtZScsXG4gICAgICBmaWx0ZXI6ICcnLFxuICAgICAgdG90YWw6IHBhZ2VzaXplLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNvcnQ6ICduYW1lJyxcbiAgICAgIG9yZGVyOiAnYXNjJyxcbiAgICB9O1xuXG4gICAgdGhpcy56aXRpU2VydmljZVxuICAgICAgLmdldChgaWRlbnRpdGllcy8ke3RoaXMuZW5kcG9pbnREYXRhLmlkfS9zZXJ2aWNlc2AsIHNlcnZpY2VzX3BhZ2luZywgW10pXG4gICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMuc2VydmljZXMgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhpcy5jbG9zZVJvdGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghdGhpcy5zZXJ2aWNlcyB8fCB0aGlzLnNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc2VydmljZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLnNlcnZpY2VPcHRpb25zID0gW107XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlT3B0aW9ucy5wdXNoKG5vU2VydmljZXMoKSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2UgPSAnU2VydmljZXMgbm90IGZvdW5kIGZvciBhIHNlbGVjdGVkIGlkZW50aXR5JztcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHJlc3VsdC5tZXRhLnBhZ2luYXRpb24udG90YWxDb3VudCAvIHBhZ2VzaXplKTtcbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IHBhZ2VzOyBwYWdlKyspIHtcbiAgICAgICAgICAgIHNlcnZpY2VzX3BhZ2luZy5wYWdlID0gcGFnZTtcbiAgICAgICAgICAgIGNvbnN0IHRtcF9wcm9taXNlID0gdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KFxuICAgICAgICAgICAgICAgIGBpZGVudGl0aWVzLyR7dGhpcy5lbmRwb2ludERhdGEuaWR9L3NlcnZpY2VzYCxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc19wYWdpbmcsXG4gICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAudGhlbigocGFnZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHBhZ2VSZXN1bHQuZGF0YS5mb3JFYWNoKChzZXJ2KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzLnB1c2goc2Vydik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0bXBfcHJvbWlzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMueml0aVNlcnZpY2VcbiAgICAgICAgICAgICAgLmdldChgaWRlbnRpdGllcy8ke3RoaXMuZW5kcG9pbnREYXRhLmlkfS9lZGdlLXJvdXRlcnNgLCB7fSwgW10pXG4gICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzID0gW107XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRhdGEuZm9yRWFjaCgocmVjKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmVkZ2Vyb3V0ZXJzLnB1c2gocmVjKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VPcHRpb25zID0gY3JlYXRlU2VydmljZU9wdGlvbnModGhpcy5zZXJ2aWNlcyk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlclRleHQgPVxuICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VPcHRpb25zLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICA6IHRoaXMuc2VydmljZU9wdGlvbnNbMF0ubmFtZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlID1cbiAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlT3B0aW9ucy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICA/ICdTZXJ2aWNlcyBub3QgZm91bmQgZm9yIGEgc2VsZWN0ZWQgaWRlbnRpdHknXG4gICAgICAgICAgICAgICAgOiB0aGlzLnNlcnZpY2VPcHRpb25zWzBdLm5hbWU7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZU9wdGlvbnMgPSB0aGlzLnNlcnZpY2VPcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlQ2hhbmdlZCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VPcHRpb25zKF9zZXJ2aWNlcykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IFtdO1xuICAgICAgY29uc3Qgc2VydmljZU5hbWVzID0gW107XG4gICAgICBfc2VydmljZXM/LmZpbmQoKHNydmljZSkgPT4ge1xuICAgICAgICBpZiAoIXNlcnZpY2VOYW1lcy5pbmNsdWRlcyhzcnZpY2UubmFtZSkpIHtcbiAgICAgICAgICBzZXJ2aWNlTmFtZXMucHVzaChzcnZpY2UubmFtZSk7XG4gICAgICAgICAgY29uc3Qgc2QgPSBuZXcgU2VydmljZURhdGEoKTtcbiAgICAgICAgICBzZC5pZCA9IHNydmljZS5pZDtcbiAgICAgICAgICBzZC5uYW1lID0gc3J2aWNlLm5hbWU7XG4gICAgICAgICAgb3B0aW9ucy5wdXNoKHNkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub1NlcnZpY2VzKCkge1xuICAgICAgY29uc3Qgc2QgPSBuZXcgU2VydmljZURhdGEoKTtcbiAgICAgIHNkLmlkID0gJyc7XG4gICAgICBzZC5uYW1lID0gJ05PIFNFUlZJQ0VTJztcbiAgICAgIHJldHVybiBzZDtcbiAgICB9XG4gIH0gLy8gZW5kIG9mIGdldEVuZHBvaW50TmV0d29ya0FzQ29kZVxuXG4gIGZpbHRlclNlYXJjaEFycmF5KCkge1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9ucyA9IHRoaXMuc2VydmljZU9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgICBvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoRmlsdGVyKCkge1xuICAgIHRoaXMuZmlsdGVyVGV4dCA9ICdZb3UgY2FuIGZpbHRlciBzZXJ2aWNlcyBieSB0eXBpbmcgaGVyZSc7XG4gICAgdGhpcy5hdXRvY29tcGxldGVPcHRpb25zID0gdGhpcy5zZXJ2aWNlT3B0aW9ucztcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZSA9ICcnO1xuICB9XG5cbiAgYXV0b2NvbXBsZXRlU2VhcmNoKGV2ZW50KSB7XG4gICAgdGhpcy5zZXJ2aWNlQ2hhbmdlZCgpO1xuICB9XG5cbiAgc2VydmljZUNoYW5nZWQoKSB7XG4gICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgY29uc3QgYWxsUHJvbWlzZXMgPSBbXTtcbiAgICAgbGV0IHNlcnZpY2VPYiA9IG51bGw7XG4gICAgIGxldCBzZXJ2aWNlX2NvbmZpZ3MgPSBbXTtcblxuICAgICBzZXJ2aWNlT2IgPSB0aGlzLnNlcnZpY2VzICYmIHRoaXMuc2VydmljZXMuZmluZCgocmVjKSA9PiB7XG4gICAgICByZXR1cm4gIChyZWMubmFtZSA9PT0gdGhpcy5zZWxlY3RlZFNlcnZpY2UpO1xuICAgICB9KTtcblxuICAgICBpZiAoIXNlcnZpY2VPYikge1xuICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgcmV0dXJuO1xuICAgICB9XG5cbiAgICAgY29uc3QgY29uZmlnc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShzZXJ2aWNlT2IsICdjb25maWdzJyk7XG5cbiAgICAgY29uc3QgY29uZmlnUHJvbWlzZSA9IHRoaXMueml0aVNlcnZpY2VcbiAgICAgIC5nZXQoY29uZmlnc191cmwsIHt9LCBbXSlcbiAgICAgIC50aGVuKChjb25maWdzKSA9PiB7XG4gICAgICAgIHNlcnZpY2VfY29uZmlncyA9IGNvbmZpZ3MgJiYgY29uZmlncy5kYXRhID8gY29uZmlncy5kYXRhIDogW107XG4gICAgICB9KTtcbiAgICAgY29uc3Qgc2VydmljZV9lZGdlX3JvdXRlcl9wb2xpY2llc191cmwgPSB0aGlzLmdldExpbmtGb3JSZXNvdXJjZShcbiAgICAgIHNlcnZpY2VPYixcbiAgICAgICdzZXJ2aWNlLWVkZ2Utcm91dGVyLXBvbGljaWVzJ1xuICAgICApO1xuICAgICBjb25zdCBzZXJ2aWNlX3BvbGljaWVzX3VybCA9IHRoaXMuZ2V0TGlua0ZvclJlc291cmNlKFxuICAgICAgc2VydmljZU9iLFxuICAgICAgJ3NlcnZpY2UtcG9saWNpZXMnXG4gICAgICkucmVwbGFjZSgnLi8nLCAnJyk7IC8vIGRpYWwsIEJpbmQgaW5mb1xuXG4gICAgbGV0IGJpbmRQb2xpY2llcyA9IFtdO1xuICAgIGxldCBiaW5kSWRuZXRpdGllcyA9IFtdO1xuICAgIGNvbnN0IHByb21pc2UyID0gdGhpcy56aXRpU2VydmljZVxuICAgICAgLmdldChzZXJ2aWNlX3BvbGljaWVzX3VybCwge30sIFtdKVxuICAgICAgLnRoZW4oKHBvbGljaWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkZW50aXR5UHJvbWlzZXMgPSBbXTtcbiAgICAgICAgXy5pc0FycmF5KHBvbGljaWVzLmRhdGEpICYmIHBvbGljaWVzLmRhdGEuZm9yRWFjaCgocG9saWN5KSA9PiB7XG4gICAgICAgICAgaWYgKHBvbGljeS50eXBlID09PSAnQmluZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRJZGVudGl0aWVzVXJsID0gdGhpcy5nZXRMaW5rRm9yUmVzb3VyY2UoXG4gICAgICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICAgICAgJ2lkZW50aXRpZXMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJvbXNlID0gdGhpcy56aXRpU2VydmljZVxuICAgICAgICAgICAgICAuZ2V0KGJpbmRJZGVudGl0aWVzVXJsLnJlcGxhY2UoJy4vJywgJycpLCB7fSwgW10pXG4gICAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhLmZvckVhY2goKHJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbVRvQXJyYXkoYmluZElkbmV0aXRpZXMsIHJzKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCByZXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlkZW50aXR5UHJvbWlzZXMucHVzaChwcm9tc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFByb21pc2UuYWxsKGlkZW50aXR5UHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhcnRWaXNQcm9jZXNzKGJpbmRJZG5ldGl0aWVzLCBzZXJ2aWNlT2IsIHNlcnZpY2VfY29uZmlncyk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFkZEl0ZW1Ub0FycmF5KGJpbmRJZG5ldGl0aWVzLCBvYikge1xuICAgIGlmICghYmluZElkbmV0aXRpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gb2IuaWQpKSB7XG4gICAgICBiaW5kSWRuZXRpdGllcy5wdXNoKG9iKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmRJZG5ldGl0aWVzO1xuICB9XG5cbiAgZ2V0TGlua0ZvclJlc291cmNlKG9iLCByZXNvdXJjZSkge1xuICAgIHJldHVybiBvYlsnX2xpbmtzJ11bcmVzb3VyY2VdWydocmVmJ107XG4gIH1cblxuICBzdGFydFZpc1Byb2Nlc3MoYmluZElkbmV0aXRpZXMsIHNlbGVjdGVkU2VydmljZU9iLCBzZXJ2aWNlQ29uZmlncykge1xuICAgIHRoaXMuY291bnRHcnAyTmRzID0gMDtcbiAgICB0aGlzLmNvdW50R3JwM05kcyA9IDA7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkU2VydmljZSkpIHtcbiAgICAgIHRoaXMuc2VydmljZVNlbGVjdEVycm9yID0gIV8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkU2VydmljZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmdyYXBoSnNvbk9iaiA9IHRoaXMuaWRlbnRpdHlTZXJ2aWNlUGF0aEhlbHBlci5nZXRFbmRwb2ludEdyYXBoT2JqKFxuICAgICAgICB0aGlzLmVuZHBvaW50RGF0YSxcbiAgICAgICAgYmluZElkbmV0aXRpZXMsXG4gICAgICAgIHRoaXMuZWRnZXJvdXRlcnMsXG4gICAgICAgIHNlbGVjdGVkU2VydmljZU9iLFxuICAgICAgICBzZXJ2aWNlQ29uZmlnc1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBjcmVhdGluZyBncmFwaCcsIGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvdW50R3JwMU5kcyA9IDA7XG4gICAgdGhpcy5kb0VuZHBvaW50SGFzU2VydmljZXNJblByaXZhdGVOdyA9IGZhbHNlO1xuICAgIHRoaXMuZG9FbmRwb2ludEhhc1B1YmxpY1JvdXRlcnMgPSBmYWxzZTtcbiAgICB0aGlzLmRvRW5kcG9pbnRIYXNBcHB3YW5zID0gZmFsc2U7XG4gICAgdGhpcy5ncmFwaEpzb25PYmoubm9kZXMuZm9yRWFjaCgobmQpID0+IHtcbiAgICAgIGlmIChuZC5ncm91cCA9PT0gJzMnKSB7XG4gICAgICAgIHRoaXMuY291bnRHcnAzTmRzKys7XG4gICAgICB9XG4gICAgICBpZiAobmQuZ3JvdXAuaW5jbHVkZXMoJzInKSkge1xuICAgICAgICB0aGlzLmNvdW50R3JwMk5kcysrO1xuICAgICAgfVxuICAgICAgaWYgKG5kLmdyb3VwID09PSAnMScpIHtcbiAgICAgICAgY291bnRHcnAxTmRzKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb3VudEdycDNOZHMgPiAwKSB7XG4gICAgICB0aGlzLmRvRW5kcG9pbnRIYXNTZXJ2aWNlc0luUHJpdmF0ZU53ID0gdHJ1ZTsgLy8gc2hvdyBwcml2YXRlL2N1c3RvbWVyIG5ldHdvcmsgYm94LCB3aWxsIGJlIGRlY2lkZWQgd2l0aCB0aGlzIHZhcmlhYmxlLlxuICAgIH1cbiAgICBpZiAodGhpcy5jb3VudEdycDJOZHMgPiAwKSB7XG4gICAgICB0aGlzLmRvRW5kcG9pbnRIYXNQdWJsaWNSb3V0ZXJzID0gdHJ1ZTsgLy8gc2hvdyBwdWJsaWMgbmV0d29yayBib3gsIHdpbGwgYmUgZGVjaWRlZCB3aXRoIHRoaXMgdmFyaWFibGUuXG4gICAgfVxuXG4gICAgaWYgKGNvdW50R3JwMU5kcyA+IDApIHtcbiAgICAgIHRoaXMuZG9FbmRwb2ludEhhc0FwcHdhbnMgPSB0cnVlOyAvLyBzaG93IHByaXZhdGUgbmV0d29yayBib3gsIHdpbGwgYmUgZGVjaWRlZCB3aXRoIHRoaXMgdmFyaWFibGUuXG4gICAgfVxuICAgIHRoaXMuaW5pdFRvcG9WaWV3KCk7XG4gIH1cblxuICB0b2dnbGVNb2RhbFNpemUoKSB7XG4gICAgdGhpcy5mdWxsU2NyZWVuID0gIXRoaXMuZnVsbFNjcmVlbjtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxuXG4gIGluaXRUb3BvVmlldygpIHtcbiAgICBjb25zdCBtYXJnaW4gPSB7IHRvcDogMTAsIHJpZ2h0OiA5MCwgYm90dG9tOiAzMCwgbGVmdDogMCB9O1xuICAgIGNvbnN0IHdpZHRoID0gMTEwMCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xuICAgIGNvbnN0IGhlaWdodCA9IDExMDAgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbTtcbiAgICBjb25zdCBjb2xvcnMgPSBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCk7XG4gICAgY29uc3QgdG9vbHRpcCA9IGQzLnNlbGVjdCgnI2VwVG9vbHRpcCcpO1xuXG4gICAgbGV0IHN2ZyA9IGQzLnNlbGVjdCgnI0lkZW50aXR5VG9wb2xvZ3knKSxcbiAgICAgIG5vZGUsXG4gICAgICBsaW5rO1xuXG4gICAgY29uc3QgaGFuZGxlWm9vbSA9IChlKSA9PiBzdmcuYXR0cigndHJhbnNmb3JtJywgZS50cmFuc2Zvcm0pO1xuICAgIGNvbnN0IHpvb20gPSBkMy56b29tKCkub24oJ3pvb20nLCBoYW5kbGVab29tKTtcblxuICAgIHN2Z1xuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC8vIC5jYWxsKHpvb20pXG4gICAgICAuYXR0cigndmlld0JveCcsICcwICcgKyAtMTAgKyAnICcgKyB3aWR0aCArICcgJyArIGhlaWdodClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIC0zMDAgKyAnLCcgKyAyMjUgKyAnKScpO1xuXG4gICAgc3ZnLnNlbGVjdEFsbCgnZycpLnJlbW92ZSgpO1xuXG4gICAgY29uc3Qgc2ltdWxhdGlvbjogYW55ID0gZDNcbiAgICAgIC5mb3JjZVNpbXVsYXRpb24oKVxuICAgICAgLmZvcmNlKFxuICAgICAgICAnbGluaycsXG4gICAgICAgIGQzXG4gICAgICAgICAgLmZvcmNlTGluaygpXG4gICAgICAgICAgLmlkKGZ1bmN0aW9uIChkOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmRpc3RhbmNlKDEwMClcbiAgICAgICAgICAuc3RyZW5ndGgoMSlcbiAgICAgIClcbiAgICAgIC5mb3JjZSgnY2hhcmdlJywgZDMuZm9yY2VNYW55Qm9keSgpKVxuICAgICAgLmZvcmNlKCdjZW50ZXInLCBkMy5mb3JjZUNlbnRlcih3aWR0aCAvIDIsIGhlaWdodCAvIDIpKTtcblxuICAgIGNvbnN0IGxpbmtzID0gdGhpcy5ncmFwaEpzb25PYmoubGlua3M7XG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLmdyYXBoSnNvbk9iai5ub2RlcztcblxuICAgIGxpbmsgPSBzdmdcbiAgICAgIC5zZWxlY3RBbGwoJ2cubGluZS5saW5lJylcbiAgICAgIC5kYXRhKGxpbmtzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpbmsnKVxuICAgICAgLmF0dHIoJ21hcmtlci1lbmQnLCAndXJsKCNhcnJvd2hlYWQpJyk7XG5cbiAgICBsaW5rXG4gICAgICAuYXBwZW5kKCdsaW5lJylcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgaWYgKGQuc3RhdHVzID09PSAxIHx8IGQuc3RhdHVzID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiAxLjU7IC8vTWF0aC5zcXJ0KGQud2VpZ2h0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5zdHlsZSgnc3Ryb2tlJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgaWYgKGQuc3RhdHVzID09PSAxKSB7XG4gICAgICAgICAgbGV0IGRvSW5Vc2FnZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiAnIzAwY2QxMyc7XG4gICAgICAgIH0gZWxzZSBpZiAoZC5zdGF0dXMgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuICcjZDhkY2U3JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJyNmZjAwNGUnO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGxpbmsuZWFjaChmdW5jdGlvbiAodGhpczogYW55LCBkOiBhbnksIGkpIHtcbiAgICAgIGNvbnN0IF90aGlzID0gZDMuc2VsZWN0KHRoaXMpO1xuICAgICAgaWYgKGQuc3RhdHVzID09PSAxKSB7XG4gICAgICAgIGxldCBkb0luVXNhZ2UgPSB0cnVlOyAvLyBmYWxzZTtcbiAgICAgICAgX3RoaXNcbiAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAvLyAudGV4dChkLm5ldHNwZWVkKVxuICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IoMjU1LDE5OCwyMiknKVxuICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzExJyk7XG4gICAgICAgIF90aGlzXG4gICAgICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuICcjNTU1JztcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICBpZiAoZG9JblVzYWdlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIDAuMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgaWYgKGRvSW5Vc2FnZSkge1xuICAgICAgICAgICAgICByZXR1cm4gMztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAwLjE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYXBwZW5kKCdhbmltYXRlJyk7XG5cbiAgICAgICAgX3RoaXMuc2VsZWN0KCdyZWN0JykuYXBwZW5kKCdhbmltYXRlJyk7XG4gICAgICB9IGVsc2UgaWYgKGQuc3RhdHVzID09PSAwKSB7XG4gICAgICAgIF90aGlzXG4gICAgICAgICAgLmFwcGVuZCgnaW1hZ2UnKVxuICAgICAgICAgIC5hdHRyKCd4bGluazpocmVmJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICcvYXNzZXRzL2ltYWdlcy92aXN1YWxpemVyL2xpbmstY3V0LnBuZyc7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYXR0cignd2lkdGgnLCAnMjAnKVxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMjQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG5vZGUgPSBzdmdcbiAgICAgIC5zZWxlY3RBbGwoJy5ub2RlJylcbiAgICAgIC5kYXRhKG5vZGVzKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ25vZGUnKTtcblxuICAgIG5vZGVcbiAgICAgIC5hcHBlbmQoJ2ltYWdlJylcbiAgICAgIC5hdHRyKCd4bGluazpocmVmJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgY29uc3Qgcm91dGVySW1hZ2VQYXRoID0gJy9hc3NldHMvaW1hZ2VzL3Zpc3VhbGl6ZXIvUm91dGVycy5wbmcnO1xuICAgICAgICBjb25zdCBub25Qcm92aXNpb25lZFJvdXRlckltYWdlUGF0aCA9XG4gICAgICAgICAgJy9hc3NldHMvaW1hZ2VzL3Zpc3VhbGl6ZXIvRVIucG5nJztcbiAgICAgICAgY29uc3QgZXJyUm91dGVySW1hZ2VQYXRoID0gJy9hc3NldHMvaW1hZ2VzL3Zpc3VhbGl6ZXIvZXJyb3JfZXIucG5nJztcbiAgICAgICAgY29uc3QgZXJyRW5kcG9pbnRJbWFnZVBhdGggPSAnL2Fzc2V0cy9pbWFnZXMvdmlzdWFsaXplci9ob3N0LWVycm9yLnBuZyc7XG4gICAgICAgIGNvbnN0IHVucmVnaXN0ZXJlZEVuZHBvaW50SW1hZ2VQYXRoID1cbiAgICAgICAgICAnL2Fzc2V0cy9pbWFnZXMvdmlzdWFsaXplci9ob3N0X3VucmVnaXN0ZXJlZC5wbmcnO1xuICAgICAgICBjb25zdCBlbmRQb2ludFBhdGggPSAnL2Fzc2V0cy9pbWFnZXMvdmlzdWFsaXplci9ob3N0LnBuZyc7XG5cbiAgICAgICAgaWYgKGQudHlwZS5pbmNsdWRlcygnSWRlbnRpdHknKSAmJiBkLnN0YXR1cyA9PT0gJ1VuLVJlZ2lzdGVyZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIHVucmVnaXN0ZXJlZEVuZHBvaW50SW1hZ2VQYXRoO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGQudHlwZS5pbmNsdWRlcygnSWRlbnRpdHknKSAmJlxuICAgICAgICAgIGQuYXBpU2Vzc2lvbiA9PT0gJ1llcycgJiZcbiAgICAgICAgICBkLnN0YXR1cyA9PT0gJ1JlZ2lzdGVyZWQnXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlbmRQb2ludFBhdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZC50eXBlLmluY2x1ZGVzKCdJZGVudGl0eScpICYmXG4gICAgICAgICAgKGQucm91dGVyQ29ubmVjdGlvbiA9PT0gJ05vJyB8fCBkLmFwaVNlc3Npb24gPT09ICdObycpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlcnJFbmRwb2ludEltYWdlUGF0aDtcbiAgICAgICAgfSBlbHNlIGlmIChkLnR5cGUuaW5jbHVkZXMoJ0lkZW50aXR5JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5kUG9pbnRQYXRoO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGQudHlwZS5pbmNsdWRlcygnUm91dGVyJykgJiZcbiAgICAgICAgICAoZC5zdGF0dXMgPT09ICdFUlJPUicgfHwgZC5vbmxpbmUgPT09ICdObycpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlcnJSb3V0ZXJJbWFnZVBhdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoZC50eXBlLmluY2x1ZGVzKCdSb3V0ZXInKSAmJiBkLnN0YXR1cyA9PT0gJ1BST1ZJU0lPTkVEJykge1xuICAgICAgICAgIHJldHVybiByb3V0ZXJJbWFnZVBhdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoZC50eXBlLmluY2x1ZGVzKCdSb3V0ZXInKSkge1xuICAgICAgICAgIHJldHVybiBub25Qcm92aXNpb25lZFJvdXRlckltYWdlUGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkLmdyb3VwID09PSAnNCcpIHtcbiAgICAgICAgICByZXR1cm4gJy9hc3NldHMvaW1hZ2VzL3Zpc3VhbGl6ZXIvc2VydmljZS5wbmcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5hdHRyKCd4JywgLTI1KVxuICAgICAgLmF0dHIoJ3knLCAtMjUpXG4gICAgICAuYXR0cignd2lkdGgnLCAnNDAnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICc0MCcpO1xuXG4gICAgLy8gbm9kZS5hcHBlbmQoJ3RpdGxlJykgLnRleHQoZnVuY3Rpb24gKGQpIHtyZXR1cm4gZC5uYW1lO30pO1xuXG4gICAgbm9kZVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cigneCcsIDEwKVxuICAgICAgLmF0dHIoJ3knLCAxMilcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIC8vIGNvbnN0IG5hbWUgPSBkLnR5cGUuaW5jbHVkZXMoJ1NlcnZpY2UnKSA/IGQuYWxpYXMgOiBkLm5hbWU7XG4gICAgICAgIHJldHVybiBkLm5hbWU7XG4gICAgICB9KTtcblxuICAgIHNpbXVsYXRpb24ubm9kZXMobm9kZXMpLm9uKCd0aWNrJywgdGlja2VkKTtcblxuICAgIHNpbXVsYXRpb24uZm9yY2UoJ2xpbmsnKS5saW5rcyhsaW5rcyk7XG4gICAgbm9kZS5vbignbW91c2VvdmVyJywgKGV2ZW50LCBkKSA9PiB7XG4gICAgICBjb25zdCBlbmRwb2ludFV0bGl6YXRpb25Kc29uID0ge307XG4gICAgICBkcmF3VG9vbHRpcChldmVudCwgZCwgZW5kcG9pbnRVdGxpemF0aW9uSnNvbik7XG4gICAgfSk7XG5cbiAgICBub2RlLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbW92ZVRvb2x0aXAoKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHRpY2tlZCgpIHtcbiAgICAgIG5vZGUuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGQucG9zeCArICcsJyArIGQucG9zeSArICcpJztcbiAgICAgIH0pO1xuXG4gICAgICBsaW5rXG4gICAgICAgIC5zZWxlY3QoJ2xpbmUnKVxuICAgICAgICAuYXR0cigneDEnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnNvdXJjZS5wb3N4O1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cigneTEnLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnNvdXJjZS5wb3N5O1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cigneDInLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnRhcmdldC5wb3N4O1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cigneTInLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnRhcmdldC5wb3N5O1xuICAgICAgICB9KTtcblxuICAgICAgbGlua1xuICAgICAgICAuc2VsZWN0KCdpbWFnZScpXG4gICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICBjb25zdCB4MSA9IGQuc291cmNlLnBvc3gsXG4gICAgICAgICAgICB4MiA9IGQudGFyZ2V0LnBvc3gsXG4gICAgICAgICAgICB4ID0geDEgLSAoeDEgLSB4MikgLyAyO1xuXG4gICAgICAgICAgcmV0dXJuIHggLSA4O1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgY29uc3QgeTEgPSBkLnNvdXJjZS5wb3N5LFxuICAgICAgICAgICAgeTIgPSBkLnRhcmdldC5wb3N5LFxuICAgICAgICAgICAgeSA9IHkxIC0gKHkxIC0geTIpIC8gMjtcblxuICAgICAgICAgIHJldHVybiB5IC0gMTI7XG4gICAgICAgIH0pO1xuXG4gICAgICBsaW5rXG4gICAgICAgIC5zZWxlY3QoJ3JlY3QnKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5zb3VyY2UucG9zeDtcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLnNvdXJjZS5wb3N5O1xuICAgICAgICB9KVxuICAgICAgICAuc2VsZWN0QWxsKCdhbmltYXRlJylcbiAgICAgICAgLmVhY2goZnVuY3Rpb24gKHRoaXM6IGFueSwgZDogYW55LCBpKSB7XG4gICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKVxuICAgICAgICAgICAgICAuYXR0cignYXR0cmlidXRlTmFtZScsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd4JztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2Zyb20nLCBmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IGQuc291cmNlLnBvc3ggLSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuYXR0cigndG8nLCBmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQudGFyZ2V0LnBvc3g7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkMy5zZWxlY3QodGhpcylcbiAgICAgICAgICAgICAgLmF0dHIoJ2F0dHJpYnV0ZU5hbWUnLCBmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd5JztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmF0dHIoJ2Zyb20nLCBmdW5jdGlvbiAoZDogYW55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQuc291cmNlLnBvc3k7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5hdHRyKCd0bycsIGZ1bmN0aW9uIChkOiBhbnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50YXJnZXQucG9zeTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpXG4gICAgICAgICAgICAuYXR0cignYXR0cmlidXRlVHlwZScsICdYTUwnKVxuICAgICAgICAgICAgLmF0dHIoJ2JlZ2luJywgJzAuNXMnKVxuICAgICAgICAgICAgLmF0dHIoJ2R1cicsIGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnMS4wcyc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmF0dHIoJ3JlcGVhdENvdW50JywgJ2luZGVmaW5pdGUnKTtcbiAgICAgICAgfSk7XG4gICAgfSAvLyBlbmQgb2YgdGlja2VkXG5cbiAgICBmdW5jdGlvbiByZW1vdmVUb29sdGlwKCkge1xuICAgICAgaWYgKHRvb2x0aXApIHtcbiAgICAgICAgdG9vbHRpcC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHJhd1Rvb2x0aXAoZXZlbnQsIGQsIGVuZHBvaW50VXRsaXphdGlvbkpzb24pIHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcFRvb2x0aXAnKS5pbm5lckhUTUwgPSByZWFkS2V5VmFsdWVzKFxuICAgICAgICBkLFxuICAgICAgICBlbmRwb2ludFV0bGl6YXRpb25Kc29uXG4gICAgICApOyAvLyByZWFkT2JqZWN0VmFsdWVzKGQpO1xuICAgICAgdG9vbHRpcC5zdHlsZSgnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgdG9vbHRpcC5zdHlsZSgnd2hpdGUtc3BhY2UnLCAncHJlLXdyYXAnKTtcbiAgICAgIGNvbnN0IHggPSBldmVudC5wYWdlWCArICdweCc7XG4gICAgICBjb25zdCB5ID0gZXZlbnQucGFnZVkgKyAncHgnO1xuICAgICAgdG9vbHRpcC5zdHlsZSgnbGVmdCcsIHgpO1xuICAgICAgdG9vbHRpcC5zdHlsZSgndG9wJywgeSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZEtleVZhbHVlcyhkLCBlbmRwb2ludFV0bGl6YXRpb25Kc29uKSB7XG4gICAgICBsZXQgaW5mbyA9XG4gICAgICAgIFwiPGRpdiBjbGFzcz0ndG9vbC10aXAtY29udGFpbmVyJyBzdHlsZT0nZm9udC1zaXplOjE0cHg7Zm9udC1mYW1pbHk6T3BlbiBTYW5zOyBmb250LXdlaWdodDogNjAwOyBmb250LWNvbG9yOiB2YXIoLS10YWJsZVRleHQpOyc+XCI7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZCk7XG5cbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgayA9PT0gJ3N0YXR1cycgfHxcbiAgICAgICAgICBrID09PSAncG9zeScgfHxcbiAgICAgICAgICBrID09PSAncG9zeCcgfHxcbiAgICAgICAgICBrID09PSAnZ3JvdXAnIHx8XG4gICAgICAgICAgayA9PT0gJ2hvc3RlZEVkZ2VJZCcgfHxcbiAgICAgICAgICBrID09PSAndmFsdWUnIHx8XG4gICAgICAgICAgayA9PT0gJ2luZGV4JyB8fFxuICAgICAgICAgIGsgPT09ICdwYXJlbnQnIHx8XG4gICAgICAgICAgayA9PT0gJ2RlcHRoJyB8fFxuICAgICAgICAgIGsgPT09ICd4JyB8fFxuICAgICAgICAgIGsgPT09ICd5JyB8fFxuICAgICAgICAgIGsgPT09ICdpZCcgfHxcbiAgICAgICAgICBrID09PSAneDAnIHx8XG4gICAgICAgICAgayA9PT0gJ3kwJyB8fFxuICAgICAgICAgIGsgPT09ICd2eScgfHxcbiAgICAgICAgICBrID09PSAndngnXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGsgPT09ICdjaGlsZHJlbicpIHtcbiAgICAgICAgICBjb25zdCBrVmFsOiBhbnkgPSBkW2tdO1xuICAgICAgICAgIGlmIChrVmFsICYmIGtWYWwgIT09ICcnKSB7XG4gICAgICAgICAgICBpbmZvID0gaW5mbyArICc8ZGl2IGNsYXNzPVwicHJvcC1yb3dcIj48ZGl2IGNsYXNzPVwicHJvcC1uYW1lXCI+JyArIGsgKyAnOjwvZGl2PjxkaXYgY2xhc3M9XCJwcm9wLXZhbFwiPicgKyBrVmFsLmxlbmd0aCArICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNBbk9iamVjdChkW2tdKSkge1xuICAgICAgICAgICAgY29uc3Qga1ZhbDogYW55ID0gZFtrXTtcbiAgICAgICAgICAgIGlmIChrVmFsICYmIGtWYWwgIT09ICcnKSB7XG4gICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgJzxkaXYgY2xhc3M9XCJwcm9wLXJvd1wiPjxkaXYgY2xhc3M9XCJwcm9wLW5hbWVcIj4nICsgayArICc6PC9kaXY+PGRpdiBjbGFzcz1cInByb3AtdmFsXCI+JyArIGtWYWwubmFtZSArICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZFtrXSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBpbmZvID1cbiAgICAgICAgICAgICAgaW5mbyArXG4gICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwicHJvcC1yb3dcIj48ZGl2IGNsYXNzPVwicHJvcC1uYW1lXCI+JyArXG4gICAgICAgICAgICAgIGsgK1xuICAgICAgICAgICAgICAnOjwvZGl2PjxkaXYgY2xhc3M9XCJwcm9wLXZhbFwiPicgK1xuICAgICAgICAgICAgICBkW2tdLmpvaW4oJzxicj4gJm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOycpICtcbiAgICAgICAgICAgICAgJzwvZGl2PjwvZGl2Pic7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZvID0gZFtrXTtcbiAgICAgICAgICAgIGlmICh2byAmJiB2byAhPT0gJycpIHtcbiAgICAgICAgICAgICAgaW5mbyA9XG4gICAgICAgICAgICAgICAgaW5mbyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJwcm9wLXJvd1wiPjxkaXYgY2xhc3M9XCJwcm9wLW5hbWVcIj4nICtcbiAgICAgICAgICAgICAgICBrICtcbiAgICAgICAgICAgICAgICAnOjwvZGl2PjxkaXYgY2xhc3M9XCJwcm9wLXZhbFwiPicgK1xuICAgICAgICAgICAgICAgICh2byAhPT0gbnVsbCB8fCB2byAhPT0gJycgPyBkW2tdIDogJ04vQScpICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+PC9kaXY+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaW5mbyArICc8L2Rpdj4nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQW5PYmplY3Qobykge1xuICAgICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBPYmplY3QgJiYgby5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFJvdGF0ZSA9IGZhbHNlO1xuICB9IC8vIGVuZCBvZiBpbml0VG9wb1ZpZXdcbn1cblxuY2xhc3MgU2VydmljZURhdGEge1xuICBpZDtcbiAgbmFtZTtcbn1cblxuIiwiPGRpdiBbbmdDbGFzc109XCJ7ICdmdWxsLXNjcmVlbic6IGZ1bGxTY3JlZW4gfVwiIGNsYXNzPVwibW9kYWwgc29saWRcIiBpZD1cIklkZW50aXR5VmlzdWFsaXplckRhdGFNb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0cC1kYXRhLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWx0aXRsZVwiPklkZW50aXR5IFNlcnZpY2UgUGF0aDwvZGl2PlxuICAgICAgICA8ZGl2IChjbGljayk9XCJoaWRlKClcIiBjbGFzcz1cImJ1dHRvbkJhbGwgaWNvbi1jbG9zZVwiIGlkPVwiRXNjWkVuZHBvaW50Q2xvc2VcIj48L2Rpdj5cbiAgICAgICAgPGRpdiAoY2xpY2spPVwidG9nZ2xlTW9kYWxTaXplKClcIiBjbGFzcz1cImJ1dHRvbkJhbGwgcmVzaXplXCIgaWQ9XCJSZXNpemVNb2RhbEJ1dHRvblwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlkZW50aXR5LXRvcG9sb2d5LWNvbnRhaW5lclwiPlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiA4MHB4OyBmbG9hdDogbGVmdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVwLXRvcG9sb2d5LWZpbHRlci1jb250YWluZXIgbGlzdEJveCByb3dcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlclNlYXJjaEFycmF5KClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU2VydmljZVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9wb2xvZ3ktZmlsdGVyLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJmaWx0ZXJUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHRvIHNlYXJjaCBpZGVudGl0eSBhY2Nlc3NpYmxlIHNlcnZpY2VzLlwiXG4gICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoRmlsdGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlclRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsZWFyLXN2Yy1pY29uIGljb24tY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICBpZD1cIkNsZWFyU2VhcmNoRmlsdGVyXCJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBbaGlkZGVuXT1cIiFub1NlYXJjaFJlc3VsdHNcIiBjbGFzcz1cIm5vLXJlc3VsdHMtd2FybmluZ1wiPk5vIFJlc3VsdHMgRm91bmQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJhdXRvY29tcGxldGVTZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGF1dG9jb21wbGV0ZU9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BvdGlwXCIgaWQ9XCJlcFRvb2x0aXBcIj48L2Rpdj5cblxuICAgICAgICAgICAgPHN2ZyBzdHlsZT0ncG9pbnRlci1ldmVudHM6YWxsJyBoZWlnaHQ9XCIxMDAwXCIgaWQ9XCJJZGVudGl0eVRvcG9sb2d5XCIgd2lkdGg9XCIxMjAwXCI+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxsaWItbG9hZGluZy1pbmRpY2F0b3IgKm5nSWY9XCJpc0xvYWRpbmdcIiBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvbGliLWxvYWRpbmctaW5kaWNhdG9yPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BvbG9neS1sZWdlbmRBXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW0taGVhZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGV4dC1oZWFkaW5nXCI+Q29tcG9uZW50IFN0YXR1czwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSB1bnJlZ2lzdGVyZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5VbnJlZ2lzdGVyZWQgLyBPZmZsaW5lPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIHJlZ2lzdGVyZWRfaW5fdXNlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+UmVnaXN0ZXJlZCwgT25saW5lPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIGVycm9yZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5FcnJvcmVkPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRvcG9sb2d5LWxlZ2VuZEJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbS1oZWFkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0LWhlYWRpbmdcIj5MaW5rIFN0YXR1czwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWNpcmNsZSB1bnJlZ2lzdGVyZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5PZmZsaW5lPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtY2lyY2xlIHJlZ2lzdGVyZWRfaW5fdXNlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+SW4gVXNhZ2U8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1jaXJjbGUgcmVnaXN0ZXJlZF9ub3RfaW5fdXNlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10ZXh0XCI+VXNhZ2UgRGF0ZSBOL0E8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1jaXJjbGUgbGlua2Vycm9yZWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRleHRcIj5FcnJvcmVkPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19