@sidekick-coder/zenith-kit 0.0.12 → 0.0.14

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 (436) hide show
  1. package/bin/zenith.js +27 -0
  2. package/bin/zkit.js +26 -0
  3. package/cli/commands/build.js +49 -0
  4. package/cli/commands/generateLegacyFolder.js +38 -0
  5. package/cli/commands/generatePluginId.js +17 -0
  6. package/cli/config.js +23 -0
  7. package/cli/utils/createWrapper.js +17 -0
  8. package/dist/client/index.d.mts +513 -0
  9. package/dist/client/index.mjs +2 -0
  10. package/dist/components/index.es.js +63946 -0
  11. package/dist/components/styles.css +4833 -0
  12. package/dist/server/index.d.mts +1780 -1314
  13. package/dist/server/index.mjs +5 -7754
  14. package/dist/shared/chunk-0Lt9GpW0.mjs +1 -0
  15. package/dist/shared/index.d.mts +472 -19
  16. package/dist/shared/index.mjs +2 -841
  17. package/legacy/client/components/Alert.vue +3 -0
  18. package/legacy/client/components/AlertButton.vue +3 -0
  19. package/legacy/client/components/Button.vue +3 -0
  20. package/legacy/client/components/ClientOnly.vue +3 -0
  21. package/legacy/client/components/ColorPicker.vue +3 -0
  22. package/legacy/client/components/ColorWheel.vue +3 -0
  23. package/legacy/client/components/Component.vue +3 -0
  24. package/legacy/client/components/DataTable.vue +4 -0
  25. package/legacy/client/components/DataTablePagination.vue +3 -0
  26. package/legacy/client/components/DatePicker.vue +3 -0
  27. package/legacy/client/components/DialogForm.vue +4 -0
  28. package/legacy/client/components/FileUploader.vue +3 -0
  29. package/legacy/client/components/FormAutoFieldList.vue +3 -0
  30. package/legacy/client/components/FormAutocomplete.vue +3 -0
  31. package/legacy/client/components/FormColorPicker.vue +3 -0
  32. package/legacy/client/components/FormDatePicker.vue +3 -0
  33. package/legacy/client/components/FormFilePicker.vue +3 -0
  34. package/legacy/client/components/FormFileUploader.vue +3 -0
  35. package/legacy/client/components/FormImageUploader.vue +3 -0
  36. package/legacy/client/components/FormJsonInput.vue +3 -0
  37. package/legacy/client/components/FormSelect.vue +3 -0
  38. package/legacy/client/components/FormStringListInput.vue +3 -0
  39. package/legacy/client/components/FormSwitch.vue +3 -0
  40. package/legacy/client/components/FormTextField.vue +3 -0
  41. package/legacy/client/components/FormTextarea.vue +3 -0
  42. package/legacy/client/components/Icon.vue +3 -0
  43. package/legacy/client/components/Image.vue +3 -0
  44. package/legacy/client/components/JsonInput.vue +3 -0
  45. package/legacy/client/components/Logo.vue +3 -0
  46. package/legacy/client/components/LogoIcon.vue +3 -0
  47. package/legacy/client/components/ObjectInspect.vue +3 -0
  48. package/legacy/client/components/PageCrud.vue +3 -0
  49. package/legacy/client/components/PageSubtitle.vue +3 -0
  50. package/legacy/client/components/PageTable.vue +3 -0
  51. package/legacy/client/components/PageTitle.vue +3 -0
  52. package/legacy/client/components/Pagination.vue +3 -0
  53. package/legacy/client/components/Select.vue +3 -0
  54. package/legacy/client/components/StringListInput.vue +3 -0
  55. package/legacy/client/components/Switch.vue +3 -0
  56. package/legacy/client/components/TextField.vue +3 -0
  57. package/legacy/client/components/Textarea.vue +3 -0
  58. package/legacy/client/components/UserMenu.vue +3 -0
  59. package/legacy/client/components/index.ts +349 -0
  60. package/legacy/client/components/ui/accordion/Accordion.vue +3 -0
  61. package/legacy/client/components/ui/accordion/AccordionContent.vue +3 -0
  62. package/legacy/client/components/ui/accordion/AccordionItem.vue +3 -0
  63. package/legacy/client/components/ui/accordion/AccordionTrigger.vue +3 -0
  64. package/legacy/client/components/ui/accordion/index.ts +1 -0
  65. package/legacy/client/components/ui/alert/Alert.vue +3 -0
  66. package/legacy/client/components/ui/alert/AlertDescription.vue +3 -0
  67. package/legacy/client/components/ui/alert/AlertTitle.vue +3 -0
  68. package/legacy/client/components/ui/alert/index.ts +1 -0
  69. package/legacy/client/components/ui/alert-dialog/AlertDialog.vue +3 -0
  70. package/legacy/client/components/ui/alert-dialog/AlertDialogAction.vue +3 -0
  71. package/legacy/client/components/ui/alert-dialog/AlertDialogCancel.vue +3 -0
  72. package/legacy/client/components/ui/alert-dialog/AlertDialogContent.vue +3 -0
  73. package/legacy/client/components/ui/alert-dialog/AlertDialogDescription.vue +3 -0
  74. package/legacy/client/components/ui/alert-dialog/AlertDialogFooter.vue +3 -0
  75. package/legacy/client/components/ui/alert-dialog/AlertDialogHeader.vue +3 -0
  76. package/legacy/client/components/ui/alert-dialog/AlertDialogTitle.vue +3 -0
  77. package/legacy/client/components/ui/alert-dialog/AlertDialogTrigger.vue +3 -0
  78. package/legacy/client/components/ui/alert-dialog/index.ts +1 -0
  79. package/legacy/client/components/ui/aspect-ratio/AspectRatio.vue +3 -0
  80. package/legacy/client/components/ui/aspect-ratio/index.ts +1 -0
  81. package/legacy/client/components/ui/avatar/Avatar.vue +3 -0
  82. package/legacy/client/components/ui/avatar/AvatarFallback.vue +3 -0
  83. package/legacy/client/components/ui/avatar/AvatarImage.vue +3 -0
  84. package/legacy/client/components/ui/avatar/index.ts +1 -0
  85. package/legacy/client/components/ui/badge/Badge.vue +3 -0
  86. package/legacy/client/components/ui/badge/index.ts +1 -0
  87. package/legacy/client/components/ui/breadcrumb/Breadcrumb.vue +3 -0
  88. package/legacy/client/components/ui/breadcrumb/BreadcrumbEllipsis.vue +3 -0
  89. package/legacy/client/components/ui/breadcrumb/BreadcrumbItem.vue +3 -0
  90. package/legacy/client/components/ui/breadcrumb/BreadcrumbLink.vue +3 -0
  91. package/legacy/client/components/ui/breadcrumb/BreadcrumbList.vue +3 -0
  92. package/legacy/client/components/ui/breadcrumb/BreadcrumbPage.vue +3 -0
  93. package/legacy/client/components/ui/breadcrumb/BreadcrumbSeparator.vue +3 -0
  94. package/legacy/client/components/ui/breadcrumb/index.ts +1 -0
  95. package/legacy/client/components/ui/button/Button.vue +3 -0
  96. package/legacy/client/components/ui/button/index.ts +1 -0
  97. package/legacy/client/components/ui/calendar/Calendar.vue +3 -0
  98. package/legacy/client/components/ui/calendar/CalendarCell.vue +3 -0
  99. package/legacy/client/components/ui/calendar/CalendarCellTrigger.vue +3 -0
  100. package/legacy/client/components/ui/calendar/CalendarGrid.vue +3 -0
  101. package/legacy/client/components/ui/calendar/CalendarGridBody.vue +3 -0
  102. package/legacy/client/components/ui/calendar/CalendarGridHead.vue +3 -0
  103. package/legacy/client/components/ui/calendar/CalendarGridRow.vue +3 -0
  104. package/legacy/client/components/ui/calendar/CalendarHeadCell.vue +3 -0
  105. package/legacy/client/components/ui/calendar/CalendarHeader.vue +3 -0
  106. package/legacy/client/components/ui/calendar/CalendarHeading.vue +3 -0
  107. package/legacy/client/components/ui/calendar/CalendarNextButton.vue +3 -0
  108. package/legacy/client/components/ui/calendar/CalendarPrevButton.vue +3 -0
  109. package/legacy/client/components/ui/calendar/index.ts +1 -0
  110. package/legacy/client/components/ui/card/Card.vue +3 -0
  111. package/legacy/client/components/ui/card/CardAction.vue +3 -0
  112. package/legacy/client/components/ui/card/CardContent.vue +3 -0
  113. package/legacy/client/components/ui/card/CardDescription.vue +3 -0
  114. package/legacy/client/components/ui/card/CardFooter.vue +3 -0
  115. package/legacy/client/components/ui/card/CardHeader.vue +3 -0
  116. package/legacy/client/components/ui/card/CardTitle.vue +3 -0
  117. package/legacy/client/components/ui/card/index.ts +1 -0
  118. package/legacy/client/components/ui/carousel/Carousel.vue +3 -0
  119. package/legacy/client/components/ui/carousel/CarouselContent.vue +3 -0
  120. package/legacy/client/components/ui/carousel/CarouselItem.vue +3 -0
  121. package/legacy/client/components/ui/carousel/CarouselNext.vue +3 -0
  122. package/legacy/client/components/ui/carousel/CarouselPrevious.vue +3 -0
  123. package/legacy/client/components/ui/carousel/index.ts +1 -0
  124. package/legacy/client/components/ui/checkbox/Checkbox.vue +3 -0
  125. package/legacy/client/components/ui/checkbox/index.ts +1 -0
  126. package/legacy/client/components/ui/collapsible/Collapsible.vue +3 -0
  127. package/legacy/client/components/ui/collapsible/CollapsibleContent.vue +3 -0
  128. package/legacy/client/components/ui/collapsible/CollapsibleTrigger.vue +3 -0
  129. package/legacy/client/components/ui/collapsible/index.ts +1 -0
  130. package/legacy/client/components/ui/combobox/Combobox.vue +3 -0
  131. package/legacy/client/components/ui/combobox/ComboboxAnchor.vue +3 -0
  132. package/legacy/client/components/ui/combobox/ComboboxEmpty.vue +3 -0
  133. package/legacy/client/components/ui/combobox/ComboboxGroup.vue +3 -0
  134. package/legacy/client/components/ui/combobox/ComboboxInput.vue +3 -0
  135. package/legacy/client/components/ui/combobox/ComboboxItem.vue +3 -0
  136. package/legacy/client/components/ui/combobox/ComboboxItemIndicator.vue +3 -0
  137. package/legacy/client/components/ui/combobox/ComboboxList.vue +3 -0
  138. package/legacy/client/components/ui/combobox/ComboboxSeparator.vue +3 -0
  139. package/legacy/client/components/ui/combobox/ComboboxTrigger.vue +3 -0
  140. package/legacy/client/components/ui/combobox/ComboboxViewport.vue +3 -0
  141. package/legacy/client/components/ui/combobox/index.ts +1 -0
  142. package/legacy/client/components/ui/command/Command.vue +3 -0
  143. package/legacy/client/components/ui/command/CommandDialog.vue +3 -0
  144. package/legacy/client/components/ui/command/CommandEmpty.vue +3 -0
  145. package/legacy/client/components/ui/command/CommandGroup.vue +3 -0
  146. package/legacy/client/components/ui/command/CommandInput.vue +3 -0
  147. package/legacy/client/components/ui/command/CommandItem.vue +3 -0
  148. package/legacy/client/components/ui/command/CommandList.vue +3 -0
  149. package/legacy/client/components/ui/command/CommandSeparator.vue +3 -0
  150. package/legacy/client/components/ui/command/CommandShortcut.vue +3 -0
  151. package/legacy/client/components/ui/command/index.ts +1 -0
  152. package/legacy/client/components/ui/context-menu/ContextMenu.vue +3 -0
  153. package/legacy/client/components/ui/context-menu/ContextMenuCheckboxItem.vue +3 -0
  154. package/legacy/client/components/ui/context-menu/ContextMenuContent.vue +3 -0
  155. package/legacy/client/components/ui/context-menu/ContextMenuGroup.vue +3 -0
  156. package/legacy/client/components/ui/context-menu/ContextMenuItem.vue +3 -0
  157. package/legacy/client/components/ui/context-menu/ContextMenuLabel.vue +3 -0
  158. package/legacy/client/components/ui/context-menu/ContextMenuPortal.vue +3 -0
  159. package/legacy/client/components/ui/context-menu/ContextMenuRadioGroup.vue +3 -0
  160. package/legacy/client/components/ui/context-menu/ContextMenuRadioItem.vue +3 -0
  161. package/legacy/client/components/ui/context-menu/ContextMenuSeparator.vue +3 -0
  162. package/legacy/client/components/ui/context-menu/ContextMenuShortcut.vue +3 -0
  163. package/legacy/client/components/ui/context-menu/ContextMenuSub.vue +3 -0
  164. package/legacy/client/components/ui/context-menu/ContextMenuSubContent.vue +3 -0
  165. package/legacy/client/components/ui/context-menu/ContextMenuSubTrigger.vue +3 -0
  166. package/legacy/client/components/ui/context-menu/ContextMenuTrigger.vue +3 -0
  167. package/legacy/client/components/ui/context-menu/index.ts +1 -0
  168. package/legacy/client/components/ui/dialog/Dialog.vue +3 -0
  169. package/legacy/client/components/ui/dialog/DialogClose.vue +3 -0
  170. package/legacy/client/components/ui/dialog/DialogContent.vue +3 -0
  171. package/legacy/client/components/ui/dialog/DialogDescription.vue +3 -0
  172. package/legacy/client/components/ui/dialog/DialogFooter.vue +3 -0
  173. package/legacy/client/components/ui/dialog/DialogHeader.vue +3 -0
  174. package/legacy/client/components/ui/dialog/DialogOverlay.vue +3 -0
  175. package/legacy/client/components/ui/dialog/DialogScrollContent.vue +3 -0
  176. package/legacy/client/components/ui/dialog/DialogTitle.vue +3 -0
  177. package/legacy/client/components/ui/dialog/DialogTrigger.vue +3 -0
  178. package/legacy/client/components/ui/dialog/index.ts +1 -0
  179. package/legacy/client/components/ui/drawer/Drawer.vue +3 -0
  180. package/legacy/client/components/ui/drawer/DrawerClose.vue +3 -0
  181. package/legacy/client/components/ui/drawer/DrawerContent.vue +3 -0
  182. package/legacy/client/components/ui/drawer/DrawerDescription.vue +3 -0
  183. package/legacy/client/components/ui/drawer/DrawerFooter.vue +3 -0
  184. package/legacy/client/components/ui/drawer/DrawerHeader.vue +3 -0
  185. package/legacy/client/components/ui/drawer/DrawerOverlay.vue +3 -0
  186. package/legacy/client/components/ui/drawer/DrawerTitle.vue +3 -0
  187. package/legacy/client/components/ui/drawer/DrawerTrigger.vue +3 -0
  188. package/legacy/client/components/ui/drawer/index.ts +1 -0
  189. package/legacy/client/components/ui/dropdown-menu/DropdownMenu.vue +3 -0
  190. package/legacy/client/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +3 -0
  191. package/legacy/client/components/ui/dropdown-menu/DropdownMenuContent.vue +3 -0
  192. package/legacy/client/components/ui/dropdown-menu/DropdownMenuGroup.vue +3 -0
  193. package/legacy/client/components/ui/dropdown-menu/DropdownMenuItem.vue +3 -0
  194. package/legacy/client/components/ui/dropdown-menu/DropdownMenuLabel.vue +3 -0
  195. package/legacy/client/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +3 -0
  196. package/legacy/client/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +3 -0
  197. package/legacy/client/components/ui/dropdown-menu/DropdownMenuSeparator.vue +3 -0
  198. package/legacy/client/components/ui/dropdown-menu/DropdownMenuShortcut.vue +3 -0
  199. package/legacy/client/components/ui/dropdown-menu/DropdownMenuSub.vue +3 -0
  200. package/legacy/client/components/ui/dropdown-menu/DropdownMenuSubContent.vue +3 -0
  201. package/legacy/client/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +3 -0
  202. package/legacy/client/components/ui/dropdown-menu/DropdownMenuTrigger.vue +3 -0
  203. package/legacy/client/components/ui/dropdown-menu/index.ts +1 -0
  204. package/legacy/client/components/ui/form/FormControl.vue +3 -0
  205. package/legacy/client/components/ui/form/FormDescription.vue +3 -0
  206. package/legacy/client/components/ui/form/FormItem.vue +3 -0
  207. package/legacy/client/components/ui/form/FormLabel.vue +3 -0
  208. package/legacy/client/components/ui/form/FormMessage.vue +3 -0
  209. package/legacy/client/components/ui/form/index.ts +1 -0
  210. package/legacy/client/components/ui/hover-card/HoverCard.vue +3 -0
  211. package/legacy/client/components/ui/hover-card/HoverCardContent.vue +3 -0
  212. package/legacy/client/components/ui/hover-card/HoverCardTrigger.vue +3 -0
  213. package/legacy/client/components/ui/hover-card/index.ts +1 -0
  214. package/legacy/client/components/ui/input/Input.vue +3 -0
  215. package/legacy/client/components/ui/input/index.ts +1 -0
  216. package/legacy/client/components/ui/label/Label.vue +3 -0
  217. package/legacy/client/components/ui/label/index.ts +1 -0
  218. package/legacy/client/components/ui/menubar/Menubar.vue +3 -0
  219. package/legacy/client/components/ui/menubar/MenubarCheckboxItem.vue +3 -0
  220. package/legacy/client/components/ui/menubar/MenubarContent.vue +3 -0
  221. package/legacy/client/components/ui/menubar/MenubarGroup.vue +3 -0
  222. package/legacy/client/components/ui/menubar/MenubarItem.vue +3 -0
  223. package/legacy/client/components/ui/menubar/MenubarLabel.vue +3 -0
  224. package/legacy/client/components/ui/menubar/MenubarMenu.vue +3 -0
  225. package/legacy/client/components/ui/menubar/MenubarRadioGroup.vue +3 -0
  226. package/legacy/client/components/ui/menubar/MenubarRadioItem.vue +3 -0
  227. package/legacy/client/components/ui/menubar/MenubarSeparator.vue +3 -0
  228. package/legacy/client/components/ui/menubar/MenubarShortcut.vue +3 -0
  229. package/legacy/client/components/ui/menubar/MenubarSub.vue +3 -0
  230. package/legacy/client/components/ui/menubar/MenubarSubContent.vue +3 -0
  231. package/legacy/client/components/ui/menubar/MenubarSubTrigger.vue +3 -0
  232. package/legacy/client/components/ui/menubar/MenubarTrigger.vue +3 -0
  233. package/legacy/client/components/ui/menubar/index.ts +1 -0
  234. package/legacy/client/components/ui/navigation-menu/NavigationMenu.vue +3 -0
  235. package/legacy/client/components/ui/navigation-menu/NavigationMenuContent.vue +3 -0
  236. package/legacy/client/components/ui/navigation-menu/NavigationMenuIndicator.vue +3 -0
  237. package/legacy/client/components/ui/navigation-menu/NavigationMenuItem.vue +3 -0
  238. package/legacy/client/components/ui/navigation-menu/NavigationMenuLink.vue +3 -0
  239. package/legacy/client/components/ui/navigation-menu/NavigationMenuList.vue +3 -0
  240. package/legacy/client/components/ui/navigation-menu/NavigationMenuTrigger.vue +3 -0
  241. package/legacy/client/components/ui/navigation-menu/NavigationMenuViewport.vue +3 -0
  242. package/legacy/client/components/ui/navigation-menu/index.ts +1 -0
  243. package/legacy/client/components/ui/number-field/NumberField.vue +3 -0
  244. package/legacy/client/components/ui/number-field/NumberFieldContent.vue +3 -0
  245. package/legacy/client/components/ui/number-field/NumberFieldDecrement.vue +3 -0
  246. package/legacy/client/components/ui/number-field/NumberFieldIncrement.vue +3 -0
  247. package/legacy/client/components/ui/number-field/NumberFieldInput.vue +3 -0
  248. package/legacy/client/components/ui/number-field/index.ts +1 -0
  249. package/legacy/client/components/ui/pagination/Pagination.vue +3 -0
  250. package/legacy/client/components/ui/pagination/PaginationContent.vue +3 -0
  251. package/legacy/client/components/ui/pagination/PaginationEllipsis.vue +3 -0
  252. package/legacy/client/components/ui/pagination/PaginationFirst.vue +3 -0
  253. package/legacy/client/components/ui/pagination/PaginationItem.vue +3 -0
  254. package/legacy/client/components/ui/pagination/PaginationLast.vue +3 -0
  255. package/legacy/client/components/ui/pagination/PaginationNext.vue +3 -0
  256. package/legacy/client/components/ui/pagination/PaginationPrevious.vue +3 -0
  257. package/legacy/client/components/ui/pagination/index.ts +1 -0
  258. package/legacy/client/components/ui/pin-input/PinInput.vue +3 -0
  259. package/legacy/client/components/ui/pin-input/PinInputGroup.vue +3 -0
  260. package/legacy/client/components/ui/pin-input/PinInputSeparator.vue +3 -0
  261. package/legacy/client/components/ui/pin-input/PinInputSlot.vue +3 -0
  262. package/legacy/client/components/ui/pin-input/index.ts +1 -0
  263. package/legacy/client/components/ui/popover/Popover.vue +3 -0
  264. package/legacy/client/components/ui/popover/PopoverAnchor.vue +3 -0
  265. package/legacy/client/components/ui/popover/PopoverContent.vue +3 -0
  266. package/legacy/client/components/ui/popover/PopoverTrigger.vue +3 -0
  267. package/legacy/client/components/ui/popover/index.ts +1 -0
  268. package/legacy/client/components/ui/progress/Progress.vue +3 -0
  269. package/legacy/client/components/ui/progress/index.ts +1 -0
  270. package/legacy/client/components/ui/radio-group/RadioGroup.vue +3 -0
  271. package/legacy/client/components/ui/radio-group/RadioGroupItem.vue +3 -0
  272. package/legacy/client/components/ui/radio-group/index.ts +1 -0
  273. package/legacy/client/components/ui/range-calendar/RangeCalendar.vue +3 -0
  274. package/legacy/client/components/ui/range-calendar/RangeCalendarCell.vue +3 -0
  275. package/legacy/client/components/ui/range-calendar/RangeCalendarCellTrigger.vue +3 -0
  276. package/legacy/client/components/ui/range-calendar/RangeCalendarGrid.vue +3 -0
  277. package/legacy/client/components/ui/range-calendar/RangeCalendarGridBody.vue +3 -0
  278. package/legacy/client/components/ui/range-calendar/RangeCalendarGridHead.vue +3 -0
  279. package/legacy/client/components/ui/range-calendar/RangeCalendarGridRow.vue +3 -0
  280. package/legacy/client/components/ui/range-calendar/RangeCalendarHeadCell.vue +3 -0
  281. package/legacy/client/components/ui/range-calendar/RangeCalendarHeader.vue +3 -0
  282. package/legacy/client/components/ui/range-calendar/RangeCalendarHeading.vue +3 -0
  283. package/legacy/client/components/ui/range-calendar/RangeCalendarNextButton.vue +3 -0
  284. package/legacy/client/components/ui/range-calendar/RangeCalendarPrevButton.vue +3 -0
  285. package/legacy/client/components/ui/range-calendar/index.ts +1 -0
  286. package/legacy/client/components/ui/resizable/ResizableHandle.vue +3 -0
  287. package/legacy/client/components/ui/resizable/ResizablePanel.vue +3 -0
  288. package/legacy/client/components/ui/resizable/ResizablePanelGroup.vue +3 -0
  289. package/legacy/client/components/ui/resizable/index.ts +1 -0
  290. package/legacy/client/components/ui/scroll-area/ScrollArea.vue +3 -0
  291. package/legacy/client/components/ui/scroll-area/ScrollBar.vue +3 -0
  292. package/legacy/client/components/ui/scroll-area/index.ts +1 -0
  293. package/legacy/client/components/ui/select/Select.vue +3 -0
  294. package/legacy/client/components/ui/select/SelectContent.vue +3 -0
  295. package/legacy/client/components/ui/select/SelectGroup.vue +3 -0
  296. package/legacy/client/components/ui/select/SelectItem.vue +3 -0
  297. package/legacy/client/components/ui/select/SelectItemText.vue +3 -0
  298. package/legacy/client/components/ui/select/SelectLabel.vue +3 -0
  299. package/legacy/client/components/ui/select/SelectScrollDownButton.vue +3 -0
  300. package/legacy/client/components/ui/select/SelectScrollUpButton.vue +3 -0
  301. package/legacy/client/components/ui/select/SelectSeparator.vue +3 -0
  302. package/legacy/client/components/ui/select/SelectTrigger.vue +3 -0
  303. package/legacy/client/components/ui/select/SelectValue.vue +3 -0
  304. package/legacy/client/components/ui/select/index.ts +1 -0
  305. package/legacy/client/components/ui/separator/Separator.vue +3 -0
  306. package/legacy/client/components/ui/separator/index.ts +1 -0
  307. package/legacy/client/components/ui/sheet/Sheet.vue +3 -0
  308. package/legacy/client/components/ui/sheet/SheetClose.vue +3 -0
  309. package/legacy/client/components/ui/sheet/SheetContent.vue +3 -0
  310. package/legacy/client/components/ui/sheet/SheetDescription.vue +3 -0
  311. package/legacy/client/components/ui/sheet/SheetFooter.vue +3 -0
  312. package/legacy/client/components/ui/sheet/SheetHeader.vue +3 -0
  313. package/legacy/client/components/ui/sheet/SheetOverlay.vue +3 -0
  314. package/legacy/client/components/ui/sheet/SheetTitle.vue +3 -0
  315. package/legacy/client/components/ui/sheet/SheetTrigger.vue +3 -0
  316. package/legacy/client/components/ui/sheet/index.ts +1 -0
  317. package/legacy/client/components/ui/sidebar/Sidebar.vue +3 -0
  318. package/legacy/client/components/ui/sidebar/SidebarContent.vue +3 -0
  319. package/legacy/client/components/ui/sidebar/SidebarFooter.vue +3 -0
  320. package/legacy/client/components/ui/sidebar/SidebarGroup.vue +3 -0
  321. package/legacy/client/components/ui/sidebar/SidebarGroupAction.vue +3 -0
  322. package/legacy/client/components/ui/sidebar/SidebarGroupContent.vue +3 -0
  323. package/legacy/client/components/ui/sidebar/SidebarGroupLabel.vue +3 -0
  324. package/legacy/client/components/ui/sidebar/SidebarHeader.vue +3 -0
  325. package/legacy/client/components/ui/sidebar/SidebarInput.vue +3 -0
  326. package/legacy/client/components/ui/sidebar/SidebarInset.vue +3 -0
  327. package/legacy/client/components/ui/sidebar/SidebarMenu.vue +3 -0
  328. package/legacy/client/components/ui/sidebar/SidebarMenuAction.vue +3 -0
  329. package/legacy/client/components/ui/sidebar/SidebarMenuBadge.vue +3 -0
  330. package/legacy/client/components/ui/sidebar/SidebarMenuButton.vue +3 -0
  331. package/legacy/client/components/ui/sidebar/SidebarMenuButtonChild.vue +3 -0
  332. package/legacy/client/components/ui/sidebar/SidebarMenuItem.vue +3 -0
  333. package/legacy/client/components/ui/sidebar/SidebarMenuSkeleton.vue +3 -0
  334. package/legacy/client/components/ui/sidebar/SidebarMenuSub.vue +3 -0
  335. package/legacy/client/components/ui/sidebar/SidebarMenuSubButton.vue +3 -0
  336. package/legacy/client/components/ui/sidebar/SidebarMenuSubItem.vue +3 -0
  337. package/legacy/client/components/ui/sidebar/SidebarProvider.vue +3 -0
  338. package/legacy/client/components/ui/sidebar/SidebarRail.vue +3 -0
  339. package/legacy/client/components/ui/sidebar/SidebarSeparator.vue +3 -0
  340. package/legacy/client/components/ui/sidebar/SidebarTrigger.vue +3 -0
  341. package/legacy/client/components/ui/sidebar/index.ts +1 -0
  342. package/legacy/client/components/ui/skeleton/Skeleton.vue +3 -0
  343. package/legacy/client/components/ui/skeleton/index.ts +1 -0
  344. package/legacy/client/components/ui/slider/Slider.vue +3 -0
  345. package/legacy/client/components/ui/slider/index.ts +1 -0
  346. package/legacy/client/components/ui/sonner/Sonner.vue +3 -0
  347. package/legacy/client/components/ui/sonner/index.ts +1 -0
  348. package/legacy/client/components/ui/stepper/Stepper.vue +3 -0
  349. package/legacy/client/components/ui/stepper/StepperDescription.vue +3 -0
  350. package/legacy/client/components/ui/stepper/StepperIndicator.vue +3 -0
  351. package/legacy/client/components/ui/stepper/StepperItem.vue +3 -0
  352. package/legacy/client/components/ui/stepper/StepperSeparator.vue +3 -0
  353. package/legacy/client/components/ui/stepper/StepperTitle.vue +3 -0
  354. package/legacy/client/components/ui/stepper/StepperTrigger.vue +3 -0
  355. package/legacy/client/components/ui/stepper/index.ts +1 -0
  356. package/legacy/client/components/ui/switch/Switch.vue +3 -0
  357. package/legacy/client/components/ui/switch/index.ts +1 -0
  358. package/legacy/client/components/ui/table/Table.vue +3 -0
  359. package/legacy/client/components/ui/table/TableBody.vue +3 -0
  360. package/legacy/client/components/ui/table/TableCaption.vue +3 -0
  361. package/legacy/client/components/ui/table/TableCell.vue +3 -0
  362. package/legacy/client/components/ui/table/TableEmpty.vue +3 -0
  363. package/legacy/client/components/ui/table/TableFooter.vue +3 -0
  364. package/legacy/client/components/ui/table/TableHead.vue +3 -0
  365. package/legacy/client/components/ui/table/TableHeader.vue +3 -0
  366. package/legacy/client/components/ui/table/TableRow.vue +3 -0
  367. package/legacy/client/components/ui/table/index.ts +1 -0
  368. package/legacy/client/components/ui/tabs/Tabs.vue +3 -0
  369. package/legacy/client/components/ui/tabs/TabsContent.vue +3 -0
  370. package/legacy/client/components/ui/tabs/TabsList.vue +3 -0
  371. package/legacy/client/components/ui/tabs/TabsTrigger.vue +3 -0
  372. package/legacy/client/components/ui/tabs/index.ts +1 -0
  373. package/legacy/client/components/ui/tags-input/TagsInput.vue +3 -0
  374. package/legacy/client/components/ui/tags-input/TagsInputInput.vue +3 -0
  375. package/legacy/client/components/ui/tags-input/TagsInputItem.vue +3 -0
  376. package/legacy/client/components/ui/tags-input/TagsInputItemDelete.vue +3 -0
  377. package/legacy/client/components/ui/tags-input/TagsInputItemText.vue +3 -0
  378. package/legacy/client/components/ui/tags-input/index.ts +1 -0
  379. package/legacy/client/components/ui/textarea/Textarea.vue +3 -0
  380. package/legacy/client/components/ui/textarea/index.ts +1 -0
  381. package/legacy/client/components/ui/toggle/Toggle.vue +3 -0
  382. package/legacy/client/components/ui/toggle/index.ts +1 -0
  383. package/legacy/client/components/ui/toggle-group/ToggleGroup.vue +3 -0
  384. package/legacy/client/components/ui/toggle-group/ToggleGroupItem.vue +3 -0
  385. package/legacy/client/components/ui/toggle-group/index.ts +1 -0
  386. package/legacy/client/components/ui/tooltip/Tooltip.vue +3 -0
  387. package/legacy/client/components/ui/tooltip/TooltipContent.vue +3 -0
  388. package/legacy/client/components/ui/tooltip/TooltipProvider.vue +3 -0
  389. package/legacy/client/components/ui/tooltip/TooltipTrigger.vue +3 -0
  390. package/legacy/client/components/ui/tooltip/index.ts +1 -0
  391. package/legacy/client/facades/acl.facade.ts +1 -0
  392. package/legacy/client/facades/app.facade.ts +6 -0
  393. package/legacy/client/facades/auth.facade.ts +1 -0
  394. package/legacy/client/facades/config.facade.ts +1 -0
  395. package/legacy/client/facades/fetch.facade.ts +1 -0
  396. package/legacy/client/facades/logger.facade.ts +1 -0
  397. package/legacy/client/facades/menu.facade.ts +1 -0
  398. package/legacy/client/facades/router.facade.ts +1 -0
  399. package/legacy/client/facades/translator.facade.ts +10 -0
  400. package/legacy/client/utils/autoPages.ts +1 -0
  401. package/legacy/client/utils/createId.ts +1 -0
  402. package/legacy/client/utils/di.ts +1 -0
  403. package/legacy/client/utils/fetcher.ts +1 -0
  404. package/legacy/client/utils/file.ts +1 -0
  405. package/legacy/client/utils/index.ts +7 -0
  406. package/legacy/client/utils/logger.ts +1 -0
  407. package/legacy/client/utils/toast.ts +1 -0
  408. package/legacy/server/entities/file.entity.ts +4 -0
  409. package/legacy/server/exceptions/base.ts +4 -0
  410. package/legacy/server/facades/arte.facade.ts +6 -0
  411. package/legacy/server/facades/config.facade.ts +4 -0
  412. package/legacy/server/facades/db.facade.ts +4 -0
  413. package/legacy/server/facades/download.facade.ts +4 -0
  414. package/legacy/server/facades/drive.facade.ts +4 -0
  415. package/legacy/server/facades/logger.facade.ts +4 -0
  416. package/legacy/server/facades/router.facade.ts +4 -0
  417. package/legacy/server/middlewares/auth.middleware.ts +6 -0
  418. package/legacy/server/middlewares/authorization.middleware.ts +8 -0
  419. package/legacy/server/mixins/hooks.mixin.ts +6 -0
  420. package/legacy/server/mixins/model.mixin.ts +6 -0
  421. package/legacy/server/mixins/modelConfig.mixin.ts +4 -0
  422. package/legacy/server/queries/index.ts +6 -0
  423. package/legacy/server/services/metadataQuery.service.ts +6 -0
  424. package/legacy/server/services/routerResourceConfig.service.ts +5 -0
  425. package/legacy/shared/services/validator.service.ts +4 -0
  426. package/legacy/shared/utils/compose.ts +8 -0
  427. package/legacy/shared/utils/tryCatch.ts +7 -0
  428. package/package.json +57 -13
  429. package/tsconfig.client.json +3 -3
  430. package/tsconfig.server.json +1 -1
  431. package/tsdown/createTsdownConfig.js +29 -0
  432. package/tsdown.config.ts +55 -2
  433. package/vite/createViteConfig.js +55 -0
  434. package/vite/plugins/zenith.js +143 -0
  435. package/vite.config.ts +72 -0
  436. package/dist/shared/chunk-CfYAbeIz.mjs +0 -13
@@ -0,0 +1,2 @@
1
+ import{toast as e}from"vue-sonner";import t from"qs";import{get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import{defineAbility as s,subject as c}from"@casl/ability";import{createMemoryHistory as l,createRouter as u,createWebHistory as d}from"vue-router";async function f(e){try{return[null,await e()]}catch(e){return[e,null]}}f.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var p=class{static __container_entry_key=`FetchService`;async handleError(t){if(!(t.headers.get(`Content-Type`)||``).includes(`application/json`)){e.error($t(`Internal Server Error`));return}if(t.headers.get(`Content-Type`)?.includes(`json`)){let n=await t.json().catch(()=>({message:$t(`Internal Server Error`)}));n.message&&e.error(n.message)}}buildUrl(e,n){if(!n)return e;let r=t.stringify(n,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return f(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},m=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},h=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new m(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const g=globalThis.clientContainer||new h;globalThis.clientContainer=g;const _=g.proxy(p);function v(...e){return e.reduce((e,t)=>t(e),class{})}function y(e,...t){return t.reduce((e,t)=>t(e),e)}function b(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function x(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function S(e){return class extends e{created_at;updated_at}}function C(e){return class extends e{deleted_at=null}}v(x,S,C);var w=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await _.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},T=class extends p{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}},ee=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};function E(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){E(i,e,n);continue}n[e]=i}return n}function te(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function ne(e=``){return e+te()}var re=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return E(this.toRecord())}};const D=g.proxy(re);import.meta.env.DEV&&(globalThis.config=D);function O(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function k(e){let n={},r=e.split(`?`)[1];return r?t.parse(r):n}var A=class extends p{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=g.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new ee({prefix:D.get(`cookie.prefix`,``)});if(g.has(`cookies`)&&a.load(g.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:O(i.path,e),query:t.query||k(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},j=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},M=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},N=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new M,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await f(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},P=class extends N{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},F=class extends v(x){id;label;layout;to;target;group;order;icon;parent},I=class extends v(x){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=f.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},L=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>I.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new M().child({label:`acl`}),this.ability=s(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=c(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=c(t,n);return this.ability.cannot(e,r)}subject(e,t){return c(e,t)}};const R=g.proxy(L);var z=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,F.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>R.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const B=e=>{let t=D.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function V(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function H(){let e=import.meta.env.SSR,t=u({history:e?l():d(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(B),t.auto=(e,n={})=>{let r=V(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var U=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const W=g.proxy(w);import.meta.env.DEV&&!import.meta.env.SSR&&(window.auth=W);const G=g.proxy(M),K=g.proxy(z),q=g.proxy(`route`),J=g.proxy(`router`),Y=g.proxy(U);var X=class extends v(x,b(j)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},ie=class extends y(X){},ae=class extends v(x){id;name;version;enabled;aliases},oe=class extends y(ae){addPagesFolder(e,t){J.auto(e,t)}async load(){}};function se(e,t={}){return V(e,t)}const Z=_;function ce(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function le(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function ue(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),Z(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const de={pick:ce,upload:ue,toUint8Array:le},fe=e;function Q(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!W.user&&!t.includes(n.path))return e.redirect}}const pe=Q({redirect:`/auth/login`});function $(e){return()=>{if(W.user)return e.redirect}}const me=$({redirect:`/`});export{Z as $fetch,de as $file,fe as $toast,w as AuthService,T as FetchBrowserService,A as FetchNodeService,p as FetchService,P as LifecycleService,F as MenuItemEntity,z as MenuService,ie as ModuleEntity,oe as PluginEntity,U as ToastService,R as acl,W as auth,pe as authGuard,V as auto,se as autoRoutes,D as config,g as container,Q as createAuthGuard,$ as createGuestGuard,ne as createId,H as createRouter,_ as fetcher,me as guestGuard,G as logger,K as menu,q as route,J as router,B as setupGuard,Y as toast};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiY3JlYXRlVnVlUm91dGVyIiwiTW9kdWxlIiwiQmFzZSIsIlBsdWdpbkVudGl0eSIsIkJhc2UiLCIkb3JpZ2luYWwiLCJ0b2FzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jb21wb3NlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0F1dGhTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaEJyb3dzZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2ZsYXR0ZW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2NvbmZpZy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvcGFyc2VSb3V0ZVVybC50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvRmV0Y2hOb2RlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTWVudUl0ZW1FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9hY2wudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL01lbnVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvc2V0dXBHdWFyZC50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvVG9hc3RTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2F1dGgudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbG9nZ2VyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL21lbnUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvcm91dGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvcm91dGVyLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3RvYXN0LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2F1dG9QYWdlcy50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvZmlsZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvdXRpbHMvdG9hc3QudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9hdXRoR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2d1YXJkcy9ndWVzdEd1YXJkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImltcG9ydCB7IHRvYXN0IH0gZnJvbSAndnVlLXNvbm5lcidcbmltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0SW5pdCB7XG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdGZXRjaFNlcnZpY2UnXG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKSB7ICAgIFxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSB8fCAnJ1xuXG4gICAgICAgIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICAgICAgdG9hc3QuZXJyb3IoJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSB9KSlcblxuICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRvYXN0LmVycm9yKGRhdGEubWVzc2FnZSlcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYnVpbGRVcmwodXJsOiBzdHJpbmcsIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXMuc3RyaW5naWZ5KHF1ZXJ5LCB7IGFycmF5Rm9ybWF0OiAnYnJhY2tldHMnIH0pXG5cbiAgICAgICAgcmV0dXJuIHVybCArICc/JyArIHF1ZXJ5U3RyaW5nXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkUmVxdWVzdEluaXQob3B0aW9uczogRmV0Y2hPcHRpb25zKTogUmVxdWVzdEluaXQge1xuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnM6IFJlcXVlc3RJbml0ID0geyAuLi5vcHRpb25zIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5kYXRhKSB7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSlcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgIC4uLmZldGNoT3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmV0Y2hPcHRpb25zXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LmluY2x1ZGVzKCdqc29uJykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxUPlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKSBhcyBQcm9taXNlPFQ+XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KF91cmw6IHN0cmluZywgX29wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCcpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRyeTxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyeUNhdGNoKCgpID0+IHRoaXMuZmV0Y2g8VD4odXJsLCBvcHRpb25zKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwb3N0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcHV0PFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGU8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoPFQ+KHVybCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzQ29kZTogbnVtYmVyID0gNTAwXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXNDb2RlOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21FcnJvcihlcnJvcjogRXJyb3IpOiBCYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIDUwMClcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbnRhaW5lclNlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50c1wiO1xuXG5jb25zdCBjb250YWluZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNsaWVudENvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG5cbmdsb2JhbFRoaXMuY2xpZW50Q29udGFpbmVyID0gY29udGFpbmVyXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lciBhcyBDb250YWluZXJTZXJ2aWNlXG4iLCJpbXBvcnQgRmV0Y2hTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgZmV0Y2hlciA9IGNvbnRhaW5lci5wcm94eTxGZXRjaFNlcnZpY2U+KEZldGNoU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZmV0Y2hlclxuIiwiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iLCJpbXBvcnQgJGZldGNoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzJ1xuaW1wb3J0IFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgTG9nb3V0T3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0F1dGhTZXJ2aWNlJ1xuICAgIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBdXRoU2VydmljZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXIgfHwgbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dvdXQob3B0aW9ucz86IExvZ291dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0ICRmZXRjaC50cnkoJy9hdXRoL2xvZ291dCcsIHsgbWV0aG9kOiAnUE9TVCcgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBvcHRpb25zPy5yZWRpcmVjdCB8fCAnLydcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZldGNoT3B0aW9ucyB9IGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmV0Y2hCcm93c2VyU2VydmljZSBleHRlbmRzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBmdWxsVXJsID0gdGhpcy5idWlsZFVybCh1cmwsIG9wdGlvbnMucXVlcnkpXG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHRoaXMuYnVpbGRSZXF1ZXN0SW5pdChvcHRpb25zKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbFVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UpXG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0Nvb2tpZU1hcEVudGl0eSdcblxuICAgIHB1YmxpYyBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHByZWZpeDogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvb2tpZXMgPSBkYXRhPy5jb29raWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5wcmVmaXggPSBkYXRhPy5wcmVmaXggfHwgJydcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgTWFwPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBpZiAoY29va2llcyBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQoZnVsbE5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSB3YW50IHRvIGFsbG93IGFueSBvcHRpb25zIHRvIGJlIHBhc3NlZCBoZXJlLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGNvb2tpZVxuICAgIC8vICBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICB0aGlzLmNvb2tpZXMuc2V0KGZ1bGxOYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRLZXkgPSBrZXkuc2xpY2UodGhpcy5wcmVmaXgubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0W3VucHJlZml4ZWRLZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgaXNJbmRleCA9IC9eXFxkKyQvLnRlc3Qoa2V5KVxuICAgICAgICBjb25zdCBuZXdLZXkgPSBpc0luZGV4ID8gYCR7cHJlZml4fVske2tleX1dYCA6IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImZ1bmN0aW9uIHV1aWQoKXtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDBcbiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDhcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkKHByZWZpeCA9ICcnKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHV1aWQoKVxufSIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLnRvUmVjb3JkKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgY29uZmlnID0gY29udGFpbmVyLnByb3h5PENvbmZpZ1NlcnZpY2U+KENvbmZpZ1NlcnZpY2UpXG5cbmlmIChpbXBvcnQubWV0YS5lbnYuREVWKSB7XG4gICAgZ2xvYmFsVGhpcy5jb25maWcgPSBjb25maWdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXG4iLCJpbXBvcnQgcXMgZnJvbSAncXMnIFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxQYXJhbXMocm91dGVQYXRoOiBzdHJpbmcsIHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50cyA9IHJlcXVlc3RQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpXVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHJlcXVlc3RTZWdtZW50c1tpXVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgLy8gUmVtb3ZlIHRoZSAnOicgcHJlZml4XG4gICAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1lXSA9IHJlcXVlc3RTZWdtZW50XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgIC8vIENhcHR1cmUgYWxsIHJlbWFpbmluZyBzZWdtZW50cyBhcyBhIHNpbmdsZSBwYXRoXG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdTZWdtZW50cyA9IHJlcXVlc3RTZWdtZW50cy5zbGljZShpKVxuICAgICAgICAgICAgcGFyYW1zWycqJ10gPSByZW1haW5pbmdTZWdtZW50cy5qb2luKCcvJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFF1ZXJ5KHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSByZXF1ZXN0UGF0aC5zcGxpdCgnPycpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBxdWVyeVxuICAgIH1cblxuICAgIHJldHVybiBxcy5wYXJzZShxdWVyeVN0cmluZylcbn1cbiIsImltcG9ydCB0eXBlIHsgRmV0Y2hPcHRpb25zIH0gZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG5pbXBvcnQgRmV0Y2hTZXJ2aWNlIGZyb20gJy4vRmV0Y2hTZXJ2aWNlLnRzJ1xuLy8gaW1wb3J0IHR5cGUgUm91dGVyU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgQ29ra2llTWFwRW50aXR5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHsgcGFyc2VVcmxQYXJhbXMsIHBhcnNlVXJsUXVlcnkgfSBmcm9tICcjc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoTm9kZVNlcnZpY2UgZXh0ZW5kcyBGZXRjaFNlcnZpY2Uge1xuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgaXNJbnRlcm5hbCA9ICF1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmICF1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKVxuXG4gICAgICAgIGlmICghaXNJbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hFeHRlcm5hbDxUPih1cmwsIG9wdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEludGVybmFsPFQ+KHVybCwgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZmV0Y2hFeHRlcm5hbDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgZnVsbFVybCA9IHRoaXMuYnVpbGRVcmwodXJsLCBvcHRpb25zLnF1ZXJ5KVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB0aGlzLmJ1aWxkUmVxdWVzdEluaXQob3B0aW9ucylcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZ1bGxVcmwsIGZldGNoT3B0aW9ucylcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaEludGVybmFsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByb3V0ZXIgPSAgY29udGFpbmVyLmdldDxhbnk+KCdSb3V0ZXJTZXJ2aWNlJylcbiAgICAgICAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgJ0dFVCdcbiAgICAgICAgY29uc3Qgcm91dGUgPSByb3V0ZXIucmVzb2x2ZShtZXRob2QsIHVybClcbiAgICAgICAgY29uc3QgY29va2llID0gbmV3IENva2tpZU1hcEVudGl0eSh7XG4gICAgICAgICAgICBwcmVmaXg6IGNvbmZpZy5nZXQoJ2Nvb2tpZS5wcmVmaXgnLCAnJylcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmIChjb250YWluZXIuaGFzKCdjb29raWVzJykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5sb2FkKGNvbnRhaW5lci5nZXQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oJ2Nvb2tpZXMnKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcm91dGUgfHwgIXJvdXRlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgbm90IGZvdW5kIGZvciAke21ldGhvZH0gJHt1cmx9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJvdXRlci5leGVjdXRlKHJvdXRlLCB7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyc2VVcmxQYXJhbXMocm91dGUucGF0aCwgdXJsKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5IHx8IHBhcnNlVXJsUXVlcnkodXJsKSxcbiAgICAgICAgICAgIGJvZHk6IG9wdGlvbnMuZGF0YSB8fCBvcHRpb25zLmJvZHksXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgY29va2llOiBjb29raWVcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0IGFzIFByb21pc2U8VD5cbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVIb29rIHtcbiAgICBwdWJsaWMgaG9va19pZDogc3RyaW5nXG4gICAgcHVibGljIGhvb2tfYWxpYXNlcz86IHN0cmluZ1tdXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIHN1Ymhvb2tzPzogTGlmZWN5Y2xlSG9va1tdXG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyICovXG4gICAgcHVibGljIGFzeW5jIG9uUmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGxvYWQgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Mb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBib290ICovXG4gICAgcHVibGljIGFzeW5jIG9uQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Ugc2h1dGRvd24gKi9cbiAgICBwdWJsaWMgYXN5bmMgb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuLy8gQHRzLW5vY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTG9nZ2VyU2VydmljZScgXG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJztcbmltcG9ydCBCYXNlTGlmZWN5Y2xlU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZUxpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBhZGRJbXBvcnRzKGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4pe1xuICAgICAgICBjb25zdCBob29rczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBtb2RdIG9mIE9iamVjdC5lbnRyaWVzKGltcG9ydHMpKSB7XG4gICAgICAgICAgICBjb25zdCBIb29rQ2xhc3MgPSBtb2QuZGVmYXVsdCB8fCBtb2RcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEhvb2tDbGFzcygpIGFzIExpZmVjeWNsZUhvb2tcblxuICAgICAgICAgICAgaW5zdGFuY2UuaG9va19pZCA9IGluc3RhbmNlLmhvb2tfaWQgfHwgbmFtZVxuXG4gICAgICAgICAgICBob29rcy5wdXNoKGluc3RhbmNlKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MuZm9yRWFjaChob29rID0+IHRoaXMuYWRkKGhvb2spKVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbnVJdGVtIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbGFiZWw6IHN0cmluZ1xuICAgIHB1YmxpYyBsYXlvdXQ6IHN0cmluZ1xuXG4gICAgcHVibGljIHRvPzogc3RyaW5nXG5cbiAgICBwdWJsaWMgdGFyZ2V0PzogJ19ibGFuaycgfCAnX3NlbGYnIHwgJ19wYXJlbnQnIHwgJ190b3AnXG4gICAgcHVibGljIGdyb3VwPzogc3RyaW5nXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIGljb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgcGFyZW50Pzogc3RyaW5nXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBvcmlnaW46IHN0cmluZ1xuICAgIHB1YmxpYyBzdWJqZWN0OiBzdHJpbmdcbiAgICBwdWJsaWMgYWN0aW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgY29uZGl0aW9uczogc3RyaW5nIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIGFueT4gPSBudWxsXG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gPT09ICdjdXN0b20nXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJzZWRDb25kaXRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gdHJ5Q2F0Y2guc3luYygoKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZGl0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmNvbmRpdGlvbnMgYXMgc3RyaW5nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gZXJyb3IgPyB7fSA6IGpzb25cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVBYmlsaXR5LCBzdWJqZWN0IGFzIGNyZWF0ZVN1YmplY3QgfSBmcm9tICdAY2FzbC9hYmlsaXR5J1xuaW1wb3J0IFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2xFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0FjbEVudGl0eSdcblxuICAgIHB1YmxpYyBhYmlsaXR5OiBSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVBYmlsaXR5PlxuICAgIHB1YmxpYyBwZXJtaXNzaW9uczogUGVybWlzc2lvbltdXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPEFjbEVudGl0eT4gPSB7fSkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGRhdGEucGVybWlzc2lvbnMgfHwgW11cbiAgICAgICAgY29uc3QgcGVybXMgPSBwZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb24pID0+IFBlcm1pc3Npb24uZnJvbShwZXJtaXNzaW9uKSlcblxuICAgICAgICBcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1zXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKS5jaGlsZCh7IGxhYmVsOiAnYWNsJyB9KVxuICAgICAgICBcbiAgICAgICAgdGhpcy5hYmlsaXR5ID0gZGVmaW5lQWJpbGl0eSgoY2FuKSA9PiB7XG4gICAgICAgICAgICBwZXJtcy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FuKHBlcm1pc3Npb24uYWN0aW9uLCBwZXJtaXNzaW9uLnN1YmplY3QsIHBlcm1pc3Npb24ucGFyc2VkQ29uZGl0aW9ucylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJywge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW4oYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuXG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIGNhbm5vdChhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIHN1YmplY3Qoc3ViamVjdDogc3RyaW5nLCBvYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuICAgIH1cbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBBY2xFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMnXG5cbmNvbnN0IGFjbCA9IGNvbnRhaW5lci5wcm94eTxBY2xFbnRpdHk+KEFjbEVudGl0eSlcblxuZXhwb3J0IGRlZmF1bHQgYWNsXG4iLCJpbXBvcnQgTWVudUl0ZW0gZnJvbSAnI2NsaWVudC9lbnRpdGllcy9NZW51SXRlbUVudGl0eS50cydcbmltcG9ydCBhY2wgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2FjbC50cydcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RmlsdGVyIHtcbiAgICBsYXlvdXQ/OiBzdHJpbmdcbiAgICBncm91cD86IHN0cmluZ1xuICAgIHBhcmVudD86IHN0cmluZ1xuICAgIGFsbG93ZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbnVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdNZW51U2VydmljZSdcblxuICAgIHB1YmxpYyBpdGVtczogTWFwPHN0cmluZywgTWVudUl0ZW0+ID0gbmV3IE1hcCgpXG5cbiAgICBwdWJsaWMgYWRkKC4uLml0ZW06IE9taXQ8UGFydGlhbDxNZW51SXRlbT4sICdtZXJnZScgfCAnZnJvbSc+W10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW0pIHtcblxuICAgICAgICAgICAgaWYgKCFpLmlkKSB7XG4gICAgICAgICAgICAgICAgaS5pZCA9IEpTT04uc3RyaW5naWZ5KGkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KGkuaWQsIE1lbnVJdGVtLmZyb20oaSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKGlkOiBNZW51SXRlbVsnaWQnXSkge1xuICAgICAgICB0aGlzLml0ZW1zLmRlbGV0ZShpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChmaWx0ZXI6IExpc3RGaWx0ZXIgPSB7fSkge1xuICAgICAgICBsZXQgaXRlbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5pdGVtcy52YWx1ZXMoKSkpKSBhcyBNZW51SXRlbVtdXG5cblxuICAgICAgICBpZiAoZmlsdGVyLmxheW91dCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmxheW91dCA9PT0gZmlsdGVyLmxheW91dClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuZ3JvdXApIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gaS5ncm91cCA9PT0gZmlsdGVyLmdyb3VwIHx8IGkucGFyZW50ID09PSBmaWx0ZXIuZ3JvdXApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVyLnBhcmVudCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLnBhcmVudCA9PT0gZmlsdGVyLnBhcmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuYWxsb3dlZCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlci5hbGxvd2VkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGFjbC5jYW4oJ3ZpZXcnLCBpKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQSA9IGEub3JkZXIgPyBhLm9yZGVyIDogOThcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQiA9IGIub3JkZXIgPyBiLm9yZGVyIDogOThcblxuICAgICAgICAgICAgcmV0dXJuIG9yZGVyQSAtIG9yZGVyQlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5jb25zdCBzZXR1cEd1YXJkOiBOYXZpZ2F0aW9uR3VhcmQgPSAodG8pID0+IHtcbiAgICBjb25zdCBzZXR1cCA9IGNvbmZpZy5nZXQ8YW55Pignc2V0dXAnKVxuICAgIFxuICAgIGNvbnN0IGNvbXBsZXRlZCA9ICFzZXR1cD8ubmVlZF9kYXRhYmFzZSAmJiAhc2V0dXA/Lm5lZWRfdXNlcnNcbiAgICBcbiAgICBpZiAoY29tcGxldGVkICYmIHRvLnBhdGguc3RhcnRzV2l0aCgnL3NldHVwJykpIHtcbiAgICAgICAgcmV0dXJuICcvJ1xuICAgIH1cbiAgICBcbiAgICBpZiAoY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIFxuICAgIGlmICghdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy9zZXR1cCdcbiAgICB9XG4gICAgXG4gICAgaWYgKHRvLnBhdGggPT09ICcvc2V0dXAnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfSAgICBcblxuICAgIGlmIChzZXR1cD8ubmVlZF9kYXRhYmFzZSkge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC9kYXRhYmFzZScgPyAnL3NldHVwL2RhdGFiYXNlJyA6IHRydWVcbiAgICB9XG5cbiAgICBpZiAoc2V0dXA/Lm5lZWRfdXNlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRvLnBhdGggIT09ICcvc2V0dXAvdXNlcicgPyAnL3NldHVwL3VzZXInIDogdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwR3VhcmRcbiIsImltcG9ydCB7XG4gICAgY3JlYXRlUm91dGVyIGFzIGNyZWF0ZVZ1ZVJvdXRlcixcbiAgICBjcmVhdGVNZW1vcnlIaXN0b3J5LFxuICAgIGNyZWF0ZVdlYkhpc3Rvcnlcbn0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkd1YXJkLCBSb3V0ZXIgYXMgVnVlUm91dGVyIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgUm91dGVSZWNvcmRSYXcgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgc2V0dXBHdWFyZCBmcm9tICcjY2xpZW50L2d1YXJkcy9zZXR1cEd1YXJkLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlciBleHRlbmRzIFZ1ZVJvdXRlciB7XG4gICAgYXV0bzogdHlwZW9mIGF1dG87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b09wdGlvbnMge1xuICAgIGd1YXJkcz86IE5hdmlnYXRpb25HdWFyZFtdIHwgKChyZWNvcmQ6IFJvdXRlUmVjb3JkUmF3KSA9PiBOYXZpZ2F0aW9uR3VhcmRbXSk7XG4gICAgc3RyaXA/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIGV4Y2x1ZGU/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICByZWZpbmU/OiAocmVjb3JkczogUm91dGVSZWNvcmRSYXdbXSkgPT4gUm91dGVSZWNvcmRSYXdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8oaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgbGV0IHJvdXRlczogUm91dGVSZWNvcmRSYXdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhpbXBvcnRzKSkge1xuXG4gICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGU/LnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgdHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBmaWxlbmFtZS5pbmNsdWRlcyhydWxlKVxuICAgICAgICAgICAgICAgIDogcnVsZS50ZXN0KGZpbGVuYW1lKVxuICAgICAgICApKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnRzID0gZmlsZW5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC52dWUkLywgJycpXG4gICAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgICAgLmZpbHRlcihwID0+IHAgJiYgIXAuc3RhcnRzV2l0aCgnLicpKVxuICAgICAgICAgICAgLm1hcChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IHBhcnRcblxuICAgICAgICAgICAgICAgIGlmIChwLnN0YXJ0c1dpdGgoJ1snKSAmJiBwLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcCA9ICc6JyArIHAuc2xpY2UoMSwgLTEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAvLyBTdHJpcCBzcGVjaWZpYyBzZWdtZW50c1xuICAgICAgICBpZiAob3B0aW9ucy5zdHJpcD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmZpbHRlcihwID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuc3RyaXAhLnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcCA9PT0gcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBydWxlLnRlc3QocClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKS5yZXBsYWNlKC9pbmRleCQvLCAnJylcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHBhdGggPSBvcHRpb25zLnByZWZpeCArICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBEZWZpbmVDb21wb25lbnQsXG4gICAgICAgICAgICBiZWZvcmVFbnRlcjogW10gYXMgTmF2aWdhdGlvbkd1YXJkW10sXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuZ3VhcmRzKSkge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiB0eXBlb2Ygb3B0aW9ucy5ndWFyZHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWZvcmVFbnRlciA9IG9wdGlvbnMuZ3VhcmRzKHJlY29yZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlcy5wdXNoKHJlY29yZClcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZWZpbmUpIHtcbiAgICAgICAgcm91dGVzID0gb3B0aW9ucy5yZWZpbmUocm91dGVzKVxuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcigpIHtcbiAgICBjb25zdCBzc3IgPSBpbXBvcnQubWV0YS5lbnYuU1NSXG5cbiAgICBjb25zdCByb3V0ZXIgPSBjcmVhdGVWdWVSb3V0ZXIoe1xuICAgICAgICBoaXN0b3J5OiBzc3IgPyBjcmVhdGVNZW1vcnlIaXN0b3J5KCkgOiBjcmVhdGVXZWJIaXN0b3J5KCksXG4gICAgICAgIHJvdXRlczogW10sXG4gICAgICAgIHNjcm9sbEJlaGF2aW9yKHRvLCBmcm9tLCBzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc2F2ZWRQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZFBvc2l0aW9uXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogMCB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkgYXMgYW55IGFzIFJvdXRlclxuXG4gICAgcm91dGVyLmJlZm9yZUVhY2goc2V0dXBHdWFyZClcblxuICAgIHJvdXRlci5hdXRvID0gKGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIERlZmluZUNvbXBvbmVudCB8ICgoKSA9PiBQcm9taXNlPERlZmluZUNvbXBvbmVudD4pPiwgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRvUm91dGVzID0gYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgICAgICBcbiAgICAgICAgYXV0b1JvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHJvdXRlci5hZGRSb3V0ZShyb3V0ZSkpXG5cbiAgICAgICAgcmV0dXJuIGF1dG9Sb3V0ZXNcbiAgICB9XG5cbiAgICByZXR1cm4gcm91dGVyXG59XG5cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0U2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVG9hc3RTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCBtZXNzYWdlLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxufVxuIiwiaW1wb3J0IEF1dGhTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvQXV0aFNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBhdXRoID0gY29udGFpbmVyLnByb3h5PEF1dGhTZXJ2aWNlPihBdXRoU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYgJiYgIWltcG9ydC5tZXRhLmVudi5TU1IpIHtcbiAgICAod2luZG93IGFzIGFueSkuYXV0aCA9IGF1dGhcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXV0aFxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgbG9nZ2VyID0gY29udGFpbmVyLnByb3h5PExvZ2dlclNlcnZpY2U+KExvZ2dlclNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlclxuIiwiaW1wb3J0IE1lbnVTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvTWVudVNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBtZW51ID0gY29udGFpbmVyLnByb3h5PE1lbnVTZXJ2aWNlPihNZW51U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbWVudVxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUxvY2F0aW9uTm9ybWFsaXplZEdlbmVyaWMgfSBmcm9tICd2dWUtcm91dGVyJ1xuXG5jb25zdCByb3V0ZSA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZUxvY2F0aW9uTm9ybWFsaXplZEdlbmVyaWM+KCdyb3V0ZScpXG5cbmV4cG9ydCBkZWZhdWx0IHJvdXRlXG5cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCB0eXBlIHsgUm91dGVyIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuXG5jb25zdCByb3V0ZXIgPSBjb250YWluZXIucHJveHk8Um91dGVyPigncm91dGVyJylcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVyXG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgVG9hc3RTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvVG9hc3RTZXJ2aWNlLnRzJ1xuXG5jb25zdCB0b2FzdCA9IGNvbnRhaW5lci5wcm94eTxUb2FzdFNlcnZpY2U+KFRvYXN0U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgdG9hc3RcbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlKSB7XG4gICBcbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhbGlhc2VzOiBzdHJpbmdbXVxufVxuIiwiaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMnXG5pbXBvcnQgcm91dGVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZXIudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB0eXBlIHsgQXV0b09wdGlvbnMgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2UpIHtcbiAgICBwdWJsaWMgYWRkUGFnZXNGb2xkZXIoaW1wb3J0czogYW55LCBvcHRpb25zPzogQXV0b09wdGlvbnMpIHtcbiAgICAgICAgcm91dGVyLmF1dG8oaW1wb3J0cywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbG9hZCBhZGRpdGlvbmFsIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGlyZWN0b3J5IGlmIG5lZWRlZFxuICAgIH1cbn1cbiIsImltcG9ydCB7IGF1dG8gfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IEF1dG9PcHRpb25zIH0gZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJvdXRlUmVjb3JkUmF3IH0gZnJvbSAndnVlLXJvdXRlcidcblxuLyoqIEBkZXByZWNhdGVkIFVzZSBhdXRvIGZyb20gUm91dGVyU2VydmljZSBpbnN0ZWFkICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b1JvdXRlcyhcbiAgICBpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVDb21wb25lbnQgfCAoKCkgPT4gUHJvbWlzZTxEZWZpbmVDb21wb25lbnQ+KT4sXG4gICAgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fVxuKTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgcmV0dXJuIGF1dG8oaW1wb3J0cywgb3B0aW9ucylcbn1cbiIsImltcG9ydCAkb3JpZ2luYWwgZnJvbSBcIiNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzXCI7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hlciBmYWNhZGUgKi9cbmV4cG9ydCBjb25zdCAkZmV0Y2ggPSAkb3JpZ2luYWw7XG4iLCJpbXBvcnQgeyAkZmV0Y2ggfSBmcm9tICcuL2ZldGNoZXInXG5cbmludGVyZmFjZSBQaWNrT3B0aW9ucyB7XG4gICAgYWNjZXB0Pzogc3RyaW5nXG4gICAgbXVsdGlwbGU/OiBib29sZWFuXG59XG5cbnR5cGUgUGlja1Jlc3VsdDxUIGV4dGVuZHMgUGlja09wdGlvbnM+ID0gVFsnbXVsdGlwbGUnXSBleHRlbmRzIHRydWUgPyBGaWxlW10gOiBGaWxlIHwgbnVsbFxuXG5mdW5jdGlvbiBwaWNrPFQgZXh0ZW5kcyBQaWNrT3B0aW9ucz4ob3B0aW9uczogVCk6IFByb21pc2U8UGlja1Jlc3VsdDxUPj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcblxuICAgICAgICBpbnB1dC50eXBlID0gJ2ZpbGUnXG4gICAgICAgIGlucHV0LmFjY2VwdCA9IG9wdGlvbnMuYWNjZXB0IHx8ICcqLyonXG4gICAgICAgIGlucHV0Lm11bHRpcGxlID0gb3B0aW9ucy5tdWx0aXBsZSB8fCBmYWxzZVxuXG4gICAgICAgIGlucHV0Lm9uY2hhbmdlID0gKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbSh0YXJnZXQuZmlsZXMgYXMgRmlsZUxpc3QpIGFzIEZpbGVbXVxuXG4gICAgICAgICAgICByZXNvbHZlKChvcHRpb25zLm11bHRpcGxlID8gQXJyYXkuZnJvbShmaWxlcykgOiBmaWxlc1swXSkgYXMgUGlja1Jlc3VsdDxUPilcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0Lm9uY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShvcHRpb25zLm11bHRpcGxlID8gW10gOiAobnVsbCBhcyBhbnkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQuY2xpY2soKVxuICAgIH0pXG59XG5cbmZ1bmN0aW9uIHRvVWludDhBcnJheShmaWxlOiBGaWxlKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUudGFyZ2V0Py5yZXN1bHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoZS50YXJnZXQucmVzdWx0KSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgZmlsZSBhcyBBcnJheUJ1ZmZlcicpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpXG4gICAgfSlcbn1cblxuaW50ZXJmYWNlIFVwbG9hZE9wdGlvbnMge1xuICAgIGRyaXZlSWQ6IHN0cmluZ1xuICAgIGZpbGU6IEZpbGVcbiAgICBkaXJlY3Rvcnk/OiBzdHJpbmdcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkKG9wdGlvbnM6IFVwbG9hZE9wdGlvbnMpe1xuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgIFxuICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlKVxuXG4gICAgaWYgKG9wdGlvbnMuZGlyZWN0b3J5KSB7XG4gICAgICAgIGZvcm0uYXBwZW5kKCdkaXJlY3RvcnknLCBvcHRpb25zLmRpcmVjdG9yeSlcbiAgICB9XG5cbiAgICByZXR1cm4gJGZldGNoKGAvYXBpL2RyaXZlcy8ke29wdGlvbnMuZHJpdmVJZH0vdXBsb2FkYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZm9ybSxcbiAgICAgICAgcXVlcnk6IHsgZGlyZWN0b3J5OiBvcHRpb25zLmRpcmVjdG9yeSwgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCAkZmlsZSA9IHtcbiAgICBwaWNrLFxuICAgIHVwbG9hZCxcbiAgICB0b1VpbnQ4QXJyYXksXG59IiwiaW1wb3J0IHsgdG9hc3QgfSBmcm9tICd2dWUtc29ubmVyJ1xuXG5leHBvcnQgY29uc3QgJHRvYXN0ID0gdG9hc3RcbiIsImltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkd1YXJkIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCBhdXRoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9hdXRoLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHdWFyZE9wdGlvbnMge1xuICAgIHJlZGlyZWN0OiBzdHJpbmdcbiAgICBleGNsdWRlPzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1dGhHdWFyZChvcHRpb25zOiBBdXRoR3VhcmRPcHRpb25zKTogTmF2aWdhdGlvbkd1YXJkIHtcbiAgICBjb25zdCBleGNsdWRlID0gb3B0aW9ucy5leGNsdWRlIHx8IFsnL2F1dGgvbG9naW4nLCAnL2F1dGgvcmVnaXN0ZXInXVxuICAgIFxuICAgIHJldHVybiAodG8pID0+IHtcbiAgICAgICAgaWYgKCFhdXRoLnVzZXIgJiYgIWV4Y2x1ZGUuaW5jbHVkZXModG8ucGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlZGlyZWN0XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGF1dGhHdWFyZCA9IGNyZWF0ZUF1dGhHdWFyZCh7IFxuICAgIHJlZGlyZWN0OiAnL2F1dGgvbG9naW4nLFxufSlcblxuZXhwb3J0IGRlZmF1bHQgYXV0aEd1YXJkXG4iLCJpbXBvcnQgYXV0aCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYXV0aC50cydcblxuZXhwb3J0IGludGVyZmFjZSBHdWVzdEd1YXJkT3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3Vlc3RHdWFyZChvcHRpb25zOiBHdWVzdEd1YXJkT3B0aW9ucykge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChhdXRoLnVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlZGlyZWN0XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGd1ZXN0R3VhcmQgPSBjcmVhdGVHdWVzdEd1YXJkKHtcbiAgICByZWRpcmVjdDogJy8nXG59KVxuXG5leHBvcnQgZGVmYXVsdCBndWVzdEd1YXJkXG4iXSwibWFwcGluZ3MiOiJtUkFZQSxlQUFzQixFQUErQixFQUEyQyxDQUM1RixHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sTUFBTSxHQUFPLENBQ1AsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssRUFJbkMsRUFBUyxLQUFPLFNBQTJCLEVBQTZCLENBQ3BFLEdBQUksQ0FFQSxNQUFPLENBQUMsS0FETyxHQUFPLENBQ0QsT0FDaEIsRUFBTyxDQUNaLE1BQU8sQ0FBQyxFQUFjLEtBQUssR0NqQm5DLElBQXFCLEVBQXJCLEtBQWtDLENBQzlCLE9BQWMsc0JBQXdCLGVBRXRDLE1BQWdCLFlBQVksRUFBb0IsQ0FHNUMsR0FBSSxFQUZnQixFQUFTLFFBQVEsSUFBSSxlQUFlLEVBQUksSUFFM0MsU0FBUyxtQkFBbUIsQ0FBRSxDQUMzQyxFQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxDQUN4QyxPQUdKLEdBQUksRUFBUyxRQUFRLElBQUksZUFBZSxFQUFFLFNBQVMsT0FBTyxDQUFFLENBQ3hELElBQU0sRUFBTyxNQUFNLEVBQVMsTUFBTSxDQUM3QixXQUFhLENBQUUsUUFBUyxHQUFHLHdCQUF3QixDQUFFLEVBQUUsQ0FFeEQsRUFBSyxTQUNMLEVBQU0sTUFBTSxFQUFLLFFBQVEsRUFLckMsU0FBbUIs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