@burgan-tech/morph-touch-runtime 0.0.7 → 0.0.9

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 (68) hide show
  1. package/burgan-tech-morph-touch-runtime-0.0.9.tgz +0 -0
  2. package/morph-touch/Functions/get-absence-entry.1.0.0.json +1 -1
  3. package/morph-touch/Functions/get-advisor-stats.1.0.0.json +1 -1
  4. package/morph-touch/Functions/get-available-slots.1.0.0.json +1 -1
  5. package/morph-touch/Functions/get-chat-rooms.http +4 -4
  6. package/morph-touch/Functions/get-rezervations.1.0.0.json +1 -1
  7. package/morph-touch/Functions/src/GetAbsenceEntryMapping.csx +18 -4
  8. package/morph-touch/Functions/src/GetAdvisorStatsMapping.csx +22 -8
  9. package/morph-touch/Functions/src/GetAvailableSlotsMapping.csx +22 -14
  10. package/morph-touch/Functions/src/GetRezervationsMapping.csx +19 -2
  11. package/morph-touch/Functions/src/SendCancelNotificationMapping.csx +27 -2
  12. package/morph-touch/Tasks/check-existing-permanent-chat-room.1.0.0.json +1 -1
  13. package/morph-touch/Tasks/login-for-chat.1.0.0.json +27 -0
  14. package/morph-touch/Tasks/register-for-chat.1.0.0.json +27 -0
  15. package/morph-touch/Tasks/start-register-matrix-user.1.0.0.json +22 -0
  16. package/morph-touch/Workflows/chat-room.json +196 -14
  17. package/morph-touch/Workflows/notification-sender.json +2 -2
  18. package/morph-touch/Workflows/register-matrix-user.json +128 -0
  19. package/morph-touch/Workflows/rezervation-start.json +28 -2
  20. package/morph-touch/Workflows/rezervation-transfer.json +34 -8
  21. package/morph-touch/Workflows/rezervation-update.json +5 -5
  22. package/morph-touch/Workflows/rezervation.json +135 -45
  23. package/morph-touch/Workflows/src/AlwaysTrueRule.csx +0 -3
  24. package/morph-touch/Workflows/src/CanStartRezervationTimerMapping.csx +18 -3
  25. package/morph-touch/Workflows/src/ChatRoomRemoveMapping.csx +10 -1
  26. package/morph-touch/Workflows/src/ChatRoomTransferInviteMapping.csx +10 -1
  27. package/morph-touch/Workflows/src/ChatRoomTransferRemoveMapping.csx +9 -1
  28. package/morph-touch/Workflows/src/ChatRoomUpdateMapping.csx +10 -1
  29. package/morph-touch/Workflows/src/CheckDuplicateRezervationMapping.csx +17 -3
  30. package/morph-touch/Workflows/src/CheckExistingPermanentChatRoomMapping.csx +4 -7
  31. package/morph-touch/Workflows/src/CheckRandevuTimeMapping.csx +16 -2
  32. package/morph-touch/Workflows/src/CreateChatRoomForRezervationMapping.csx +12 -2
  33. package/morph-touch/Workflows/src/CreatePermanentChatRoomMapping.csx +11 -1
  34. package/morph-touch/Workflows/src/EnrichRezervationsForTransferMapping.csx +18 -4
  35. package/morph-touch/Workflows/src/FetchRoomMessagesForSummaryMapping.csx +10 -2
  36. package/morph-touch/Workflows/src/InviteAdvisorForRandevuUpdateMapping.csx +10 -1
  37. package/morph-touch/Workflows/src/InviteNewAdvisorToRezervationRoomMapping.csx +11 -2
  38. package/morph-touch/Workflows/src/InviteNewParticipantToRandevuRoomMapping.csx +10 -1
  39. package/morph-touch/Workflows/src/JoinChatRoomForAddParticipantMapping.csx +5 -1
  40. package/morph-touch/Workflows/src/JoinChatRoomForRandevuStartMapping.csx +5 -1
  41. package/morph-touch/Workflows/src/JoinChatRoomForRezervationMapping.csx +4 -0
  42. package/morph-touch/Workflows/src/JoinMatrixRoomMapping.csx +11 -1
  43. package/morph-touch/Workflows/src/JoinUserToRoomMapping.csx +6 -0
  44. package/morph-touch/Workflows/src/LoginForAddParticipantChatMapping.csx +35 -6
  45. package/morph-touch/Workflows/src/LoginForChatRoomMapping.csx +121 -0
  46. package/morph-touch/Workflows/src/LoginForJoinUserToRoomMapping.csx +142 -0
  47. package/morph-touch/Workflows/src/LoginForRandevuStartChatMapping.csx +35 -10
  48. package/morph-touch/Workflows/src/LoginForTransferChatMapping.csx +153 -0
  49. package/morph-touch/Workflows/src/RegisterForAddParticipantChatMapping.csx +74 -0
  50. package/morph-touch/Workflows/src/RegisterForChatRoomMapping.csx +52 -0
  51. package/morph-touch/Workflows/src/RegisterForJoinUserToRoomMapping.csx +63 -0
  52. package/morph-touch/Workflows/src/RegisterForRandevuStartChatMapping.csx +56 -0
  53. package/morph-touch/Workflows/src/RegisterForTransferChatMapping.csx +90 -0
  54. package/morph-touch/Workflows/src/RegisterMatrixUserMapping.csx +73 -0
  55. package/morph-touch/Workflows/src/SendPushNotificationMapping.csx +25 -4
  56. package/morph-touch/Workflows/src/SendSmsNotificationMapping.csx +25 -4
  57. package/morph-touch/Workflows/src/SendSummaryToNewRoomMapping.csx +10 -2
  58. package/morph-touch/Workflows/src/SetRoomHistoryVisibilityMapping.csx +12 -4
  59. package/morph-touch/Workflows/src/ValidateDateForRezervationMapping.csx +16 -2
  60. package/morph-touch/Workflows/src/ValidateSlotForRandevuUpdateMapping.csx +22 -15
  61. package/morph-touch/Workflows/src/ValidateSlotForRezervationMapping.csx +23 -16
  62. package/morph-touch/Workflows/src/ValidateTransferMapping.csx +16 -2
  63. package/morph-touch/Workflows/start-chat.json +1 -1
  64. package/morph-touch/doc/morph-touch-domain.en.md +1 -1
  65. package/morph-touch/doc/morph-touch-domain.md +1 -1
  66. package/package.json +1 -1
  67. package/vnext.config.json +1 -1
  68. package/burgan-tech-morph-touch-runtime-0.0.7.tgz +0 -0
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "mapping": {
23
23
  "location": "./src/GetAbsenceEntryMapping.csx",
24
- "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QWJzZW5jZUVudHJ5VGFzayAoRGFwclNlcnZpY2VUYXNrIC0gVHlwZSAzKQovLy8gUXVlcmllcyBhYnNlbmNlLWVudHJ5IHdvcmtmbG93IGluc3RhbmNlcyBpbiBjb21wbGV0ZSBzdGF0ZSwgZmlsdGVyZWQgYnkgYWJzZW5jZVR5cGUuCi8vLwovLy8gUXVlcnkgcGFyYW1ldGVyczoKLy8vICAgLSBhYnNlbmNlVHlwZSAocmVxdWlyZWQpOiAicHVibGljLWhvbGlkYXkiIHwgInBlcnNvbmFsLWxlYXZlIiB8ICJ3b3JraW5nLWhvdXJzLWNoYW5nZSIgfCAicmV6ZXJ2YXRpb24iCi8vLyAgIC0gc3RhcnREYXRlIChvcHRpb25hbCwgcHVibGljLWhvbGlkYXkvcGVyc29uYWwtbGVhdmUvcmV6ZXJ2YXRpb24pOiBmaWx0ZXIgc3RhcnREYXRlVGltZSA+PSB2YWx1ZQovLy8gICAtIGVuZERhdGUgKG9wdGlvbmFsLCBwdWJsaWMtaG9saWRheS9wZXJzb25hbC1sZWF2ZS9yZXplcnZhdGlvbik6IGZpbHRlciBlbmREYXRlVGltZSA8PSB2YWx1ZQovLy8gICAtIGFkdmlzb3IgKG9wdGlvbmFsLCBwZXJzb25hbC1sZWF2ZS93b3JraW5nLWhvdXJzLWNoYW5nZS9yZXplcnZhdGlvbik6IGZpbHRlciBieSBhZHZpc29yCi8vLyAgIC0gcGFnZVNpemUgKG9wdGlvbmFsLCBkZWZhdWx0IDEwMCkKLy8vCi8vLyBOb3RlOiBEYXRlIGZpbHRlcmluZyAoc3RhcnREYXRlL2VuZERhdGUpIGlzIHBlcmZvcm1lZCBjbGllbnQtc2lkZSBpbiBPdXRwdXRIYW5kbGVyCi8vLyBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBndGUvbHRlIG9wZXJhdG9ycyBvbiBhdHRyaWJ1dGUgZmllbGRzLgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0QWJzZW5jZUVudHJ5TWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYXBwSWQgPSBHZXRDb25maWdWYWx1ZSgiREFQUl9BUFBfSUQiKTsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFwcElkKSkKICAgICAgICAgICAgc2VydmljZVRhc2suU2V0QXBwSWQoYXBwSWQpOwoKICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImFic2VuY2VUeXBlIik7CgogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhYnNlbmNlVHlwZSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidmFsaWRhdGlvbi1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiYWJzZW5jZVR5cGUgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJWQUxJREFUSU9OX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcyA9IG5ld1tdIHsgInB1YmxpYy1ob2xpZGF5IiwgInBlcnNvbmFsLWxlYXZlIiwgIndvcmtpbmctaG91cnMtY2hhbmdlIiwgInJlemVydmF0aW9uIiB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHZhbGlkVHlwZXMgPSBuZXdbXSB7ICJwdWJsaWMtaG9saWRheSIsICJwZXJzb25hbC1sZWF2ZSIsICJ3b3JraW5nLWhvdXJzLWNoYW5nZSIsICJyZXplcnZhdGlvbiIgfTsKICAgICAgICBib29sIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICBmb3JlYWNoICh2YXIgdnQgaW4gdmFsaWRUeXBlcykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2dCA9PSBhYnNlbmNlVHlwZSkgeyBpc1ZhbGlkID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CgogICAgICAgIGlmICghaXNWYWxpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ2YWxpZGF0aW9uLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnZhbGlkIGFic2VuY2VUeXBlIHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiVkFMSURBVElPTl9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgPSBhYnNlbmNlVHlwZSwKICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcyA9IHZhbGlkVHlwZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgYWR2aXNvciA9IFJlYWRQYXJhbShjb250ZXh0LCAiYWR2aXNvciIpOwoKICAgICAgICB2YXIgcGFnZVNpemVTdHIgPSBSZWFkUGFyYW0oY29udGV4dCwgInBhZ2VTaXplIik7CiAgICAgICAgaW50IHBhZ2VTaXplID0gMTAwOwogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkocGFnZVNpemVTdHIpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHBhcnNlZCA9IDA7CiAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UocGFnZVNpemVTdHIsIG91dCBwYXJzZWQpICYmIHBhcnNlZCA+IDApCiAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IHBhcnNlZDsKICAgICAgICB9CgogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwoKICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcImFic2VuY2VUeXBlXCI6e1wiZXFcIjpcIiIgKyBhYnNlbmNlVHlwZSArICJcIn19fSIpOwoKICAgICAgICBpZiAoYWJzZW5jZVR5cGUgPT0gIndvcmtpbmctaG91cnMtY2hhbmdlIikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcikpCiAgICAgICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wia2V5XCI6e1wiZXFcIjpcIndvcmtpbmctaG91ci0iICsgYWR2aXNvciArICJcIn19Iik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJrZXlcIjp7XCJlcVwiOlwid29ya2luZy1ob3VyXCJ9fSIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKChhYnNlbmNlVHlwZSA9PSAicGVyc29uYWwtbGVhdmUiIHx8IGFic2VuY2VUeXBlID09ICJyZXplcnZhdGlvbiIpICYmICFzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHZpc29yKSkKICAgICAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcImF0dHJpYnV0ZXNcIjp7XCJhZHZpc29yXCI6e1wiZXFcIjpcIiIgKyBhZHZpc29yICsgIlwifX19Iik7CgogICAgICAgIHZhciBmaWx0ZXJKc29uID0gIntcImFuZFwiOlsiICsgc3RyaW5nLkpvaW4oIiwiLCBjb25kaXRpb25zKSArICJdfSI7CgogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBMaXN0PHN0cmluZz4KICAgICAgICB7CiAgICAgICAgICAgICJwYWdlU2l6ZT0iICsgcGFnZVNpemUsCiAgICAgICAgICAgICJjdXJyZW50U3RhdGU9Y29tcGxldGUiLAogICAgICAgICAgICAiZmlsdGVyPSIgKyBmaWx0ZXJKc29uCiAgICAgICAgfTsKCiAgICAgICAgc2VydmljZVRhc2suU2V0UXVlcnlTdHJpbmcoc3RyaW5nLkpvaW4oIiYiLCBxdWVyeVBhcmFtcykpOwoKICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImFic2VuY2VUeXBlIik7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElkID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5hcHBJZD8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSByZXNwb25zZT8ubWV0YWRhdGE/Lm1ldGhvZE5hbWU/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwVmVyYiA9IHJlc3BvbnNlPy5tZXRhZGF0YT8uaHR0cFZlcmI/LlRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFic2VuY2UtZW50cnkiLCAiZXJyb3IiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNwb25zZURhdGEgPSByZXNwb25zZT8uZGF0YTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gcmVzcG9uc2VEYXRhPy5pdGVtczsKCiAgICAgICAgICAgIGJvb2wgc3VwcG9ydHNEYXRlRmlsdGVyID0gKGFic2VuY2VUeXBlID09ICJwdWJsaWMtaG9saWRheSIgfHwgYWJzZW5jZVR5cGUgPT0gInBlcnNvbmFsLWxlYXZlIiB8fCBhYnNlbmNlVHlwZSA9PSAicmV6ZXJ2YXRpb24iKTsKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVN0ciA9IFJlYWRQYXJhbShjb250ZXh0LCAic3RhcnREYXRlIik7CiAgICAgICAgICAgIHZhciBlbmREYXRlU3RyID0gUmVhZFBhcmFtKGNvbnRleHQsICJlbmREYXRlIik7CgogICAgICAgICAgICBpZiAoc3VwcG9ydHNEYXRlRmlsdGVyICYmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlU3RyKSB8fCAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZVN0cikpICYmIGl0ZW1zICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGVUaW1lIHN0YXJ0RGF0ZUZpbHRlciA9IGRlZmF1bHQ7CiAgICAgICAgICAgICAgICBEYXRlVGltZSBlbmREYXRlRmlsdGVyID0gZGVmYXVsdDsKICAgICAgICAgICAgICAgIGJvb2wgaGFzU3RhcnRGaWx0ZXIgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlU3RyKSAmJiBEYXRlVGltZS5UcnlQYXJzZShzdGFydERhdGVTdHIsIG91dCBzdGFydERhdGVGaWx0ZXIpOwogICAgICAgICAgICAgICAgYm9vbCBoYXNFbmRGaWx0ZXIgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZVN0cikgJiYgRGF0ZVRpbWUuVHJ5UGFyc2UoZW5kRGF0ZVN0ciwgb3V0IGVuZERhdGVGaWx0ZXIpOwoKICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZEl0ZW1zID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKGR5bmFtaWMgaXRlbSBpbiBpdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBpdGVtPy5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgIGlmIChhdHRycyA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZW1TdGFydFN0ciA9IGF0dHJzPy5zdGFydERhdGVUaW1lPy5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVtRW5kU3RyID0gYXR0cnM/LmVuZERhdGVUaW1lPy5Ub1N0cmluZygpOwoKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBpdGVtU3RhcnQgPSBkZWZhdWx0OwogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGl0ZW1FbmQgPSBkZWZhdWx0OwogICAgICAgICAgICAgICAgICAgIGJvb2wgcGFyc2VkU3RhcnQgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoaXRlbVN0YXJ0U3RyKSAmJiBEYXRlVGltZS5UcnlQYXJzZShpdGVtU3RhcnRTdHIsIG91dCBpdGVtU3RhcnQpOwogICAgICAgICAgICAgICAgICAgIGJvb2wgcGFyc2VkRW5kID0gIXN0cmluZy5Jc051bGxPckVtcHR5KGl0ZW1FbmRTdHIpICYmIERhdGVUaW1lLlRyeVBhcnNlKGl0ZW1FbmRTdHIsIG91dCBpdGVtRW5kKTsKCiAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1N0YXJ0RmlsdGVyICYmIHBhcnNlZFN0YXJ0ICYmIGl0ZW1TdGFydCA8IHN0YXJ0RGF0ZUZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRW5kRmlsdGVyICYmIHBhcnNlZEVuZCAmJiBpdGVtRW5kID4gZW5kRGF0ZUZpbHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZSkKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJdGVtcy5BZGQoaXRlbSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJhYnNlbmNlLWVudHJ5LXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFic2VuY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IGZpbHRlcmVkSXRlbXMKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXcgc3RyaW5nW10geyAiYWJzZW5jZS1lbnRyeSIsIGFic2VuY2VUeXBlID8/ICIiLCAic3VjY2VzcyIgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAiYWJzZW5jZS1lbnRyeS1zdWNjZXNzIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhYnNlbmNlVHlwZSwKICAgICAgICAgICAgICAgICAgICBpdGVtcwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXcgc3RyaW5nW10geyAiYWJzZW5jZS1lbnRyeSIsIGFic2VuY2VUeXBlID8/ICIiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAib3V0cHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYWJzZW5jZS1lbnRyeSIsICJlcnJvciIgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHN0cmluZyBSZWFkUGFyYW0oU2NyaXB0Q29udGV4dCBjb250ZXh0LCBzdHJpbmcgbmFtZSkKICAgIHsKICAgICAgICBpZiAoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgPT0gbnVsbCB8fCAhSGFzUHJvcGVydHkoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMsIG5hbWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgdmFsID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbbmFtZV07CiAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxsID8gdmFsLlRvU3RyaW5nKCkgOiBudWxsOwogICAgfQp9Cg=="
24
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QWJzZW5jZUVudHJ5VGFzayAoRGFwclNlcnZpY2VUYXNrIC0gVHlwZSAzKQovLy8gUXVlcmllcyBhYnNlbmNlLWVudHJ5IHdvcmtmbG93IGluc3RhbmNlcyBpbiBjb21wbGV0ZSBzdGF0ZSwgZmlsdGVyZWQgYnkgYWJzZW5jZVR5cGUuCi8vLwovLy8gUXVlcnkgcGFyYW1ldGVyczoKLy8vICAgLSBhYnNlbmNlVHlwZSAocmVxdWlyZWQpOiAicHVibGljLWhvbGlkYXkiIHwgInBlcnNvbmFsLWxlYXZlIiB8ICJ3b3JraW5nLWhvdXJzLWNoYW5nZSIgfCAicmV6ZXJ2YXRpb24iCi8vLyAgIC0gc3RhcnREYXRlIChvcHRpb25hbCwgcHVibGljLWhvbGlkYXkvcGVyc29uYWwtbGVhdmUvcmV6ZXJ2YXRpb24pOiBmaWx0ZXIgc3RhcnREYXRlVGltZSA+PSB2YWx1ZQovLy8gICAtIGVuZERhdGUgKG9wdGlvbmFsLCBwdWJsaWMtaG9saWRheS9wZXJzb25hbC1sZWF2ZS9yZXplcnZhdGlvbik6IGZpbHRlciBlbmREYXRlVGltZSA8PSB2YWx1ZQovLy8gICAtIGFkdmlzb3IgKG9wdGlvbmFsLCBwZXJzb25hbC1sZWF2ZS93b3JraW5nLWhvdXJzLWNoYW5nZS9yZXplcnZhdGlvbik6IGZpbHRlciBieSBhZHZpc29yCi8vLyAgIC0gcGFnZVNpemUgKG9wdGlvbmFsLCBkZWZhdWx0IDEwMCkKLy8vCi8vLyBOb3RlOiBEYXRlIGZpbHRlcmluZyAoc3RhcnREYXRlL2VuZERhdGUpIGlzIHBlcmZvcm1lZCBjbGllbnQtc2lkZSBpbiBPdXRwdXRIYW5kbGVyCi8vLyBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBndGUvbHRlIG9wZXJhdG9ycyBvbiBhdHRyaWJ1dGUgZmllbGRzLgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0QWJzZW5jZUVudHJ5TWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYXBwSWQgPSBHZXRDb25maWdWYWx1ZSgiREFQUl9BUFBfSUQiKTsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFwcElkKSkKICAgICAgICAgICAgc2VydmljZVRhc2suU2V0QXBwSWQoYXBwSWQpOwoKICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImFic2VuY2VUeXBlIik7CgogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhYnNlbmNlVHlwZSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidmFsaWRhdGlvbi1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiYWJzZW5jZVR5cGUgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJWQUxJREFUSU9OX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcyA9IG5ld1tdIHsgInB1YmxpYy1ob2xpZGF5IiwgInBlcnNvbmFsLWxlYXZlIiwgIndvcmtpbmctaG91cnMtY2hhbmdlIiwgInJlemVydmF0aW9uIiB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHZhbGlkVHlwZXMgPSBuZXdbXSB7ICJwdWJsaWMtaG9saWRheSIsICJwZXJzb25hbC1sZWF2ZSIsICJ3b3JraW5nLWhvdXJzLWNoYW5nZSIsICJyZXplcnZhdGlvbiIgfTsKICAgICAgICBib29sIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICBmb3JlYWNoICh2YXIgdnQgaW4gdmFsaWRUeXBlcykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2dCA9PSBhYnNlbmNlVHlwZSkgeyBpc1ZhbGlkID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CgogICAgICAgIGlmICghaXNWYWxpZCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ2YWxpZGF0aW9uLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnZhbGlkIGFic2VuY2VUeXBlIHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiVkFMSURBVElPTl9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgPSBhYnNlbmNlVHlwZSwKICAgICAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcyA9IHZhbGlkVHlwZXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgYWR2aXNvciA9IFJlYWRQYXJhbShjb250ZXh0LCAiYWR2aXNvciIpOwoKICAgICAgICB2YXIgcGFnZVNpemVTdHIgPSBSZWFkUGFyYW0oY29udGV4dCwgInBhZ2VTaXplIik7CiAgICAgICAgaW50IHBhZ2VTaXplID0gMTAwOwogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkocGFnZVNpemVTdHIpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHBhcnNlZCA9IDA7CiAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UocGFnZVNpemVTdHIsIG91dCBwYXJzZWQpICYmIHBhcnNlZCA+IDApCiAgICAgICAgICAgICAgICBwYWdlU2l6ZSA9IHBhcnNlZDsKICAgICAgICB9CgogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwoKICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcImFic2VuY2VUeXBlXCI6e1wiZXFcIjpcIiIgKyBhYnNlbmNlVHlwZSArICJcIn19fSIpOwoKICAgICAgICBpZiAoYWJzZW5jZVR5cGUgPT0gIndvcmtpbmctaG91cnMtY2hhbmdlIikKICAgICAgICB7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcikpCiAgICAgICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wia2V5XCI6e1wiZXFcIjpcIndvcmtpbmctaG91ci0iICsgYWR2aXNvciArICJcIn19Iik7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJrZXlcIjp7XCJlcVwiOlwid29ya2luZy1ob3VyXCJ9fSIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKChhYnNlbmNlVHlwZSA9PSAicGVyc29uYWwtbGVhdmUiIHx8IGFic2VuY2VUeXBlID09ICJyZXplcnZhdGlvbiIpICYmICFzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHZpc29yKSkKICAgICAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcImF0dHJpYnV0ZXNcIjp7XCJhZHZpc29yXCI6e1wiZXFcIjpcIiIgKyBhZHZpc29yICsgIlwifX19Iik7CgogICAgICAgIHZhciBmaWx0ZXJKc29uID0gIntcImFuZFwiOlsiICsgc3RyaW5nLkpvaW4oIiwiLCBjb25kaXRpb25zKSArICJdfSI7CgogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBMaXN0PHN0cmluZz4KICAgICAgICB7CiAgICAgICAgICAgICJwYWdlU2l6ZT0iICsgcGFnZVNpemUsCiAgICAgICAgICAgICJjdXJyZW50U3RhdGU9Y29tcGxldGUiLAogICAgICAgICAgICAiZmlsdGVyPSIgKyBmaWx0ZXJKc29uCiAgICAgICAgfTsKCiAgICAgICAgc2VydmljZVRhc2suU2V0UXVlcnlTdHJpbmcoc3RyaW5nLkpvaW4oIiYiLCBxdWVyeVBhcmFtcykpOwoKICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgYXN5bmMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImFic2VuY2VUeXBlIik7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElkID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5hcHBJZD8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSByZXNwb25zZT8ubWV0YWRhdGE/Lm1ldGhvZE5hbWU/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwVmVyYiA9IHJlc3BvbnNlPy5tZXRhZGF0YT8uaHR0cFZlcmI/LlRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFic2VuY2UtZW50cnkiLCAiZXJyb3IiIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByZXNwb25zZURhdGEgPSByZXNwb25zZT8uZGF0YTsKICAgICAgICAgICAgdmFyIGl0ZW1zID0gcmVzcG9uc2VEYXRhPy5pdGVtczsKCiAgICAgICAgICAgIGJvb2wgc3VwcG9ydHNEYXRlRmlsdGVyID0gKGFic2VuY2VUeXBlID09ICJwdWJsaWMtaG9saWRheSIgfHwgYWJzZW5jZVR5cGUgPT0gInBlcnNvbmFsLWxlYXZlIiB8fCBhYnNlbmNlVHlwZSA9PSAicmV6ZXJ2YXRpb24iKTsKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVN0ciA9IFJlYWRQYXJhbShjb250ZXh0LCAic3RhcnREYXRlIik7CiAgICAgICAgICAgIHZhciBlbmREYXRlU3RyID0gUmVhZFBhcmFtKGNvbnRleHQsICJlbmREYXRlIik7CgogICAgICAgICAgICBpZiAoc3VwcG9ydHNEYXRlRmlsdGVyICYmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlU3RyKSB8fCAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZVN0cikpICYmIGl0ZW1zICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGVUaW1lIHN0YXJ0RGF0ZUZpbHRlciA9IGRlZmF1bHQ7CiAgICAgICAgICAgICAgICBEYXRlVGltZSBlbmREYXRlRmlsdGVyID0gZGVmYXVsdDsKICAgICAgICAgICAgICAgIGJvb2wgaGFzU3RhcnRGaWx0ZXIgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlU3RyKSAmJiBUcnlQYXJzZVRvVXRjKHN0YXJ0RGF0ZVN0ciwgb3V0IHN0YXJ0RGF0ZUZpbHRlcik7CiAgICAgICAgICAgICAgICBib29sIGhhc0VuZEZpbHRlciA9ICFzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlU3RyKSAmJiBUcnlQYXJzZVRvVXRjKGVuZERhdGVTdHIsIG91dCBlbmREYXRlRmlsdGVyKTsKCiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyZWRJdGVtcyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgICAgICBmb3JlYWNoIChkeW5hbWljIGl0ZW0gaW4gaXRlbXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJzID0gaXRlbT8uYXR0cmlidXRlczsKICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVtU3RhcnRTdHIgPSBhdHRycz8uc3RhcnREYXRlVGltZT8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlbUVuZFN0ciA9IGF0dHJzPy5lbmREYXRlVGltZT8uVG9TdHJpbmcoKTsKCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgaXRlbVN0YXJ0ID0gZGVmYXVsdDsKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBpdGVtRW5kID0gZGVmYXVsdDsKICAgICAgICAgICAgICAgICAgICBib29sIHBhcnNlZFN0YXJ0ID0gIXN0cmluZy5Jc051bGxPckVtcHR5KGl0ZW1TdGFydFN0cikgJiYgVHJ5UGFyc2VUb1V0YyhpdGVtU3RhcnRTdHIsIG91dCBpdGVtU3RhcnQpOwogICAgICAgICAgICAgICAgICAgIGJvb2wgcGFyc2VkRW5kID0gIXN0cmluZy5Jc051bGxPckVtcHR5KGl0ZW1FbmRTdHIpICYmIFRyeVBhcnNlVG9VdGMoaXRlbUVuZFN0ciwgb3V0IGl0ZW1FbmQpOwoKICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGUgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU3RhcnRGaWx0ZXIgJiYgcGFyc2VkU3RhcnQgJiYgaXRlbVN0YXJ0IDwgc3RhcnREYXRlRmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChoYXNFbmRGaWx0ZXIgJiYgcGFyc2VkRW5kICYmIGl0ZW1FbmQgPiBlbmREYXRlRmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlKQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEl0ZW1zLkFkZChpdGVtKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gImFic2VuY2UtZW50cnktc3VjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWJzZW5jZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gZmlsdGVyZWRJdGVtcwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ldyBzdHJpbmdbXSB7ICJhYnNlbmNlLWVudHJ5IiwgYWJzZW5jZVR5cGUgPz8gIiIsICJzdWNjZXNzIiB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJhYnNlbmNlLWVudHJ5LXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGFic2VuY2VUeXBlLAogICAgICAgICAgICAgICAgICAgIGl0ZW1zCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ldyBzdHJpbmdbXSB7ICJhYnNlbmNlLWVudHJ5IiwgYWJzZW5jZVR5cGUgPz8gIiIsICJzdWNjZXNzIiB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJvdXRwdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJQUk9DRVNTSU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckRlc2NyaXB0aW9uID0gZXguTWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhYnNlbmNlLWVudHJ5IiwgImVycm9yIiB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbCBUcnlQYXJzZVRvVXRjKHN0cmluZyBkYXRlU3RyLCBvdXQgRGF0ZVRpbWUgdXRjRGF0ZVRpbWUpCiAgICB7CiAgICAgICAgdXRjRGF0ZVRpbWUgPSBkZWZhdWx0OwogICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShkYXRlU3RyKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChEYXRlVGltZU9mZnNldC5UcnlQYXJzZShkYXRlU3RyLAogICAgICAgICAgICBTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLAogICAgICAgICAgICBTeXN0ZW0uR2xvYmFsaXphdGlvbi5EYXRlVGltZVN0eWxlcy5Ob25lLCBvdXQgdmFyIGR0bykpCiAgICAgICAgewogICAgICAgICAgICB1dGNEYXRlVGltZSA9IGR0by5VdGNEYXRlVGltZTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwcml2YXRlIHN0cmluZyBSZWFkUGFyYW0oU2NyaXB0Q29udGV4dCBjb250ZXh0LCBzdHJpbmcgbmFtZSkKICAgIHsKICAgICAgICBpZiAoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgPT0gbnVsbCB8fCAhSGFzUHJvcGVydHkoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMsIG5hbWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgdmFsID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbbmFtZV07CiAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxsID8gdmFsLlRvU3RyaW5nKCkgOiBudWxsOwogICAgfQp9Cg=="
25
25
  }
26
26
  }
27
27
  }
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "mapping": {
22
22
  "location": "./src/GetAdvisorStatsMapping.csx",
23
- "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QWR2aXNvclN0YXRzVGFzayAoRGFwclNlcnZpY2VUYXNrIC0gVHlwZSAzKQovLy8gUXVlcmllcyByZXplcnZhdGlvbiB3b3JrZmxvdyBpbnN0YW5jZXMgdG8gY2FsY3VsYXRlIGFkdmlzb3IgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcy4KLy8vCi8vLyBRdWVyeSBwYXJhbWV0ZXJzOgovLy8gICAtIGFkdmlzb3JJZCAocmVxdWlyZWQpOiBhZHZpc29yIGlkZW50aWZpZXIKLy8vICAgLSBwZXJpb2QgKG9wdGlvbmFsKTogIndlZWsiIHwgIm1vbnRoIiDigJQgZGVmYXVsdCAid2VlayIKLy8vICAgLSBzdGFydERhdGUgKG9wdGlvbmFsKTogZmlsdGVyIHN0YXJ0RGF0ZVRpbWUgPj0gdmFsdWUKLy8vICAgLSBlbmREYXRlIChvcHRpb25hbCk6IGZpbHRlciBlbmREYXRlVGltZSA8PSB2YWx1ZQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0QWR2aXNvclN0YXRzTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYWR2aXNvcklkID0gUmVhZFBhcmFtKGNvbnRleHQsICJhZHZpc29ySWQiKTsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ2YWxpZGF0aW9uLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJhZHZpc29ySWQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJWQUxJREFUSU9OX0VSUk9SIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHZhciBwZXJpb2QgPSBSZWFkUGFyYW0oY29udGV4dCwgInBlcmlvZCIpID8/ICJ3ZWVrIjsKICAgICAgICB2YXIgc3RhcnREYXRlID0gUmVhZFBhcmFtKGNvbnRleHQsICJzdGFydERhdGUiKTsKICAgICAgICB2YXIgZW5kRGF0ZSA9IFJlYWRQYXJhbShjb250ZXh0LCAiZW5kRGF0ZSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBub3cgPSBEYXRlVGltZS5VdGNOb3c7CiAgICAgICAgICAgIGlmIChwZXJpb2QgPT0gIm1vbnRoIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhcnREYXRlID0gc3RhcnREYXRlID8/IG5vdy5BZGREYXlzKC0zMCkuVG9TdHJpbmcoInl5eXktTU0tZGRUSEg6bW06c3MiKTsKICAgICAgICAgICAgICAgIGVuZERhdGUgPSBlbmREYXRlID8/IG5vdy5Ub1N0cmluZygieXl5eS1NTS1kZFRISDptbTpzcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhcnREYXRlID0gc3RhcnREYXRlID8/IG5vdy5BZGREYXlzKC03KS5Ub1N0cmluZygieXl5eS1NTS1kZFRISDptbTpzcyIpOwogICAgICAgICAgICAgICAgZW5kRGF0ZSA9IGVuZERhdGUgPz8gbm93LlRvU3RyaW5nKCJ5eXl5LU1NLWRkVEhIOm1tOnNzIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwogICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWR2aXNvclwiOntcImVxXCI6XCIiICsgYWR2aXNvcklkICsgIlwifX19Iik7CiAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcInN0YXR1c1wiOntcImVxXCI6XCJBXCJ9fSIpOwoKICAgICAgICB2YXIgZmlsdGVySnNvbiA9ICJ7XCJhbmRcIjpbIiArIHN0cmluZy5Kb2luKCIsIiwgY29uZGl0aW9ucykgKyAiXX0iOwoKICAgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBuZXcgTGlzdDxzdHJpbmc+ewogICAgICAgICAgICAicGFnZVNpemU9NTAwIiwKICAgICAgICAgICAgJCJmaWx0ZXI9e2ZpbHRlckpzb259IgogICAgICAgIH07CgogICAgICAgIHNlcnZpY2VUYXNrLlNldFF1ZXJ5U3RyaW5nKHN0cmluZy5Kb2luKCImIiwgcXVlcnlQYXJhbXMpKTsKICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgYWR2aXNvcklkID0gUmVhZFBhcmFtKGNvbnRleHQsICJhZHZpc29ySWQiKTsKICAgICAgICAgICAgdmFyIHBlcmlvZCA9IFJlYWRQYXJhbShjb250ZXh0LCAicGVyaW9kIikgPz8gIndlZWsiOwogICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gUmVhZFBhcmFtKGNvbnRleHQsICJzdGFydERhdGUiKTsKICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBSZWFkUGFyYW0oY29udGV4dCwgImVuZERhdGUiKTsKCiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNTdWNjZXNzID09IGZhbHNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJzZXJ2aWNlLWVycm9yIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJGYWlsZWQgdG8gZmV0Y2ggcmVzZXJ2YXRpb25zIGZvciBzdGF0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJTRVJWSUNFX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZT8uVG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFkdmlzb3Itc3RhdHMiLCAiZXJyb3IiIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2U/LmRhdGE7CiAgICAgICAgICAgIHZhciBpdGVtcyA9IHJlc3BvbnNlRGF0YT8uaXRlbXM7CgogICAgICAgICAgICBpbnQgdG90YWxDb3VudCA9IDA7CiAgICAgICAgICAgIGludCBjb21wbGV0ZWRDb3VudCA9IDA7CiAgICAgICAgICAgIGludCBjYW5jZWxsZWRDb3VudCA9IDA7CiAgICAgICAgICAgIGludCBhY3RpdmVDb3VudCA9IDA7CiAgICAgICAgICAgIGludCBpbk1lZXRDb3VudCA9IDA7CiAgICAgICAgICAgIGRvdWJsZSB0b3RhbER1cmF0aW9uTWludXRlcyA9IDA7CgogICAgICAgICAgICBEYXRlVGltZSBmaWx0ZXJTdGFydCA9IERhdGVUaW1lLk1pblZhbHVlOwogICAgICAgICAgICBEYXRlVGltZSBmaWx0ZXJFbmQgPSBEYXRlVGltZS5NYXhWYWx1ZTsKICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShzdGFydERhdGUpKSBEYXRlVGltZS5UcnlQYXJzZShzdGFydERhdGUsIG91dCBmaWx0ZXJTdGFydCk7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZSkpIERhdGVUaW1lLlRyeVBhcnNlKGVuZERhdGUsIG91dCBmaWx0ZXJFbmQpOwoKICAgICAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKGR5bmFtaWMgaXRlbSBpbiBpdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBpdGVtPy5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgIGlmIChhdHRycyA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZW1TdGFydFN0ciA9IGF0dHJzPy5zdGFydERhdGVUaW1lPy5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShpdGVtU3RhcnRTdHIpKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgaXRlbVN0YXJ0OwogICAgICAgICAgICAgICAgICAgIGlmICghRGF0ZVRpbWUuVHJ5UGFyc2UoaXRlbVN0YXJ0U3RyLCBvdXQgaXRlbVN0YXJ0KSkgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtU3RhcnQgPCBmaWx0ZXJTdGFydCB8fCBpdGVtU3RhcnQgPiBmaWx0ZXJFbmQpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICB0b3RhbENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0ZSA9IGl0ZW0/Lm1ldGFkYXRhPy5jdXJyZW50U3RhdGU/LlRvU3RyaW5nKCkgPz8gIiI7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICJtZWV0LWNvbXBsZXRlZCIgfHwgc3RhdGUgPT0gImNvbXBsZXRlZCIpIGNvbXBsZXRlZENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gInVzZXItY2FuY2VsbGVkIiB8fCBzdGF0ZSA9PSAiYWR2aXNvci1jYW5jZWxsZWQiIHx8IHN0YXRlID09ICJ0aW1lb3V0IikgY2FuY2VsbGVkQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAiYWN0aXZlIiB8fCBzdGF0ZSA9PSAiY2FuLXN0YXJ0LW1lZXRpbmciIHx8IHN0YXRlID09ICJhY2NlcHQtdGVybXMiKSBhY3RpdmVDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09ICJpbi1tZWV0IikgaW5NZWV0Q291bnQrKzsKCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZW1FbmRTdHIgPSBhdHRycz8uZW5kRGF0ZVRpbWU/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShpdGVtRW5kU3RyKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGl0ZW1FbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEYXRlVGltZS5UcnlQYXJzZShpdGVtRW5kU3RyLCBvdXQgaXRlbUVuZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlcyArPSAoaXRlbUVuZCAtIGl0ZW1TdGFydCkuVG90YWxNaW51dGVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImFkdmlzb3Itc3RhdHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWR2aXNvcklkLAogICAgICAgICAgICAgICAgICAgIHBlcmlvZCwKICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUsCiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICB0b3RhbFJlc2VydmF0aW9ucyA9IHRvdGFsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkID0gY29tcGxldGVkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gY2FuY2VsbGVkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gYWN0aXZlQ291bnQsCiAgICAgICAgICAgICAgICAgICAgaW5NZWV0ID0gaW5NZWV0Q291bnQsCiAgICAgICAgICAgICAgICAgICAgYXZlcmFnZUR1cmF0aW9uTWludXRlcyA9IHRvdGFsQ291bnQgPiAwID8gTWF0aC5Sb3VuZCh0b3RhbER1cmF0aW9uTWludXRlcyAvIHRvdGFsQ291bnQsIDEpIDogMCwKICAgICAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlcyA9IE1hdGguUm91bmQodG90YWxEdXJhdGlvbk1pbnV0ZXMsIDEpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFkdmlzb3Itc3RhdHMiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJvdXRwdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJQUk9DRVNTSU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckRlc2NyaXB0aW9uID0gZXguTWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhZHZpc29yLXN0YXRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHN0cmluZyBSZWFkUGFyYW0oU2NyaXB0Q29udGV4dCBjb250ZXh0LCBzdHJpbmcgbmFtZSkKICAgIHsKICAgICAgICBpZiAoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgPT0gbnVsbCB8fCAhSGFzUHJvcGVydHkoY29udGV4dC5RdWVyeVBhcmFtZXRlcnMsIG5hbWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgdmFsID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbbmFtZV07CiAgICAgICAgcmV0dXJuIHZhbCAhPSBudWxsID8gdmFsLlRvU3RyaW5nKCkgOiBudWxsOwogICAgfQp9Cg=="
23
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QWR2aXNvclN0YXRzVGFzayAoRGFwclNlcnZpY2VUYXNrIC0gVHlwZSAzKQovLy8gUXVlcmllcyByZXplcnZhdGlvbiB3b3JrZmxvdyBpbnN0YW5jZXMgdG8gY2FsY3VsYXRlIGFkdmlzb3IgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcy4KLy8vCi8vLyBRdWVyeSBwYXJhbWV0ZXJzOgovLy8gICAtIGFkdmlzb3JJZCAocmVxdWlyZWQpOiBhZHZpc29yIGlkZW50aWZpZXIKLy8vICAgLSBwZXJpb2QgKG9wdGlvbmFsKTogIndlZWsiIHwgIm1vbnRoIiDigJQgZGVmYXVsdCAid2VlayIKLy8vICAgLSBzdGFydERhdGUgKG9wdGlvbmFsKTogZmlsdGVyIHN0YXJ0RGF0ZVRpbWUgPj0gdmFsdWUKLy8vICAgLSBlbmREYXRlIChvcHRpb25hbCk6IGZpbHRlciBlbmREYXRlVGltZSA8PSB2YWx1ZQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0QWR2aXNvclN0YXRzTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYWR2aXNvcklkID0gUmVhZFBhcmFtKGNvbnRleHQsICJhZHZpc29ySWQiKTsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcklkKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJ2YWxpZGF0aW9uLWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJhZHZpc29ySWQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJWQUxJREFUSU9OX0VSUk9SIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHZhciBwZXJpb2QgPSBSZWFkUGFyYW0oY29udGV4dCwgInBlcmlvZCIpID8/ICJ3ZWVrIjsKICAgICAgICB2YXIgc3RhcnREYXRlID0gUmVhZFBhcmFtKGNvbnRleHQsICJzdGFydERhdGUiKTsKICAgICAgICB2YXIgZW5kRGF0ZSA9IFJlYWRQYXJhbShjb250ZXh0LCAiZW5kRGF0ZSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBub3cgPSBEYXRlVGltZS5VdGNOb3c7CiAgICAgICAgICAgIGlmIChwZXJpb2QgPT0gIm1vbnRoIikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhcnREYXRlID0gc3RhcnREYXRlID8/IG5vdy5BZGREYXlzKC0zMCkuVG9TdHJpbmcoInl5eXktTU0tZGRUSEg6bW06c3NaIik7CiAgICAgICAgICAgICAgICBlbmREYXRlID0gZW5kRGF0ZSA/PyBub3cuVG9TdHJpbmcoInl5eXktTU0tZGRUSEg6bW06c3NaIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGFydERhdGUgPSBzdGFydERhdGUgPz8gbm93LkFkZERheXMoLTcpLlRvU3RyaW5nKCJ5eXl5LU1NLWRkVEhIOm1tOnNzWiIpOwogICAgICAgICAgICAgICAgZW5kRGF0ZSA9IGVuZERhdGUgPz8gbm93LlRvU3RyaW5nKCJ5eXl5LU1NLWRkVEhIOm1tOnNzWiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29uZGl0aW9ucyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcImFkdmlzb3JcIjp7XCJlcVwiOlwiIiArIGFkdmlzb3JJZCArICJcIn19fSIpOwogICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJzdGF0dXNcIjp7XCJlcVwiOlwiQVwifX0iKTsKCiAgICAgICAgdmFyIGZpbHRlckpzb24gPSAie1wiYW5kXCI6WyIgKyBzdHJpbmcuSm9pbigiLCIsIGNvbmRpdGlvbnMpICsgIl19IjsKCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IExpc3Q8c3RyaW5nPnsKICAgICAgICAgICAgInBhZ2VTaXplPTUwMCIsCiAgICAgICAgICAgICQiZmlsdGVyPXtmaWx0ZXJKc29ufSIKICAgICAgICB9OwoKICAgICAgICBzZXJ2aWNlVGFzay5TZXRRdWVyeVN0cmluZyhzdHJpbmcuSm9pbigiJiIsIHF1ZXJ5UGFyYW1zKSk7CiAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UoKSk7CiAgICB9CgogICAgcHVibGljIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGFkdmlzb3JJZCA9IFJlYWRQYXJhbShjb250ZXh0LCAiYWR2aXNvcklkIik7CiAgICAgICAgICAgIHZhciBwZXJpb2QgPSBSZWFkUGFyYW0oY29udGV4dCwgInBlcmlvZCIpID8/ICJ3ZWVrIjsKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZSA9IFJlYWRQYXJhbShjb250ZXh0LCAic3RhcnREYXRlIik7CiAgICAgICAgICAgIHZhciBlbmREYXRlID0gUmVhZFBhcmFtKGNvbnRleHQsICJlbmREYXRlIik7CgogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CgogICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzU3VjY2VzcyA9PSBmYWxzZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPSAic2VydmljZS1lcnJvciIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiRmFpbGVkIHRvIGZldGNoIHJlc2VydmF0aW9ucyBmb3Igc3RhdHMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhZHZpc29yLXN0YXRzIiwgImVycm9yIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhOwogICAgICAgICAgICB2YXIgaXRlbXMgPSByZXNwb25zZURhdGE/Lml0ZW1zOwoKICAgICAgICAgICAgaW50IHRvdGFsQ291bnQgPSAwOwogICAgICAgICAgICBpbnQgY29tcGxldGVkQ291bnQgPSAwOwogICAgICAgICAgICBpbnQgY2FuY2VsbGVkQ291bnQgPSAwOwogICAgICAgICAgICBpbnQgYWN0aXZlQ291bnQgPSAwOwogICAgICAgICAgICBpbnQgaW5NZWV0Q291bnQgPSAwOwogICAgICAgICAgICBkb3VibGUgdG90YWxEdXJhdGlvbk1pbnV0ZXMgPSAwOwoKICAgICAgICAgICAgRGF0ZVRpbWUgZmlsdGVyU3RhcnQgPSBEYXRlVGltZS5NaW5WYWx1ZTsKICAgICAgICAgICAgRGF0ZVRpbWUgZmlsdGVyRW5kID0gRGF0ZVRpbWUuTWF4VmFsdWU7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSkgVHJ5UGFyc2VUb1V0YyhzdGFydERhdGUsIG91dCBmaWx0ZXJTdGFydCk7CiAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZSkpIFRyeVBhcnNlVG9VdGMoZW5kRGF0ZSwgb3V0IGZpbHRlckVuZCk7CgogICAgICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoZHluYW1pYyBpdGVtIGluIGl0ZW1zKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBhdHRycyA9IGl0ZW0/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlbVN0YXJ0U3RyID0gYXR0cnM/LnN0YXJ0RGF0ZVRpbWU/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGl0ZW1TdGFydFN0cikpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBpdGVtU3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFUcnlQYXJzZVRvVXRjKGl0ZW1TdGFydFN0ciwgb3V0IGl0ZW1TdGFydCkpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVN0YXJ0IDwgZmlsdGVyU3RhcnQgfHwgaXRlbVN0YXJ0ID4gZmlsdGVyRW5kKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgdG90YWxDb3VudCsrOwoKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdGUgPSBpdGVtPy5tZXRhZGF0YT8uY3VycmVudFN0YXRlPy5Ub1N0cmluZygpID8/ICIiOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAibWVldC1jb21wbGV0ZWQiIHx8IHN0YXRlID09ICJjb21wbGV0ZWQiKSBjb21wbGV0ZWRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09ICJ1c2VyLWNhbmNlbGxlZCIgfHwgc3RhdGUgPT0gImFkdmlzb3ItY2FuY2VsbGVkIiB8fCBzdGF0ZSA9PSAidGltZW91dCIpIGNhbmNlbGxlZENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gImFjdGl2ZSIgfHwgc3RhdGUgPT0gImNhbi1zdGFydC1tZWV0aW5nIiB8fCBzdGF0ZSA9PSAiYWNjZXB0LXRlcm1zIikgYWN0aXZlQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAiaW4tbWVldCIpIGluTWVldENvdW50Kys7CgogICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVtRW5kU3RyID0gYXR0cnM/LmVuZERhdGVUaW1lPy5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoaXRlbUVuZFN0cikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBpdGVtRW5kOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoVHJ5UGFyc2VUb1V0YyhpdGVtRW5kU3RyLCBvdXQgaXRlbUVuZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlcyArPSAoaXRlbUVuZCAtIGl0ZW1TdGFydCkuVG90YWxNaW51dGVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gImFkdmlzb3Itc3RhdHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYWR2aXNvcklkLAogICAgICAgICAgICAgICAgICAgIHBlcmlvZCwKICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUsCiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICB0b3RhbFJlc2VydmF0aW9ucyA9IHRvdGFsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkID0gY29tcGxldGVkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkID0gY2FuY2VsbGVkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gYWN0aXZlQ291bnQsCiAgICAgICAgICAgICAgICAgICAgaW5NZWV0ID0gaW5NZWV0Q291bnQsCiAgICAgICAgICAgICAgICAgICAgYXZlcmFnZUR1cmF0aW9uTWludXRlcyA9IHRvdGFsQ291bnQgPiAwID8gTWF0aC5Sb3VuZCh0b3RhbER1cmF0aW9uTWludXRlcyAvIHRvdGFsQ291bnQsIDEpIDogMCwKICAgICAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlcyA9IE1hdGguUm91bmQodG90YWxEdXJhdGlvbk1pbnV0ZXMsIDEpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFkdmlzb3Itc3RhdHMiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJvdXRwdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJQUk9DRVNTSU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckRlc2NyaXB0aW9uID0gZXguTWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhZHZpc29yLXN0YXRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGJvb2wgVHJ5UGFyc2VUb1V0YyhzdHJpbmcgZGF0ZVN0ciwgb3V0IERhdGVUaW1lIHV0Y0RhdGVUaW1lKQogICAgewogICAgICAgIHV0Y0RhdGVUaW1lID0gZGVmYXVsdDsKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZVN0cikpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoRGF0ZVRpbWVPZmZzZXQuVHJ5UGFyc2UoZGF0ZVN0ciwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uRGF0ZVRpbWVTdHlsZXMuTm9uZSwgb3V0IHZhciBkdG8pKQogICAgICAgIHsKICAgICAgICAgICAgdXRjRGF0ZVRpbWUgPSBkdG8uVXRjRGF0ZVRpbWU7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHJpdmF0ZSBzdHJpbmcgUmVhZFBhcmFtKFNjcmlwdENvbnRleHQgY29udGV4dCwgc3RyaW5nIG5hbWUpCiAgICB7CiAgICAgICAgaWYgKGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzID09IG51bGwgfHwgIUhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCBuYW1lKSkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIHZhbCA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzW25hbWVdOwogICAgICAgIHJldHVybiB2YWwgIT0gbnVsbCA/IHZhbC5Ub1N0cmluZygpIDogbnVsbDsKICAgIH0KfQo="
24
24
  }
25
25
  }
26
26
  }
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "mapping": {
25
25
  "location": "./src/GetAvailableSlotsMapping.csx",
26
- "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QXZhaWxhYmxlU2xvdHNUYXNrIChEYXByU2VydmljZVRhc2sgLSBUeXBlIDMpCi8vLyBRdWVyaWVzIGFic2VuY2UtZW50cnkgd29ya2Zsb3cgKHN0YXRlOiBjb21wbGV0ZSkgdmlhIERhcHIgc2VydmljZSBpbnZvY2F0aW9uIHRvIGdldAovLy8gcHVibGljIGhvbGlkYXlzLCB3b3JraW5nIGhvdXJzIGNoYW5nZXMsIGFuZCBwZXJzb25hbCBsZWF2ZXMuCi8vLyBUaGVuIGNhbGN1bGF0ZXMgYXZhaWxhYmxlIGFwcG9pbnRtZW50IHNsb3RzIGZvciB0aGUgZ2l2ZW4gYWR2aXNvciBhbmQgZGF0ZS4KLy8vCi8vLyBXb3JraW5nIGhvdXJzIHByaW9yaXR5OiBhZHZpc29yLXNwZWNpZmljID4gY29tcGFueS13aWRlIChhZHZpc29yPW51bGwpID4gbm8gaG91cnMKLy8vIEhhbGYtZGF5IHB1YmxpYyBob2xpZGF5cyBvbmx5IGJsb2NrIHRoZSBob2xpZGF5IGhvdXJzLCBub3QgdGhlIGVudGlyZSBkYXkuCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBHZXRBdmFpbGFibGVTbG90c01hcHBpbmcgOiBTY3JpcHRCYXNlLCBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdmFyIHNlcnZpY2VUYXNrID0gdGFzayBhcyBEYXByU2VydmljZVRhc2s7CiAgICAgICAgaWYgKHNlcnZpY2VUYXNrID09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUYXNrIG11c3QgYmUgYSBEYXByU2VydmljZVRhc2siKTsKCiAgICAgICAgdmFyIGFwcElkID0gR2V0Q29uZmlnVmFsdWUoIkRBUFJfQVBQX0lEIik7CiAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShhcHBJZCkpCiAgICAgICAgICAgIHNlcnZpY2VUYXNrLlNldEFwcElkKGFwcElkKTsKCiAgICAgICAgdmFyIGFkdmlzb3JJZCA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siYWR2aXNvcklkIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgdmFyIGRhdGUgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImRhdGUiXT8uVG9TdHJpbmcoKTsKCiAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidmFsaWRhdGlvbi1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiYWR2aXNvcklkIGFuZCBkYXRlIGFyZSByZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gIlZBTElEQVRJT05fRVJST1IiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlcXVlc3RlZERhdGUgPSBEYXRlVGltZS5QYXJzZShkYXRlKTsKICAgICAgICB2YXIgdHogPSBSZXNvbHZlVGltZVpvbmUoY29udGV4dCk7CiAgICAgICAgdmFyIHRvZGF5SW5CdXNpbmVzc1R6ID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhEYXRlVGltZS5VdGNOb3csIHR6KS5EYXRlOwogICAgICAgIGlmIChyZXF1ZXN0ZWREYXRlLkRhdGUgPCB0b2RheUluQnVzaW5lc3NUeikKICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJEYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdC4iLCAiZGF0ZSIpOwoKICAgICAgICB2YXIgZmlsdGVySnNvbiA9CiAgICAgICAgICAgICJ7XCJhbmRcIjpbIiArCiAgICAgICAgICAgICJ7XCJvclwiOlt7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiY29tcGxldGVcIn19LHtcImN1cnJlbnRTdGF0ZVwiOntcImVxXCI6XCJjb21wbGV0ZS13aXRoLXRyYW5zZmVyXCJ9fV19LCIgKwogICAgICAgICAgICAie1wib3JcIjpbIiArCiAgICAgICAgICAgICAgICAie1wiYXR0cmlidXRlc1wiOntcImFkdmlzb3JcIjp7XCJlcVwiOlwiIiArIGFkdmlzb3JJZCArICJcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWJzZW5jZVR5cGVcIjp7XCJlcVwiOlwicHVibGljLWhvbGlkYXlcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWJzZW5jZVR5cGVcIjp7XCJlcVwiOlwid29ya2luZy1ob3Vycy1jaGFuZ2VcIn19fSIgKwogICAgICAgICAgICAiXX0iICsKICAgICAgICAgICAgIl19IjsKCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IExpc3Q8c3RyaW5nPgogICAgICAgIHsKICAgICAgICAgICAgInBhZ2VTaXplPTEwMCIsCiAgICAgICAgICAgICQiZmlsdGVyPXtmaWx0ZXJKc29ufSIKICAgICAgICB9OwoKICAgICAgICBzZXJ2aWNlVGFzay5TZXRRdWVyeVN0cmluZyhzdHJpbmcuSm9pbigiJiIsIHF1ZXJ5UGFyYW1zKSk7CgogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhZHZpc29ySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImFkdmlzb3JJZCJdPy5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZGF0ZVN0ciA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siZGF0ZSJdPy5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBHZXRBcHBvaW50bWVudER1cmF0aW9uKGNvbnRleHQpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZVN0cikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInZhbGlkYXRpb24tZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gImFkdmlzb3JJZCBhbmQgZGF0ZSBhcmUgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiVkFMSURBVElPTl9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmlzb3JJZCwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGRhdGVTdHIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlcXVlc3RlZERhdGUgPSBEYXRlVGltZS5QYXJzZShkYXRlU3RyKTsKICAgICAgICAgICAgdmFyIGRheU9mV2VlayA9IHJlcXVlc3RlZERhdGUuRGF5T2ZXZWVrLlRvU3RyaW5nKCkuVG9Mb3dlcigpOwoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvclR5cGUgPSBDbGFzc2lmeVNlcnZpY2VFcnJvcihyZXNwb25zZT8uZXJyb3JNZXNzYWdlPy5Ub1N0cmluZygpID8/ICIiKTsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZSA9IGVycm9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUluZm8gPSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWQgPSByZXNwb25zZT8ubWV0YWRhdGE/LmFwcElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHJlc3BvbnNlPy5tZXRhZGF0YT8ubWV0aG9kTmFtZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBWZXJiID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5odHRwVmVyYj8uVG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhOwogICAgICAgICAgICB2YXIgaXRlbXMgPSByZXNwb25zZURhdGE/Lml0ZW1zOwoKICAgICAgICAgICAgdmFyIGluc3RhbmNlcyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgIGlmIChpdGVtcyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBpdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXMuQWRkKGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHVibGljSG9saWRheXMgPSBuZXcgTGlzdDxkeW5hbWljPigpOwogICAgICAgICAgICB2YXIgYWR2aXNvcldvcmtpbmdIb3VycyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgIHZhciBjb21wYW55V29ya2luZ0hvdXJzID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKICAgICAgICAgICAgdmFyIHBlcnNvbmFsTGVhdmVzID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpbnN0YW5jZSBpbiBpbnN0YW5jZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gaW5zdGFuY2U/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBhdHRyaWJ1dGVzPy5hYnNlbmNlVHlwZT8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIHZhciBhZHZpc29yID0gSGFzUHJvcGVydHkoYXR0cmlidXRlcywgImFkdmlzb3IiKSA/IGF0dHJpYnV0ZXM/LmFkdmlzb3I/LlRvU3RyaW5nKCkgOiBudWxsOwoKICAgICAgICAgICAgICAgIHN3aXRjaCAoYWJzZW5jZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicHVibGljLWhvbGlkYXkiOgogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNIb2xpZGF5cy5BZGQoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ3b3JraW5nLWhvdXJzLWNoYW5nZSI6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcikgJiYgYWR2aXNvciA9PSBhZHZpc29ySWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZpc29yV29ya2luZ0hvdXJzLkFkZChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueVdvcmtpbmdIb3Vycy5BZGQoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJwZXJzb25hbC1sZWF2ZSIgd2hlbiBhZHZpc29yID09IGFkdmlzb3JJZDoKICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYWxMZWF2ZXMuQWRkKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicmV6ZXJ2YXRpb24iIHdoZW4gYWR2aXNvciA9PSBhZHZpc29ySWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFsTGVhdmVzLkFkZChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdW5hdmFpbGFibGVSYW5nZXMgPSBHZXRVbmF2YWlsYWJsZVJhbmdlcyhwZXJzb25hbExlYXZlcywgcmVxdWVzdGVkRGF0ZSk7CgogICAgICAgICAgICAvLyBIYWxmLWRheSAvIGZ1bGwtZGF5IHB1YmxpYyBob2xpZGF5IGhhbmRsaW5nCiAgICAgICAgICAgIHZhciBob2xpZGF5UmFuZ2VzID0gR2V0SG9saWRheVJhbmdlcyhwdWJsaWNIb2xpZGF5cywgcmVxdWVzdGVkRGF0ZSk7CiAgICAgICAgICAgIGlmIChob2xpZGF5UmFuZ2VzICE9IG51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChob2xpZGF5UmFuZ2VzLkNvdW50ID09IDEKICAgICAgICAgICAgICAgICAgICAmJiBob2xpZGF5UmFuZ2VzWzBdLkl0ZW0xID09IFRpbWVTcGFuLlplcm8KICAgICAgICAgICAgICAgICAgICAmJiBob2xpZGF5UmFuZ2VzWzBdLkl0ZW0yID49IG5ldyBUaW1lU3BhbigyMywgNTksIDApKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSAicHVibGljLWhvbGlkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgYXZhaWxhYmxlU2xvdHMgPSBuZXcgTGlzdDxzdHJpbmc+KCkgfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFwcG9pbnRtZW50cyIsICJob2xpZGF5IiB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdW5hdmFpbGFibGVSYW5nZXMuQWRkUmFuZ2UoaG9saWRheVJhbmdlcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFdvcmtpbmcgaG91cnMgcHJpb3JpdHk6IGFkdmlzb3Itc3BlY2lmaWMgPiBjb21wYW55LXdpZGUKICAgICAgICAgICAgdmFyIHdvcmtpbmdIb3VycyA9IEdldFdvcmtpbmdIb3Vyc0ZvckRheShhZHZpc29yV29ya2luZ0hvdXJzLCBkYXlPZldlZWspOwogICAgICAgICAgICBpZiAod29ya2luZ0hvdXJzID09IG51bGwgfHwgd29ya2luZ0hvdXJzLkNvdW50ID09IDApCiAgICAgICAgICAgICAgICB3b3JraW5nSG91cnMgPSBHZXRXb3JraW5nSG91cnNGb3JEYXkoY29tcGFueVdvcmtpbmdIb3VycywgZGF5T2ZXZWVrKTsKCiAgICAgICAgICAgIGlmICh3b3JraW5nSG91cnMgPT0gbnVsbCB8fCB3b3JraW5nSG91cnMuQ291bnQgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgPSAibm8td29ya2luZy1ob3VycyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGF2YWlsYWJsZVNsb3RzID0gbmV3IExpc3Q8c3RyaW5nPigpIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFwcG9pbnRtZW50cyIsICJjbG9zZWQiIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgYXZhaWxhYmxlU2xvdHMgPSBDYWxjdWxhdGVBdmFpbGFibGVTbG90cyh3b3JraW5nSG91cnMsIHVuYXZhaWxhYmxlUmFuZ2VzLCBkdXJhdGlvbik7CiAgICAgICAgICAgIGF2YWlsYWJsZVNsb3RzID0gRmlsdGVyU2xvdHNFeGNsdWRpbmdQYXN0Rm9yQnVzaW5lc3NUb2RheShhdmFpbGFibGVTbG90cywgcmVxdWVzdGVkRGF0ZSwgUmVzb2x2ZVRpbWVab25lKGNvbnRleHQpKTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJhdmFpbGFibGUtc2xvdHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgYXZhaWxhYmxlU2xvdHMgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiYXZhaWxhYmlsaXR5IiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAib3V0cHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAjcmVnaW9uIEhlbHBlciBNZXRob2RzCgogICAgcHJpdmF0ZSBzdHJpbmcgQ2xhc3NpZnlTZXJ2aWNlRXJyb3Ioc3RyaW5nIGVycm9yTWVzc2FnZSkKICAgIHsKICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvbnRhaW5zKCJ0aW1lb3V0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAidGltZW91dCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygidW5hdXRob3JpemVkIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAiYXV0aGVudGljYXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImZvcmJpZGRlbiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gImF1dGhvcml6YXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoIm5vdCBmb3VuZCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gIm5vdC1mb3VuZCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygic2VydmljZSB1bmF2YWlsYWJsZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gInNlcnZpY2UtdW5hdmFpbGFibGUiOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKICAgICAgICAgICAgcmV0dXJuICJjb25uZWN0aW9uLWVycm9yIjsKCiAgICAgICAgcmV0dXJuICJnZW5lcmFsLWVycm9yIjsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gSUFOQSBpZCAoZS5nLiBFdXJvcGUvSXN0YW5idWwpIG9yIFdpbmRvd3MgaWQgKFR1cmtleSBTdGFuZGFyZCBUaW1lKS4gUXVlcnkgb3ZlcnJpZGVzIGNvbmZpZy4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwcml2YXRlIFRpbWVab25lSW5mbyBSZXNvbHZlVGltZVpvbmUoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGNvbnRleHQ/LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidGltZVpvbmUiKSkKICAgICAgICAgICAgICAgIGlkID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbInRpbWVab25lIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidGltZXpvbmUiKSkKICAgICAgICAgICAgICAgIGlkID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbInRpbWV6b25lIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShpZCkpCiAgICAgICAgICAgIGlkID0gR2V0Q29uZmlnVmFsdWUoIkFwcG9pbnRtZW50czpUaW1lWm9uZSIpID8/IEdldENvbmZpZ1ZhbHVlKCJBUFBPSU5UTUVOVF9USU1FWk9ORSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShpZCkpCiAgICAgICAgICAgIGlkID0gIkV1cm9wZS9Jc3RhbmJ1bCI7CgogICAgICAgIHJldHVybiBGaW5kVGltZVpvbmVCeUlkKGlkLlRyaW0oKSk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIExpbnV4L21hY09TOiBJQU5BIGlkcyAoRXVyb3BlL0lzdGFuYnVsKS4gV2luZG93czogb2Z0ZW4gVHVya2V5IFN0YW5kYXJkIFRpbWUuCiAgICAvLy8gVHJpZXMgYWxpYXNlcywgdGhlbiBmaXhlZCBVVEMrMyBmb3IgVHVya2V5IChubyBEU1Qgc2luY2UgMjAxNikgaWYgc3lzdGVtIERCIGhhcyBuZWl0aGVyLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIHByaXZhdGUgc3RhdGljIFRpbWVab25lSW5mbyBGaW5kVGltZVpvbmVCeUlkKHN0cmluZyBpZCkKICAgIHsKICAgICAgICBmb3JlYWNoICh2YXIgY2FuZGlkYXRlIGluIEdldFRpbWVab25lSWRDYW5kaWRhdGVzKGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gVGltZVpvbmVJbmZvLkZpbmRTeXN0ZW1UaW1lWm9uZUJ5SWQoY2FuZGlkYXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoVGltZVpvbmVOb3RGb3VuZEV4Y2VwdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkVGltZVpvbmVFeGNlcHRpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKElzVHVya2V5VGltZVpvbmVJZChpZCkpCiAgICAgICAgICAgIHJldHVybiBDcmVhdGVUdXJrZXlGaXhlZFV0Y1BsdXMzVGltZVpvbmUoKTsKCiAgICAgICAgdGhyb3cgbmV3IFRpbWVab25lTm90Rm91bmRFeGNlcHRpb24oJCJUaW1lIHpvbmUgSUQgJ3tpZH0nIHdhcyBub3QgZm91bmQgb24gdGhpcyBzeXN0ZW0uIik7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgSUVudW1lcmFibGU8c3RyaW5nPiBHZXRUaW1lWm9uZUlkQ2FuZGlkYXRlcyhzdHJpbmcgaWQpCiAgICB7CiAgICAgICAgeWllbGQgcmV0dXJuIGlkOwoKICAgICAgICBpZiAoc3RyaW5nLkVxdWFscyhpZCwgIkV1cm9wZS9Jc3RhbmJ1bCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgIHsKICAgICAgICAgICAgeWllbGQgcmV0dXJuICJUdXJrZXkgU3RhbmRhcmQgVGltZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN0cmluZy5FcXVhbHMoaWQsICJUdXJrZXkgU3RhbmRhcmQgVGltZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgIHsKICAgICAgICAgICAgeWllbGQgcmV0dXJuICJFdXJvcGUvSXN0YW5idWwiOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBib29sIElzVHVya2V5VGltZVpvbmVJZChzdHJpbmcgaWQpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5FcXVhbHMoaWQsICJFdXJvcGUvSXN0YW5idWwiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKQogICAgICAgICAgICB8fCBzdHJpbmcuRXF1YWxzKGlkLCAiVHVya2V5IFN0YW5kYXJkIFRpbWUiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKTsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+Rml4ZWQgVVRDKzM7IG1hdGNoZXMgVHVya2V5IHdhbGwgdGltZSBzaW5jZSAyMDE2IChEU1QgYWJvbGlzaGVkKS48L3N1bW1hcnk+CiAgICBwcml2YXRlIHN0YXRpYyBUaW1lWm9uZUluZm8gQ3JlYXRlVHVya2V5Rml4ZWRVdGNQbHVzM1RpbWVab25lKCkKICAgIHsKICAgICAgICByZXR1cm4gVGltZVpvbmVJbmZvLkNyZWF0ZUN1c3RvbVRpbWVab25lKAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsLUZhbGxiYWNrIiwKICAgICAgICAgICAgVGltZVNwYW4uRnJvbUhvdXJzKDMpLAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsIChVVEMrMykiLAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsIChVVEMrMykiKTsKICAgIH0KCiAgICBwcml2YXRlIGludCBHZXRBcHBvaW50bWVudER1cmF0aW9uKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICBjb25zdCBpbnQgZGVmYXVsdER1cmF0aW9uID0gMzA7CgogICAgICAgIGlmIChjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAiZHVyYXRpb24iKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkdXJhdGlvblBhcmFtID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbImR1cmF0aW9uIl07CiAgICAgICAgICAgIGludCBxdWVyeUR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGR1cmF0aW9uUGFyYW0gIT0gbnVsbCAmJiBpbnQuVHJ5UGFyc2UoZHVyYXRpb25QYXJhbS5Ub1N0cmluZygpLCBvdXQgcXVlcnlEdXJhdGlvbikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeUR1cmF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29uZmlnRHVyYXRpb24gPSBHZXRDb25maWdWYWx1ZSgiQXBwb2ludG1lbnRzOkRlZmF1bHREdXJhdGlvbiIpOwogICAgICAgIGludCBjb25maWdEdXJhdGlvblZhbHVlID0gMDsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNvbmZpZ0R1cmF0aW9uKSAmJiBpbnQuVHJ5UGFyc2UoY29uZmlnRHVyYXRpb24sIG91dCBjb25maWdEdXJhdGlvblZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBjb25maWdEdXJhdGlvblZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRlZmF1bHREdXJhdGlvbjsKICAgIH0KCiAgICAjZW5kcmVnaW9uCgogICAgI3JlZ2lvbiBCdXNpbmVzcyBMb2dpYyBNZXRob2RzCgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFJldHVybnMgdW5hdmFpbGFibGUgdGltZSByYW5nZXMgZm9yIHB1YmxpYyBob2xpZGF5cyBvbiB0aGUgcmVxdWVzdGVkIGRhdGUuCiAgICAvLy8gbnVsbCA9IG5vIGhvbGlkYXkgb24gdGhpcyBkYXRlLgogICAgLy8vIEZ1bGwtZGF5IGhvbGlkYXk6IHNpbmdsZSByYW5nZSAwMDowMC0yMzo1OS4KICAgIC8vLyBIYWxmLWRheSBob2xpZGF5OiBwYXJ0aWFsIHJhbmdlIChlLmcuLCAwMDowMC0xMzowMCkuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgcHJpdmF0ZSBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+IEdldEhvbGlkYXlSYW5nZXMoTGlzdDxkeW5hbWljPiBob2xpZGF5cywgRGF0ZVRpbWUgZGF0ZSkKICAgIHsKICAgICAgICB2YXIgcmFuZ2VzID0gbmV3IExpc3Q8VHVwbGU8VGltZVNwYW4sIFRpbWVTcGFuPj4oKTsKICAgICAgICBib29sIGhhc0hvbGlkYXkgPSBmYWxzZTsKCiAgICAgICAgZm9yZWFjaCAodmFyIGhvbGlkYXkgaW4gaG9saWRheXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaG9saWRheURhdGEgPSBob2xpZGF5Py5hdHRyaWJ1dGVzOwogICAgICAgICAgICBpZiAoaG9saWRheURhdGEgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICBzdHJpbmcgc3RhcnREYXRlVGltZVN0ciA9IG51bGw7CiAgICAgICAgICAgIHN0cmluZyBlbmREYXRlVGltZVN0ciA9IG51bGw7CgogICAgICAgICAgICBpZiAoSGFzUHJvcGVydHkoaG9saWRheURhdGEsICJzdGFydERhdGVUaW1lIikgJiYgaG9saWRheURhdGEuc3RhcnREYXRlVGltZSAhPSBudWxsKQogICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZVN0ciA9IGhvbGlkYXlEYXRhLnN0YXJ0RGF0ZVRpbWUuVG9TdHJpbmcoKTsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShob2xpZGF5RGF0YSwgImVuZERhdGVUaW1lIikgJiYgaG9saWRheURhdGEuZW5kRGF0ZVRpbWUgIT0gbnVsbCkKICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lU3RyID0gaG9saWRheURhdGEuZW5kRGF0ZVRpbWUuVG9TdHJpbmcoKTsKCiAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShzdGFydERhdGVUaW1lU3RyKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlVGltZVN0cikpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBzdGFydERhdGVUaW1lID0gRGF0ZVRpbWUuUGFyc2Uoc3RhcnREYXRlVGltZVN0cik7CiAgICAgICAgICAgIHZhciBlbmREYXRlVGltZSA9IERhdGVUaW1lLlBhcnNlKGVuZERhdGVUaW1lU3RyKTsKCiAgICAgICAgICAgIGlmIChkYXRlLkRhdGUgPCBzdGFydERhdGVUaW1lLkRhdGUgfHwgZGF0ZS5EYXRlID4gZW5kRGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaGFzSG9saWRheSA9IHRydWU7CgogICAgICAgICAgICBpZiAoc3RhcnREYXRlVGltZS5EYXRlICE9IGVuZERhdGVUaW1lLkRhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChkYXRlLkRhdGUgPT0gc3RhcnREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKHN0YXJ0RGF0ZVRpbWUuVGltZU9mRGF5LCBuZXcgVGltZVNwYW4oMjMsIDU5LCA1OSkpKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGUuRGF0ZSA9PSBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKFRpbWVTcGFuLlplcm8sIGVuZERhdGVUaW1lLlRpbWVPZkRheSkpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKFRpbWVTcGFuLlplcm8sIG5ldyBUaW1lU3BhbigyMywgNTksIDU5KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoc3RhcnREYXRlVGltZS5UaW1lT2ZEYXksIGVuZERhdGVUaW1lLlRpbWVPZkRheSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaGFzSG9saWRheSA/IHJhbmdlcyA6IG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBMaXN0PG9iamVjdD4gR2V0V29ya2luZ0hvdXJzRm9yRGF5KExpc3Q8ZHluYW1pYz4gd29ya2luZ0hvdXJzQ2hhbmdlcywgc3RyaW5nIGRheU9mV2VlaykKICAgIHsKICAgICAgICBmb3JlYWNoICh2YXIgY2hhbmdlIGluIHdvcmtpbmdIb3Vyc0NoYW5nZXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hhbmdlRGF0YSA9IGNoYW5nZT8uYXR0cmlidXRlczsKICAgICAgICAgICAgaWYgKGNoYW5nZURhdGEgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICB2YXIgY3VzdG9tV0ggPSBjaGFuZ2VEYXRhPy5jdXN0b21Xb3JraW5nSG91cnM7CiAgICAgICAgICAgIGlmIChjdXN0b21XSCA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBkYXlIb3VycyA9IEdldERheUhvdXJzRnJvbUN1c3RvbShjdXN0b21XSCwgZGF5T2ZXZWVrKTsKICAgICAgICAgICAgaWYgKGRheUhvdXJzICE9IG51bGwpIHJldHVybiBkYXlIb3VyczsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHByaXZhdGUgTGlzdDxvYmplY3Q+IEdldERheUhvdXJzRnJvbUN1c3RvbShkeW5hbWljIGN1c3RvbVdILCBzdHJpbmcgZGF5T2ZXZWVrKQogICAgewogICAgICAgIGR5bmFtaWMgZGF5SG91cnMgPSBudWxsOwogICAgICAgIHN3aXRjaCAoZGF5T2ZXZWVrKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAibW9uZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8ubW9uZGF5OyBicmVhazsKICAgICAgICAgICAgY2FzZSAidHVlc2RheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LnR1ZXNkYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJ3ZWRuZXNkYXkiOiBkYXlIb3VycyA9IGN1c3RvbVdIPy53ZWRuZXNkYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJ0aHVyc2RheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LnRodXJzZGF5OyBicmVhazsKICAgICAgICAgICAgY2FzZSAiZnJpZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8uZnJpZGF5OyBicmVhazsKICAgICAgICAgICAgY2FzZSAic2F0dXJkYXkiOiBkYXlIb3VycyA9IGN1c3RvbVdIPy5zYXR1cmRheTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInN1bmRheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LnN1bmRheTsgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoZGF5SG91cnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgICAgIHZhciByZXN1bHQgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CiAgICAgICAgZm9yZWFjaCAodmFyIHJhbmdlIGluIGRheUhvdXJzKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcmFuZ2U/LnN0YXJ0Py5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZW5kID0gcmFuZ2U/LmVuZD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShzdGFydCkgJiYgIXN0cmluZy5Jc051bGxPckVtcHR5KGVuZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5BZGQobmV3IHsgc3RhcnQsIGVuZCB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0LkNvdW50ID4gMCA/IHJlc3VsdCA6IG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+IEdldFVuYXZhaWxhYmxlUmFuZ2VzKExpc3Q8ZHluYW1pYz4gcGVyc29uYWxMZWF2ZXMsIERhdGVUaW1lIGRhdGUpCiAgICB7CiAgICAgICAgdmFyIHJhbmdlcyA9IG5ldyBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+KCk7CgogICAgICAgIGZvcmVhY2ggKHZhciBsZWF2ZSBpbiBwZXJzb25hbExlYXZlcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBsZWF2ZURhdGEgPSBsZWF2ZT8uYXR0cmlidXRlczsKICAgICAgICAgICAgaWYgKGxlYXZlRGF0YSA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgIHN0cmluZyBzdGFydERhdGVUaW1lU3RyID0gbnVsbDsKICAgICAgICAgICAgc3RyaW5nIGVuZERhdGVUaW1lU3RyID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShsZWF2ZURhdGEsICJzdGFydERhdGVUaW1lIikgJiYgbGVhdmVEYXRhLnN0YXJ0RGF0ZVRpbWUgIT0gbnVsbCkKICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWVTdHIgPSBsZWF2ZURhdGEuc3RhcnREYXRlVGltZS5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KGxlYXZlRGF0YSwgImVuZERhdGVUaW1lIikgJiYgbGVhdmVEYXRhLmVuZERhdGVUaW1lICE9IG51bGwpCiAgICAgICAgICAgICAgICBlbmREYXRlVGltZVN0ciA9IGxlYXZlRGF0YS5lbmREYXRlVGltZS5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHN0YXJ0RGF0ZVRpbWVTdHIpIHx8IHN0cmluZy5Jc051bGxPckVtcHR5KGVuZERhdGVUaW1lU3RyKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVRpbWUgPSBEYXRlVGltZS5QYXJzZShzdGFydERhdGVUaW1lU3RyKTsKICAgICAgICAgICAgdmFyIGVuZERhdGVUaW1lID0gRGF0ZVRpbWUuUGFyc2UoZW5kRGF0ZVRpbWVTdHIpOwoKICAgICAgICAgICAgaWYgKGRhdGUuRGF0ZSA8IHN0YXJ0RGF0ZVRpbWUuRGF0ZSB8fCBkYXRlLkRhdGUgPiBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBpZiAoc3RhcnREYXRlVGltZS5EYXRlICE9IGVuZERhdGVUaW1lLkRhdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChkYXRlLkRhdGUgPT0gc3RhcnREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKHN0YXJ0RGF0ZVRpbWUuVGltZU9mRGF5LCBuZXcgVGltZVNwYW4oMjMsIDU5LCA1OSkpKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGUuRGF0ZSA9PSBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKFRpbWVTcGFuLlplcm8sIGVuZERhdGVUaW1lLlRpbWVPZkRheSkpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKFRpbWVTcGFuLlplcm8sIG5ldyBUaW1lU3BhbigyMywgNTksIDU5KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoc3RhcnREYXRlVGltZS5UaW1lT2ZEYXksIGVuZERhdGVUaW1lLlRpbWVPZkRheSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmFuZ2VzOwogICAgfQoKICAgIHByaXZhdGUgTGlzdDxzdHJpbmc+IENhbGN1bGF0ZUF2YWlsYWJsZVNsb3RzKExpc3Q8b2JqZWN0PiB3b3JraW5nSG91cnMsIExpc3Q8VHVwbGU8VGltZVNwYW4sIFRpbWVTcGFuPj4gdW5hdmFpbGFibGVSYW5nZXMsIGludCBkdXJhdGlvbk1pbnV0ZXMpCiAgICB7CiAgICAgICAgdmFyIHNsb3RzID0gbmV3IExpc3Q8c3RyaW5nPigpOwogICAgICAgIHZhciBkdXJhdGlvbiA9IFRpbWVTcGFuLkZyb21NaW51dGVzKGR1cmF0aW9uTWludXRlcyk7CgogICAgICAgIGZvcmVhY2ggKHZhciB3aCBpbiB3b3JraW5nSG91cnMpCiAgICAgICAgewogICAgICAgICAgICBkeW5hbWljIHdoRHluID0gd2g7CiAgICAgICAgICAgIHZhciBzdGFydFN0ciA9IHdoRHluPy5zdGFydD8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgdmFyIGVuZFN0ciA9IHdoRHluPy5lbmQ/LlRvU3RyaW5nKCk7CgogICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnRTdHIpIHx8IHN0cmluZy5Jc051bGxPckVtcHR5KGVuZFN0cikpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciB3aFN0YXJ0ID0gVGltZVNwYW4uUGFyc2Uoc3RhcnRTdHIpOwogICAgICAgICAgICB2YXIgd2hFbmQgPSBUaW1lU3Bhbi5QYXJzZShlbmRTdHIpOwoKICAgICAgICAgICAgaWYgKHdoU3RhcnQgPT0gd2hFbmQpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gd2hTdGFydDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgKyBkdXJhdGlvbiA8PSB3aEVuZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHNsb3RTdGFydCA9IGN1cnJlbnQ7CiAgICAgICAgICAgICAgICB2YXIgc2xvdEVuZCA9IGN1cnJlbnQgKyBkdXJhdGlvbjsKCiAgICAgICAgICAgICAgICBib29sIGlzQXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB1ciBpbiB1bmF2YWlsYWJsZVJhbmdlcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2xvdFN0YXJ0IDwgdXIuSXRlbTIgJiYgc2xvdEVuZCA+IHVyLkl0ZW0xKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc0F2YWlsYWJsZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzbG90cy5BZGQoJCJ7c2xvdFN0YXJ0OmhoXFw6bW19LXtzbG90RW5kOmhoXFw6bW19Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgKyBkdXJhdGlvbjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNsb3RzOwogICAgfQoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBXaGVuIHRoZSByZXF1ZXN0ZWQgY2FsZW5kYXIgZGF5IGVxdWFscyAidG9kYXkiIGluIHRoZSBidXNpbmVzcyB0aW1lem9uZSwgZHJvcCBzbG90cyB3aG9zZQogICAgLy8vIGxvY2FsIHN0YXJ0IHRpbWUgaXMgbm90IGFmdGVyICJub3ciIGluIHRoYXQgdGltZXpvbmUuIFNsb3Qgc3RyaW5ncyBtYXRjaCB3b3JraW5nIGhvdXJzICh3YWxsIGNsb2NrIGluIHRoYXQgVFopLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIHByaXZhdGUgc3RhdGljIExpc3Q8c3RyaW5nPiBGaWx0ZXJTbG90c0V4Y2x1ZGluZ1Bhc3RGb3JCdXNpbmVzc1RvZGF5KExpc3Q8c3RyaW5nPiBzbG90cywgRGF0ZVRpbWUgcmVxdWVzdGVkRGF0ZSwgVGltZVpvbmVJbmZvIHR6KQogICAgewogICAgICAgIGlmIChzbG90cyA9PSBudWxsIHx8IHNsb3RzLkNvdW50ID09IDApCiAgICAgICAgICAgIHJldHVybiBzbG90cyA/PyBuZXcgTGlzdDxzdHJpbmc+KCk7CgogICAgICAgIHZhciBub3dJblR6ID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhEYXRlVGltZS5VdGNOb3csIHR6KTsKICAgICAgICBpZiAocmVxdWVzdGVkRGF0ZS5EYXRlICE9IG5vd0luVHouRGF0ZSkKICAgICAgICAgICAgcmV0dXJuIHNsb3RzOwoKICAgICAgICB2YXIgZmlsdGVyZWQgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CiAgICAgICAgdmFyIGRheVN0YXJ0TG9jYWwgPSBuZXcgRGF0ZVRpbWUocmVxdWVzdGVkRGF0ZS5ZZWFyLCByZXF1ZXN0ZWREYXRlLk1vbnRoLCByZXF1ZXN0ZWREYXRlLkRheSwgMCwgMCwgMCwgRGF0ZVRpbWVLaW5kLlVuc3BlY2lmaWVkKTsKCiAgICAgICAgZm9yZWFjaCAodmFyIHMgaW4gc2xvdHMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShzKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHBhcnRzID0gcy5TcGxpdChuZXdbXSB7ICctJyB9LCAyLCBTdHJpbmdTcGxpdE9wdGlvbnMuTm9uZSk7CiAgICAgICAgICAgIGlmIChwYXJ0cy5MZW5ndGggIT0gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmlsdGVyZWQuQWRkKHMpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghVGltZVNwYW4uVHJ5UGFyc2UocGFydHNbMF0uVHJpbSgpLCBvdXQgdmFyIHN0YXJ0VHMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5BZGQocyk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHNsb3RTdGFydExvY2FsID0gZGF5U3RhcnRMb2NhbC5BZGQoc3RhcnRUcyk7CiAgICAgICAgICAgIGlmIChzbG90U3RhcnRMb2NhbCA+IG5vd0luVHopCiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5BZGQocyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CiAgICB9CgogICAgI2VuZHJlZ2lvbgp9Cg=="
26
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QXZhaWxhYmxlU2xvdHNUYXNrIChEYXByU2VydmljZVRhc2sgLSBUeXBlIDMpCi8vLyBRdWVyaWVzIGFic2VuY2UtZW50cnkgd29ya2Zsb3cgKHN0YXRlOiBjb21wbGV0ZSkgdmlhIERhcHIgc2VydmljZSBpbnZvY2F0aW9uIHRvIGdldAovLy8gcHVibGljIGhvbGlkYXlzLCB3b3JraW5nIGhvdXJzIGNoYW5nZXMsIGFuZCBwZXJzb25hbCBsZWF2ZXMuCi8vLyBUaGVuIGNhbGN1bGF0ZXMgYXZhaWxhYmxlIGFwcG9pbnRtZW50IHNsb3RzIGZvciB0aGUgZ2l2ZW4gYWR2aXNvciBhbmQgZGF0ZS4KLy8vCi8vLyBXb3JraW5nIGhvdXJzIHByaW9yaXR5OiBhZHZpc29yLXNwZWNpZmljID4gY29tcGFueS13aWRlIChhZHZpc29yPW51bGwpID4gbm8gaG91cnMKLy8vIEhhbGYtZGF5IHB1YmxpYyBob2xpZGF5cyBvbmx5IGJsb2NrIHRoZSBob2xpZGF5IGhvdXJzLCBub3QgdGhlIGVudGlyZSBkYXkuCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBHZXRBdmFpbGFibGVTbG90c01hcHBpbmcgOiBTY3JpcHRCYXNlLCBJTWFwcGluZwp7CiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gSW5wdXRIYW5kbGVyKFdvcmtmbG93VGFzayB0YXNrLCBTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdmFyIHNlcnZpY2VUYXNrID0gdGFzayBhcyBEYXByU2VydmljZVRhc2s7CiAgICAgICAgaWYgKHNlcnZpY2VUYXNrID09IG51bGwpCiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUYXNrIG11c3QgYmUgYSBEYXByU2VydmljZVRhc2siKTsKCiAgICAgICAgdmFyIGFwcElkID0gR2V0Q29uZmlnVmFsdWUoIkRBUFJfQVBQX0lEIik7CiAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShhcHBJZCkpCiAgICAgICAgICAgIHNlcnZpY2VUYXNrLlNldEFwcElkKGFwcElkKTsKCiAgICAgICAgdmFyIGFkdmlzb3JJZCA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siYWR2aXNvcklkIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgdmFyIGRhdGUgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImRhdGUiXT8uVG9TdHJpbmcoKTsKCiAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZSkpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAidmFsaWRhdGlvbi1lcnJvciIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAiYWR2aXNvcklkIGFuZCBkYXRlIGFyZSByZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gIlZBTElEQVRJT05fRVJST1IiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlcXVlc3RlZERhdGUgPSBEYXRlVGltZS5QYXJzZShkYXRlKTsKICAgICAgICB2YXIgdHogPSBSZXNvbHZlVGltZVpvbmUoY29udGV4dCk7CiAgICAgICAgdmFyIHRvZGF5SW5CdXNpbmVzc1R6ID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhEYXRlVGltZS5VdGNOb3csIHR6KS5EYXRlOwogICAgICAgIGlmIChyZXF1ZXN0ZWREYXRlLkRhdGUgPCB0b2RheUluQnVzaW5lc3NUeikKICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJEYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdC4iLCAiZGF0ZSIpOwoKICAgICAgICB2YXIgZmlsdGVySnNvbiA9CiAgICAgICAgICAgICJ7XCJhbmRcIjpbIiArCiAgICAgICAgICAgICJ7XCJvclwiOlt7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiY29tcGxldGVcIn19LHtcImN1cnJlbnRTdGF0ZVwiOntcImVxXCI6XCJjb21wbGV0ZS13aXRoLXRyYW5zZmVyXCJ9fV19LCIgKwogICAgICAgICAgICAie1wib3JcIjpbIiArCiAgICAgICAgICAgICAgICAie1wiYXR0cmlidXRlc1wiOntcImFkdmlzb3JcIjp7XCJlcVwiOlwiIiArIGFkdmlzb3JJZCArICJcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWJzZW5jZVR5cGVcIjp7XCJlcVwiOlwicHVibGljLWhvbGlkYXlcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWJzZW5jZVR5cGVcIjp7XCJlcVwiOlwid29ya2luZy1ob3Vycy1jaGFuZ2VcIn19fSIgKwogICAgICAgICAgICAiXX0iICsKICAgICAgICAgICAgIl19IjsKCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IExpc3Q8c3RyaW5nPgogICAgICAgIHsKICAgICAgICAgICAgInBhZ2VTaXplPTEwMCIsCiAgICAgICAgICAgICQiZmlsdGVyPXtmaWx0ZXJKc29ufSIKICAgICAgICB9OwoKICAgICAgICBzZXJ2aWNlVGFzay5TZXRRdWVyeVN0cmluZyhzdHJpbmcuSm9pbigiJiIsIHF1ZXJ5UGFyYW1zKSk7CgogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBhZHZpc29ySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImFkdmlzb3JJZCJdPy5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZGF0ZVN0ciA9IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siZGF0ZSJdPy5Ub1N0cmluZygpOwogICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBHZXRBcHBvaW50bWVudER1cmF0aW9uKGNvbnRleHQpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkgfHwgc3RyaW5nLklzTnVsbE9yRW1wdHkoZGF0ZVN0cikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInZhbGlkYXRpb24tZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gImFkdmlzb3JJZCBhbmQgZGF0ZSBhcmUgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiVkFMSURBVElPTl9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmlzb3JJZCwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGRhdGVTdHIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlcXVlc3RlZERhdGUgPSBEYXRlVGltZS5QYXJzZShkYXRlU3RyKTsKICAgICAgICAgICAgdmFyIGRheU9mV2VlayA9IHJlcXVlc3RlZERhdGUuRGF5T2ZXZWVrLlRvU3RyaW5nKCkuVG9Mb3dlcigpOwoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gY29udGV4dC5Cb2R5OwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvclR5cGUgPSBDbGFzc2lmeVNlcnZpY2VFcnJvcihyZXNwb25zZT8uZXJyb3JNZXNzYWdlPy5Ub1N0cmluZygpID8/ICIiKTsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZSA9IGVycm9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUluZm8gPSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWQgPSByZXNwb25zZT8ubWV0YWRhdGE/LmFwcElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHJlc3BvbnNlPy5tZXRhZGF0YT8ubWV0aG9kTmFtZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBWZXJiID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5odHRwVmVyYj8uVG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhOwogICAgICAgICAgICB2YXIgaXRlbXMgPSByZXNwb25zZURhdGE/Lml0ZW1zOwoKICAgICAgICAgICAgdmFyIGluc3RhbmNlcyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgIGlmIChpdGVtcyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBpdGVtcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXMuQWRkKGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcHVibGljSG9saWRheXMgPSBuZXcgTGlzdDxkeW5hbWljPigpOwogICAgICAgICAgICB2YXIgYWR2aXNvcldvcmtpbmdIb3VycyA9IG5ldyBMaXN0PGR5bmFtaWM+KCk7CiAgICAgICAgICAgIHZhciBjb21wYW55V29ya2luZ0hvdXJzID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKICAgICAgICAgICAgdmFyIHBlcnNvbmFsTGVhdmVzID0gbmV3IExpc3Q8ZHluYW1pYz4oKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpbnN0YW5jZSBpbiBpbnN0YW5jZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gaW5zdGFuY2U/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICB2YXIgYWJzZW5jZVR5cGUgPSBhdHRyaWJ1dGVzPy5hYnNlbmNlVHlwZT8uVG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIHZhciBhZHZpc29yID0gSGFzUHJvcGVydHkoYXR0cmlidXRlcywgImFkdmlzb3IiKSA/IGF0dHJpYnV0ZXM/LmFkdmlzb3I/LlRvU3RyaW5nKCkgOiBudWxsOwoKICAgICAgICAgICAgICAgIHN3aXRjaCAoYWJzZW5jZVR5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicHVibGljLWhvbGlkYXkiOgogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNIb2xpZGF5cy5BZGQoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ3b3JraW5nLWhvdXJzLWNoYW5nZSI6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoYWR2aXNvcikgJiYgYWR2aXNvciA9PSBhZHZpc29ySWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZpc29yV29ya2luZ0hvdXJzLkFkZChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueVdvcmtpbmdIb3Vycy5BZGQoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJwZXJzb25hbC1sZWF2ZSIgd2hlbiBhZHZpc29yID09IGFkdmlzb3JJZDoKICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYWxMZWF2ZXMuQWRkKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicmV6ZXJ2YXRpb24iIHdoZW4gYWR2aXNvciA9PSBhZHZpc29ySWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFsTGVhdmVzLkFkZChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgdHogPSBSZXNvbHZlVGltZVpvbmUoY29udGV4dCk7CiAgICAgICAgICAgIHZhciB1bmF2YWlsYWJsZVJhbmdlcyA9IEdldFVuYXZhaWxhYmxlUmFuZ2VzKHBlcnNvbmFsTGVhdmVzLCByZXF1ZXN0ZWREYXRlLCB0eik7CgogICAgICAgICAgICAvLyBIYWxmLWRheSAvIGZ1bGwtZGF5IHB1YmxpYyBob2xpZGF5IGhhbmRsaW5nCiAgICAgICAgICAgIHZhciBob2xpZGF5UmFuZ2VzID0gR2V0SG9saWRheVJhbmdlcyhwdWJsaWNIb2xpZGF5cywgcmVxdWVzdGVkRGF0ZSwgdHopOwogICAgICAgICAgICBpZiAoaG9saWRheVJhbmdlcyAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaG9saWRheVJhbmdlcy5Db3VudCA9PSAxCiAgICAgICAgICAgICAgICAgICAgJiYgaG9saWRheVJhbmdlc1swXS5JdGVtMSA9PSBUaW1lU3Bhbi5aZXJvCiAgICAgICAgICAgICAgICAgICAgJiYgaG9saWRheVJhbmdlc1swXS5JdGVtMiA+PSBuZXcgVGltZVNwYW4oMjMsIDU5LCAwKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gInB1YmxpYy1ob2xpZGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IG5ldyB7IGF2YWlsYWJsZVNsb3RzID0gbmV3IExpc3Q8c3RyaW5nPigpIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiaG9saWRheSIgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlUmFuZ2VzLkFkZFJhbmdlKGhvbGlkYXlSYW5nZXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBXb3JraW5nIGhvdXJzIHByaW9yaXR5OiBhZHZpc29yLXNwZWNpZmljID4gY29tcGFueS13aWRlCiAgICAgICAgICAgIHZhciB3b3JraW5nSG91cnMgPSBHZXRXb3JraW5nSG91cnNGb3JEYXkoYWR2aXNvcldvcmtpbmdIb3VycywgZGF5T2ZXZWVrKTsKICAgICAgICAgICAgaWYgKHdvcmtpbmdIb3VycyA9PSBudWxsIHx8IHdvcmtpbmdIb3Vycy5Db3VudCA9PSAwKQogICAgICAgICAgICAgICAgd29ya2luZ0hvdXJzID0gR2V0V29ya2luZ0hvdXJzRm9yRGF5KGNvbXBhbnlXb3JraW5nSG91cnMsIGRheU9mV2Vlayk7CgogICAgICAgICAgICBpZiAod29ya2luZ0hvdXJzID09IG51bGwgfHwgd29ya2luZ0hvdXJzLkNvdW50ID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gIm5vLXdvcmtpbmctaG91cnMiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcgeyBhdmFpbGFibGVTbG90cyA9IG5ldyBMaXN0PHN0cmluZz4oKSB9LAogICAgICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiY2xvc2VkIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGF2YWlsYWJsZVNsb3RzID0gQ2FsY3VsYXRlQXZhaWxhYmxlU2xvdHMod29ya2luZ0hvdXJzLCB1bmF2YWlsYWJsZVJhbmdlcywgZHVyYXRpb24pOwogICAgICAgICAgICBhdmFpbGFibGVTbG90cyA9IEZpbHRlclNsb3RzRXhjbHVkaW5nUGFzdEZvckJ1c2luZXNzVG9kYXkoYXZhaWxhYmxlU2xvdHMsIHJlcXVlc3RlZERhdGUsIHR6KTsKCiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJhdmFpbGFibGUtc2xvdHMtc3VjY2VzcyIsCiAgICAgICAgICAgICAgICBEYXRhID0gbmV3IHsgYXZhaWxhYmxlU2xvdHMgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiYXZhaWxhYmlsaXR5IiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAib3V0cHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAjcmVnaW9uIEhlbHBlciBNZXRob2RzCgogICAgcHJpdmF0ZSBzdHJpbmcgQ2xhc3NpZnlTZXJ2aWNlRXJyb3Ioc3RyaW5nIGVycm9yTWVzc2FnZSkKICAgIHsKICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvbnRhaW5zKCJ0aW1lb3V0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAidGltZW91dCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygidW5hdXRob3JpemVkIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAiYXV0aGVudGljYXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImZvcmJpZGRlbiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gImF1dGhvcml6YXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoIm5vdCBmb3VuZCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gIm5vdC1mb3VuZCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygic2VydmljZSB1bmF2YWlsYWJsZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gInNlcnZpY2UtdW5hdmFpbGFibGUiOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKICAgICAgICAgICAgcmV0dXJuICJjb25uZWN0aW9uLWVycm9yIjsKCiAgICAgICAgcmV0dXJuICJnZW5lcmFsLWVycm9yIjsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gSUFOQSBpZCAoZS5nLiBFdXJvcGUvSXN0YW5idWwpIG9yIFdpbmRvd3MgaWQgKFR1cmtleSBTdGFuZGFyZCBUaW1lKS4gUXVlcnkgb3ZlcnJpZGVzIGNvbmZpZy4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwcml2YXRlIFRpbWVab25lSW5mbyBSZXNvbHZlVGltZVpvbmUoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgewogICAgICAgIHN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGNvbnRleHQ/LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidGltZVpvbmUiKSkKICAgICAgICAgICAgICAgIGlkID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbInRpbWVab25lIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidGltZXpvbmUiKSkKICAgICAgICAgICAgICAgIGlkID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbInRpbWV6b25lIl0/LlRvU3RyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShpZCkpCiAgICAgICAgICAgIGlkID0gR2V0Q29uZmlnVmFsdWUoIkFwcG9pbnRtZW50czpUaW1lWm9uZSIpID8/IEdldENvbmZpZ1ZhbHVlKCJBUFBPSU5UTUVOVF9USU1FWk9ORSIpOwoKICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShpZCkpCiAgICAgICAgICAgIGlkID0gIkV1cm9wZS9Jc3RhbmJ1bCI7CgogICAgICAgIHJldHVybiBGaW5kVGltZVpvbmVCeUlkKGlkLlRyaW0oKSk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIExpbnV4L21hY09TOiBJQU5BIGlkcyAoRXVyb3BlL0lzdGFuYnVsKS4gV2luZG93czogb2Z0ZW4gVHVya2V5IFN0YW5kYXJkIFRpbWUuCiAgICAvLy8gVHJpZXMgYWxpYXNlcywgdGhlbiBmaXhlZCBVVEMrMyBmb3IgVHVya2V5IChubyBEU1Qgc2luY2UgMjAxNikgaWYgc3lzdGVtIERCIGhhcyBuZWl0aGVyLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIHByaXZhdGUgRGF0ZVRpbWUgUGFyc2VUb1V0YyhzdHJpbmcgZGF0ZVN0cikKICAgIHsKICAgICAgICB2YXIgZHRvID0gRGF0ZVRpbWVPZmZzZXQuUGFyc2UoZGF0ZVN0ciwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAgICAgICAgcmV0dXJuIGR0by5VdGNEYXRlVGltZTsKICAgIH0KCiAgICBwcml2YXRlIFRpbWVab25lSW5mbyBGaW5kVGltZVpvbmVCeUlkKHN0cmluZyBpZCkKICAgIHsKICAgICAgICBmb3JlYWNoICh2YXIgY2FuZGlkYXRlIGluIEdldFRpbWVab25lSWRDYW5kaWRhdGVzKGlkKSkKICAgICAgICB7CiAgICAgICAgICAgIHRyeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gVGltZVpvbmVJbmZvLkZpbmRTeXN0ZW1UaW1lWm9uZUJ5SWQoY2FuZGlkYXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoVGltZVpvbmVOb3RGb3VuZEV4Y2VwdGlvbikKICAgICAgICAgICAgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkVGltZVpvbmVFeGNlcHRpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKElzVHVya2V5VGltZVpvbmVJZChpZCkpCiAgICAgICAgICAgIHJldHVybiBDcmVhdGVUdXJrZXlGaXhlZFV0Y1BsdXMzVGltZVpvbmUoKTsKCiAgICAgICAgdGhyb3cgbmV3IFRpbWVab25lTm90Rm91bmRFeGNlcHRpb24oJCJUaW1lIHpvbmUgSUQgJ3tpZH0nIHdhcyBub3QgZm91bmQgb24gdGhpcyBzeXN0ZW0uIik7CiAgICB9CgogICAgcHJpdmF0ZSBJRW51bWVyYWJsZTxzdHJpbmc+IEdldFRpbWVab25lSWRDYW5kaWRhdGVzKHN0cmluZyBpZCkKICAgIHsKICAgICAgICB5aWVsZCByZXR1cm4gaWQ7CgogICAgICAgIGlmIChzdHJpbmcuRXF1YWxzKGlkLCAiRXVyb3BlL0lzdGFuYnVsIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgewogICAgICAgICAgICB5aWVsZCByZXR1cm4gIlR1cmtleSBTdGFuZGFyZCBUaW1lIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3RyaW5nLkVxdWFscyhpZCwgIlR1cmtleSBTdGFuZGFyZCBUaW1lIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgewogICAgICAgICAgICB5aWVsZCByZXR1cm4gIkV1cm9wZS9Jc3RhbmJ1bCI7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbCBJc1R1cmtleVRpbWVab25lSWQoc3RyaW5nIGlkKQogICAgewogICAgICAgIHJldHVybiBzdHJpbmcuRXF1YWxzKGlkLCAiRXVyb3BlL0lzdGFuYnVsIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkKICAgICAgICAgICAgfHwgc3RyaW5nLkVxdWFscyhpZCwgIlR1cmtleSBTdGFuZGFyZCBUaW1lIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSk7CiAgICB9CgogICAgLy8vIDxzdW1tYXJ5PkZpeGVkIFVUQyszOyBtYXRjaGVzIFR1cmtleSB3YWxsIHRpbWUgc2luY2UgMjAxNiAoRFNUIGFib2xpc2hlZCkuPC9zdW1tYXJ5PgogICAgcHJpdmF0ZSBUaW1lWm9uZUluZm8gQ3JlYXRlVHVya2V5Rml4ZWRVdGNQbHVzM1RpbWVab25lKCkKICAgIHsKICAgICAgICByZXR1cm4gVGltZVpvbmVJbmZvLkNyZWF0ZUN1c3RvbVRpbWVab25lKAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsLUZhbGxiYWNrIiwKICAgICAgICAgICAgVGltZVNwYW4uRnJvbUhvdXJzKDMpLAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsIChVVEMrMykiLAogICAgICAgICAgICAiRXVyb3BlL0lzdGFuYnVsIChVVEMrMykiKTsKICAgIH0KCiAgICBwcml2YXRlIGludCBHZXRBcHBvaW50bWVudER1cmF0aW9uKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICBjb25zdCBpbnQgZGVmYXVsdER1cmF0aW9uID0gMzA7CgogICAgICAgIGlmIChjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAiZHVyYXRpb24iKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkdXJhdGlvblBhcmFtID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnNbImR1cmF0aW9uIl07CiAgICAgICAgICAgIGludCBxdWVyeUR1cmF0aW9uID0gMDsKICAgICAgICAgICAgaWYgKGR1cmF0aW9uUGFyYW0gIT0gbnVsbCAmJiBpbnQuVHJ5UGFyc2UoZHVyYXRpb25QYXJhbS5Ub1N0cmluZygpLCBvdXQgcXVlcnlEdXJhdGlvbikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeUR1cmF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29uZmlnRHVyYXRpb24gPSBHZXRDb25maWdWYWx1ZSgiQXBwb2ludG1lbnRzOkRlZmF1bHREdXJhdGlvbiIpOwogICAgICAgIGludCBjb25maWdEdXJhdGlvblZhbHVlID0gMDsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNvbmZpZ0R1cmF0aW9uKSAmJiBpbnQuVHJ5UGFyc2UoY29uZmlnRHVyYXRpb24sIG91dCBjb25maWdEdXJhdGlvblZhbHVlKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBjb25maWdEdXJhdGlvblZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGRlZmF1bHREdXJhdGlvbjsKICAgIH0KCiAgICAjZW5kcmVnaW9uCgogICAgI3JlZ2lvbiBCdXNpbmVzcyBMb2dpYyBNZXRob2RzCgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFJldHVybnMgdW5hdmFpbGFibGUgdGltZSByYW5nZXMgZm9yIHB1YmxpYyBob2xpZGF5cyBvbiB0aGUgcmVxdWVzdGVkIGRhdGUuCiAgICAvLy8gbnVsbCA9IG5vIGhvbGlkYXkgb24gdGhpcyBkYXRlLgogICAgLy8vIEZ1bGwtZGF5IGhvbGlkYXk6IHNpbmdsZSByYW5nZSAwMDowMC0yMzo1OS4KICAgIC8vLyBIYWxmLWRheSBob2xpZGF5OiBwYXJ0aWFsIHJhbmdlIChlLmcuLCAwMDowMC0xMzowMCkuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgcHJpdmF0ZSBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+IEdldEhvbGlkYXlSYW5nZXMoTGlzdDxkeW5hbWljPiBob2xpZGF5cywgRGF0ZVRpbWUgZGF0ZSwgVGltZVpvbmVJbmZvIHR6KQogICAgewogICAgICAgIHZhciByYW5nZXMgPSBuZXcgTGlzdDxUdXBsZTxUaW1lU3BhbiwgVGltZVNwYW4+PigpOwogICAgICAgIGJvb2wgaGFzSG9saWRheSA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICh2YXIgaG9saWRheSBpbiBob2xpZGF5cykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBob2xpZGF5RGF0YSA9IGhvbGlkYXk/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGlmIChob2xpZGF5RGF0YSA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgIHN0cmluZyBzdGFydERhdGVUaW1lU3RyID0gbnVsbDsKICAgICAgICAgICAgc3RyaW5nIGVuZERhdGVUaW1lU3RyID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShob2xpZGF5RGF0YSwgInN0YXJ0RGF0ZVRpbWUiKSAmJiBob2xpZGF5RGF0YS5zdGFydERhdGVUaW1lICE9IG51bGwpCiAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lU3RyID0gaG9saWRheURhdGEuc3RhcnREYXRlVGltZS5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKEhhc1Byb3BlcnR5KGhvbGlkYXlEYXRhLCAiZW5kRGF0ZVRpbWUiKSAmJiBob2xpZGF5RGF0YS5lbmREYXRlVGltZSAhPSBudWxsKQogICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWVTdHIgPSBob2xpZGF5RGF0YS5lbmREYXRlVGltZS5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHN0YXJ0RGF0ZVRpbWVTdHIpIHx8IHN0cmluZy5Jc051bGxPckVtcHR5KGVuZERhdGVUaW1lU3RyKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVRpbWUgPSBUaW1lWm9uZUluZm8uQ29udmVydFRpbWVGcm9tVXRjKFBhcnNlVG9VdGMoc3RhcnREYXRlVGltZVN0ciksIHR6KTsKICAgICAgICAgICAgdmFyIGVuZERhdGVUaW1lID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhQYXJzZVRvVXRjKGVuZERhdGVUaW1lU3RyKSwgdHopOwoKICAgICAgICAgICAgaWYgKGRhdGUuRGF0ZSA8IHN0YXJ0RGF0ZVRpbWUuRGF0ZSB8fCBkYXRlLkRhdGUgPiBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBoYXNIb2xpZGF5ID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmIChzdGFydERhdGVUaW1lLkRhdGUgIT0gZW5kRGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGRhdGUuRGF0ZSA9PSBzdGFydERhdGVUaW1lLkRhdGUpCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoc3RhcnREYXRlVGltZS5UaW1lT2ZEYXksIG5ldyBUaW1lU3BhbigyMywgNTksIDU5KSkpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0ZS5EYXRlID09IGVuZERhdGVUaW1lLkRhdGUpCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoVGltZVNwYW4uWmVybywgZW5kRGF0ZVRpbWUuVGltZU9mRGF5KSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLkFkZChUdXBsZS5DcmVhdGUoVGltZVNwYW4uWmVybywgbmV3IFRpbWVTcGFuKDIzLCA1OSwgNTkpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByYW5nZXMuQWRkKFR1cGxlLkNyZWF0ZShzdGFydERhdGVUaW1lLlRpbWVPZkRheSwgZW5kRGF0ZVRpbWUuVGltZU9mRGF5KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBoYXNIb2xpZGF5ID8gcmFuZ2VzIDogbnVsbDsKICAgIH0KCiAgICBwcml2YXRlIExpc3Q8b2JqZWN0PiBHZXRXb3JraW5nSG91cnNGb3JEYXkoTGlzdDxkeW5hbWljPiB3b3JraW5nSG91cnNDaGFuZ2VzLCBzdHJpbmcgZGF5T2ZXZWVrKQogICAgewogICAgICAgIGZvcmVhY2ggKHZhciBjaGFuZ2UgaW4gd29ya2luZ0hvdXJzQ2hhbmdlcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGFuZ2VEYXRhID0gY2hhbmdlPy5hdHRyaWJ1dGVzOwogICAgICAgICAgICBpZiAoY2hhbmdlRGF0YSA9PSBudWxsKSBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBjdXN0b21XSCA9IGNoYW5nZURhdGE/LmN1c3RvbVdvcmtpbmdIb3VyczsKICAgICAgICAgICAgaWYgKGN1c3RvbVdIID09IG51bGwpIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIGRheUhvdXJzID0gR2V0RGF5SG91cnNGcm9tQ3VzdG9tKGN1c3RvbVdILCBkYXlPZldlZWspOwogICAgICAgICAgICBpZiAoZGF5SG91cnMgIT0gbnVsbCkgcmV0dXJuIGRheUhvdXJzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBMaXN0PG9iamVjdD4gR2V0RGF5SG91cnNGcm9tQ3VzdG9tKGR5bmFtaWMgY3VzdG9tV0gsIHN0cmluZyBkYXlPZldlZWspCiAgICB7CiAgICAgICAgZHluYW1pYyBkYXlIb3VycyA9IG51bGw7CiAgICAgICAgc3dpdGNoIChkYXlPZldlZWspCiAgICAgICAgewogICAgICAgICAgICBjYXNlICJtb25kYXkiOiBkYXlIb3VycyA9IGN1c3RvbVdIPy5tb25kYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJ0dWVzZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8udHVlc2RheTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIndlZG5lc2RheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LndlZG5lc2RheTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInRodXJzZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8udGh1cnNkYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJmcmlkYXkiOiBkYXlIb3VycyA9IGN1c3RvbVdIPy5mcmlkYXk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJzYXR1cmRheSI6IGRheUhvdXJzID0gY3VzdG9tV0g/LnNhdHVyZGF5OyBicmVhazsKICAgICAgICAgICAgY2FzZSAic3VuZGF5IjogZGF5SG91cnMgPSBjdXN0b21XSD8uc3VuZGF5OyBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChkYXlIb3VycyA9PSBudWxsKSByZXR1cm4gbnVsbDsKCiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0PG9iamVjdD4oKTsKICAgICAgICBmb3JlYWNoICh2YXIgcmFuZ2UgaW4gZGF5SG91cnMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc3RhcnQgPSByYW5nZT8uc3RhcnQ/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIHZhciBlbmQgPSByYW5nZT8uZW5kPy5Ub1N0cmluZygpOwogICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHN0YXJ0KSAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0LkFkZChuZXcgeyBzdGFydCwgZW5kIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQuQ291bnQgPiAwID8gcmVzdWx0IDogbnVsbDsKICAgIH0KCiAgICBwcml2YXRlIExpc3Q8VHVwbGU8VGltZVNwYW4sIFRpbWVTcGFuPj4gR2V0VW5hdmFpbGFibGVSYW5nZXMoTGlzdDxkeW5hbWljPiBwZXJzb25hbExlYXZlcywgRGF0ZVRpbWUgZGF0ZSwgVGltZVpvbmVJbmZvIHR6KQogICAgewogICAgICAgIHZhciByYW5nZXMgPSBuZXcgTGlzdDxUdXBsZTxUaW1lU3BhbiwgVGltZVNwYW4+PigpOwoKICAgICAgICBmb3JlYWNoICh2YXIgbGVhdmUgaW4gcGVyc29uYWxMZWF2ZXMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbGVhdmVEYXRhID0gbGVhdmU/LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGlmIChsZWF2ZURhdGEgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICBzdHJpbmcgc3RhcnREYXRlVGltZVN0ciA9IG51bGw7CiAgICAgICAgICAgIHN0cmluZyBlbmREYXRlVGltZVN0ciA9IG51bGw7CgogICAgICAgICAgICBpZiAoSGFzUHJvcGVydHkobGVhdmVEYXRhLCAic3RhcnREYXRlVGltZSIpICYmIGxlYXZlRGF0YS5zdGFydERhdGVUaW1lICE9IG51bGwpCiAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lU3RyID0gbGVhdmVEYXRhLnN0YXJ0RGF0ZVRpbWUuVG9TdHJpbmcoKTsKCiAgICAgICAgICAgIGlmIChIYXNQcm9wZXJ0eShsZWF2ZURhdGEsICJlbmREYXRlVGltZSIpICYmIGxlYXZlRGF0YS5lbmREYXRlVGltZSAhPSBudWxsKQogICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWVTdHIgPSBsZWF2ZURhdGEuZW5kRGF0ZVRpbWUuVG9TdHJpbmcoKTsKCiAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShzdGFydERhdGVUaW1lU3RyKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmREYXRlVGltZVN0cikpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBzdGFydERhdGVUaW1lID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhQYXJzZVRvVXRjKHN0YXJ0RGF0ZVRpbWVTdHIpLCB0eik7CiAgICAgICAgICAgIHZhciBlbmREYXRlVGltZSA9IFRpbWVab25lSW5mby5Db252ZXJ0VGltZUZyb21VdGMoUGFyc2VUb1V0YyhlbmREYXRlVGltZVN0ciksIHR6KTsKCiAgICAgICAgICAgIGlmIChkYXRlLkRhdGUgPCBzdGFydERhdGVUaW1lLkRhdGUgfHwgZGF0ZS5EYXRlID4gZW5kRGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZVRpbWUuRGF0ZSAhPSBlbmREYXRlVGltZS5EYXRlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZGF0ZS5EYXRlID09IHN0YXJ0RGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgICAgICAgICByYW5nZXMuQWRkKFR1cGxlLkNyZWF0ZShzdGFydERhdGVUaW1lLlRpbWVPZkRheSwgbmV3IFRpbWVTcGFuKDIzLCA1OSwgNTkpKSk7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRlLkRhdGUgPT0gZW5kRGF0ZVRpbWUuRGF0ZSkKICAgICAgICAgICAgICAgICAgICByYW5nZXMuQWRkKFR1cGxlLkNyZWF0ZShUaW1lU3Bhbi5aZXJvLCBlbmREYXRlVGltZS5UaW1lT2ZEYXkpKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICByYW5nZXMuQWRkKFR1cGxlLkNyZWF0ZShUaW1lU3Bhbi5aZXJvLCBuZXcgVGltZVNwYW4oMjMsIDU5LCA1OSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJhbmdlcy5BZGQoVHVwbGUuQ3JlYXRlKHN0YXJ0RGF0ZVRpbWUuVGltZU9mRGF5LCBlbmREYXRlVGltZS5UaW1lT2ZEYXkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJhbmdlczsKICAgIH0KCiAgICBwcml2YXRlIExpc3Q8c3RyaW5nPiBDYWxjdWxhdGVBdmFpbGFibGVTbG90cyhMaXN0PG9iamVjdD4gd29ya2luZ0hvdXJzLCBMaXN0PFR1cGxlPFRpbWVTcGFuLCBUaW1lU3Bhbj4+IHVuYXZhaWxhYmxlUmFuZ2VzLCBpbnQgZHVyYXRpb25NaW51dGVzKQogICAgewogICAgICAgIHZhciBzbG90cyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKICAgICAgICB2YXIgZHVyYXRpb24gPSBUaW1lU3Bhbi5Gcm9tTWludXRlcyhkdXJhdGlvbk1pbnV0ZXMpOwoKICAgICAgICBmb3JlYWNoICh2YXIgd2ggaW4gd29ya2luZ0hvdXJzKQogICAgICAgIHsKICAgICAgICAgICAgZHluYW1pYyB3aER5biA9IHdoOwogICAgICAgICAgICB2YXIgc3RhcnRTdHIgPSB3aER5bj8uc3RhcnQ/LlRvU3RyaW5nKCk7CiAgICAgICAgICAgIHZhciBlbmRTdHIgPSB3aER5bj8uZW5kPy5Ub1N0cmluZygpOwoKICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHN0YXJ0U3RyKSB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eShlbmRTdHIpKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICB2YXIgd2hTdGFydCA9IFRpbWVTcGFuLlBhcnNlKHN0YXJ0U3RyKTsKICAgICAgICAgICAgdmFyIHdoRW5kID0gVGltZVNwYW4uUGFyc2UoZW5kU3RyKTsKCiAgICAgICAgICAgIGlmICh3aFN0YXJ0ID09IHdoRW5kKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICB2YXIgY3VycmVudCA9IHdoU3RhcnQ7CiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICsgZHVyYXRpb24gPD0gd2hFbmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBzbG90U3RhcnQgPSBjdXJyZW50OwogICAgICAgICAgICAgICAgdmFyIHNsb3RFbmQgPSBjdXJyZW50ICsgZHVyYXRpb247CgogICAgICAgICAgICAgICAgYm9vbCBpc0F2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdXIgaW4gdW5hdmFpbGFibGVSYW5nZXMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNsb3RTdGFydCA8IHVyLkl0ZW0yICYmIHNsb3RFbmQgPiB1ci5JdGVtMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXNBdmFpbGFibGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2xvdHMuQWRkKCQie3Nsb3RTdGFydDpoaFxcOm1tfS17c2xvdEVuZDpoaFxcOm1tfSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50ICsgZHVyYXRpb247CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzbG90czsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gV2hlbiB0aGUgcmVxdWVzdGVkIGNhbGVuZGFyIGRheSBlcXVhbHMgInRvZGF5IiBpbiB0aGUgYnVzaW5lc3MgdGltZXpvbmUsIGRyb3Agc2xvdHMgd2hvc2UKICAgIC8vLyBsb2NhbCBzdGFydCB0aW1lIGlzIG5vdCBhZnRlciAibm93IiBpbiB0aGF0IHRpbWV6b25lLiBTbG90IHN0cmluZ3MgbWF0Y2ggd29ya2luZyBob3VycyAod2FsbCBjbG9jayBpbiB0aGF0IFRaKS4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwcml2YXRlIExpc3Q8c3RyaW5nPiBGaWx0ZXJTbG90c0V4Y2x1ZGluZ1Bhc3RGb3JCdXNpbmVzc1RvZGF5KExpc3Q8c3RyaW5nPiBzbG90cywgRGF0ZVRpbWUgcmVxdWVzdGVkRGF0ZSwgVGltZVpvbmVJbmZvIHR6KQogICAgewogICAgICAgIGlmIChzbG90cyA9PSBudWxsIHx8IHNsb3RzLkNvdW50ID09IDApCiAgICAgICAgICAgIHJldHVybiBzbG90cyA/PyBuZXcgTGlzdDxzdHJpbmc+KCk7CgogICAgICAgIHZhciBub3dJblR6ID0gVGltZVpvbmVJbmZvLkNvbnZlcnRUaW1lRnJvbVV0YyhEYXRlVGltZS5VdGNOb3csIHR6KTsKICAgICAgICBpZiAocmVxdWVzdGVkRGF0ZS5EYXRlICE9IG5vd0luVHouRGF0ZSkKICAgICAgICAgICAgcmV0dXJuIHNsb3RzOwoKICAgICAgICB2YXIgZmlsdGVyZWQgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CiAgICAgICAgdmFyIGRheVN0YXJ0TG9jYWwgPSBuZXcgRGF0ZVRpbWUocmVxdWVzdGVkRGF0ZS5ZZWFyLCByZXF1ZXN0ZWREYXRlLk1vbnRoLCByZXF1ZXN0ZWREYXRlLkRheSwgMCwgMCwgMCwgRGF0ZVRpbWVLaW5kLlVuc3BlY2lmaWVkKTsKCiAgICAgICAgZm9yZWFjaCAodmFyIHMgaW4gc2xvdHMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShzKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHBhcnRzID0gcy5TcGxpdChuZXdbXSB7ICctJyB9LCAyLCBTdHJpbmdTcGxpdE9wdGlvbnMuTm9uZSk7CiAgICAgICAgICAgIGlmIChwYXJ0cy5MZW5ndGggIT0gMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmlsdGVyZWQuQWRkKHMpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghVGltZVNwYW4uVHJ5UGFyc2UocGFydHNbMF0uVHJpbSgpLCBvdXQgdmFyIHN0YXJ0VHMpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5BZGQocyk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHNsb3RTdGFydExvY2FsID0gZGF5U3RhcnRMb2NhbC5BZGQoc3RhcnRUcyk7CiAgICAgICAgICAgIGlmIChzbG90U3RhcnRMb2NhbCA+IG5vd0luVHopCiAgICAgICAgICAgICAgICBmaWx0ZXJlZC5BZGQocyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CiAgICB9CgogICAgI2VuZHJlZ2lvbgp9Cg=="
27
27
  }
28
28
  }
29
29
  }
@@ -29,7 +29,7 @@
29
29
  ### Get Chat Rooms by User - Lists all permanent chat rooms for a user
30
30
  # Flow-level function (scope: F) on chat-room workflow.
31
31
  # Returns rooms array with instanceKey, user, advisorType, advisorId, roomId, currentState.
32
- GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/chat-room/functions/get-chat-rooms?user={{user}}&pageSize=1
32
+ GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-chat-rooms?user={{user}}&pageSize=1
33
33
  Accept: application/json
34
34
  Accept-Language: tr-TR
35
35
  X-Request-Id: {{$guid}}
@@ -40,7 +40,7 @@ X-Request-Id: {{$guid}}
40
40
 
41
41
  ### Get Chat Rooms by Advisor - Lists all chat rooms for an advisor
42
42
  # Flow-level function (scope: F) on chat-room workflow.
43
- GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/chat-room/functions/get-chat-rooms?advisor={{advisor}}&pageSize=1
43
+ GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-chat-rooms?advisor={{advisor}}&pageSize=1
44
44
  Accept: application/json
45
45
  Accept-Language: tr-TR
46
46
  X-Request-Id: {{$guid}}
@@ -50,13 +50,13 @@ X-Request-Id: {{$guid}}
50
50
  ###############################################################################
51
51
 
52
52
  ### Get Chat Rooms by User (permanent only)
53
- GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/chat-room/functions/get-chat-rooms?user={{user}}&roomType=permanent&pageSize=1
53
+ GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-chat-rooms?user={{user}}&roomType=permanent&pageSize=1
54
54
  Accept: application/json
55
55
  Accept-Language: tr-TR
56
56
  X-Request-Id: {{$guid}}
57
57
 
58
58
  ### Get Chat Rooms by User (rezervation only)
59
- GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/workflows/chat-room/functions/get-chat-rooms?user={{user}}&roomType=rezervation&pageSize=1
59
+ GET {{baseUrl}}/api/v{{apiVersion}}/{{domain}}/functions/get-chat-rooms?user={{user}}&roomType=rezervation&pageSize=1
60
60
  Accept: application/json
61
61
  Accept-Language: tr-TR
62
62
  X-Request-Id: {{$guid}}
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "mapping": {
21
21
  "location": "./src/GetRezervationsMapping.csx",
22
- "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QXZhaWxhYmxlU2xvdHNUYXNrIChEYXByU2VydmljZVRhc2sgLSBUeXBlIDMpCi8vLyBRdWVyaWVzIGFic2VuY2UtZW50cnkgd29ya2Zsb3cgdmlhIERhcHIgc2VydmljZSBpbnZvY2F0aW9uIHRvIGdldCBwdWJsaWMgaG9saWRheXMsIAovLy8gd29ya2luZyBob3VycyBjaGFuZ2VzLCBhbmQgcGVyc29uYWwgbGVhdmVzLgovLy8gVGhlbiBjYWxjdWxhdGVzIGF2YWlsYWJsZSBhcHBvaW50bWVudCBzbG90cyBmb3IgdGhlIGdpdmVuIGFkdmlzb3IgYW5kIGRhdGUuCi8vLyAKLy8vIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL2J1cmdhbi10ZWNoL3ZuZXh0LXJ1bnRpbWUvYmxvYi9tYWluL2RvYy9lbi9mbG93L3Rhc2tzL2RhcHItc2VydmljZS5tZAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0UmV6ZXJ2YXRpb25zTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYXBwSWQgPSBHZXRDb25maWdWYWx1ZSgiREFQUl9BUFBfSUQiKTsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFwcElkKSkKICAgICAgICAgICAgc2VydmljZVRhc2suU2V0QXBwSWQoYXBwSWQpOwoKICAgICAgICAvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBxdWVyeSBzdHJpbmcgKEdFVCByZXF1ZXN0KQogICAgICAgIHZhciBhZHZpc29ySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAiYWR2aXNvcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImFkdmlzb3JJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciB1c2VySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidXNlcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bInVzZXJJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBtYW5hZ2VySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAibWFuYWdlcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bIm1hbmFnZXJJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBzdGFydERhdGUgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAic3RhcnREYXRlIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bInN0YXJ0RGF0ZSJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBlbmREYXRlID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCAmJiBIYXNQcm9wZXJ0eShjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycywgImVuZERhdGUiKSA/IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siZW5kRGF0ZSJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwoKICAgICAgICAvLyBCdWlsZCBmaWx0ZXIgY29uZGl0aW9ucwogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwoKICAgICAgICAvLyBDdXJyZW50U3RhdGUgaW4gKCJhY3RpdmUiLCAiY2FuLXN0YXJ0LW1lZXRpbmciLCAiYWNjZXB0LXRlcm1zIikKICAgICAgICBjb25kaXRpb25zLkFkZCgKICAgICAgICAgICAgIntcIm9yXCI6WyIgKwogICAgICAgICAgICAie1wiY3VycmVudFN0YXRlXCI6e1wiZXFcIjpcImFjdGl2ZVwifX0sIiArCiAgICAgICAgICAgICJ7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiaW4tbWVldFwifX0sIiArCiAgICAgICAgICAgICJ7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiYWNjZXB0LXRlcm1zXCJ9fSIgKwogICAgICAgICAgICAiXX0iKTsKCiAgICAgICAgLy8gU3RhdHVzID0gIkEiCiAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcInN0YXR1c1wiOntcImVxXCI6XCJBXCJ9fSIpOwoKICAgICAgICAvLyBDb25kaXRpb25hbDogYWR2aXNvciBmaWx0ZXIg4oCUIHByaW1hcnkgYWR2aXNvciBPUiB2aWRlb0NhbGxVcmxUb0FkZCBtYXAgaGFzIGFuIGVudHJ5IGZvciB0aGlzIGFkdmlzb3IgaWQKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXNjYXBlZEFkdmlzb3JJZCA9IGFkdmlzb3JJZC5SZXBsYWNlKCJcXCIsICJcXFxcIikuUmVwbGFjZSgiXCIiLCAiXFxcIiIpOwogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgKICAgICAgICAgICAgICAgICJ7XCJvclwiOlsiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWR2aXNvclwiOntcImVxXCI6XCIiICsgZXNjYXBlZEFkdmlzb3JJZCArICJcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1widmlkZW9DYWxsVXJsVG9BZGQuIiArIGVzY2FwZWRBZHZpc29ySWQgKyAiXCI6e1wiaXNOdWxsXCI6ZmFsc2V9fX0iICsKICAgICAgICAgICAgICAgICJdfSIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29uZGl0aW9uYWw6IHVzZXIgZmlsdGVyCiAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh1c2VySWQpKQogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcInVzZXJcIjp7XCJlcVwiOlwiIiArIHVzZXJJZCArICJcIn19fSIpOwoKICAgICAgICAvLyBDb25kaXRpb25hbDogbWFuYWdlciBmaWx0ZXIKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG1hbmFnZXJJZCkpCiAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJhdHRyaWJ1dGVzXCI6e1wibWFuYWdlclwiOntcImVxXCI6XCIiICsgbWFuYWdlcklkICsgIlwifX19Iik7CgogICAgICAgIC8vIENvbmRpdGlvbmFsOiBzdGFydERhdGUgZmlsdGVyIChhdHRyaWJ1dGVzLnN0YXJ0RGF0ZVRpbWUgPj0gc3RhcnREYXRlKQogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSkKICAgICAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcImF0dHJpYnV0ZXNcIjp7XCJzdGFydERhdGVUaW1lXCI6e1wiZGd0XCI6XCIiICsgc3RhcnREYXRlICsgIlwifX19Iik7CgogICAgICAgIC8vIENvbmRpdGlvbmFsOiBlbmREYXRlIGZpbHRlciAoYXR0cmlidXRlcy5lbmREYXRlVGltZSA8PSBlbmREYXRlKQogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZSkpCiAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJhdHRyaWJ1dGVzXCI6e1wiZW5kRGF0ZVRpbWVcIjp7XCJkbHRcIjpcIiIgKyBlbmREYXRlICsgIlwifX19Iik7CgogICAgICAgIHZhciBmaWx0ZXJKc29uID0gIntcImFuZFwiOlsiICsgc3RyaW5nLkpvaW4oIiwiLCBjb25kaXRpb25zKSArICJdfSI7CgogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBMaXN0PHN0cmluZz57CiAgICAgICAgICAgICJwYWdlU2l6ZT0xMDAiLAogICAgICAgICAgICAkImZpbHRlcj17ZmlsdGVySnNvbn0iCiAgICAgICAgfTsKICAgICAgICBMb2dFcnJvcigiVGVzdCBxdWVyeSBwYXJhbXM6ICIrc3RyaW5nLkpvaW4oIiYiLCBxdWVyeVBhcmFtcykpOwogICAgICAgIHNlcnZpY2VUYXNrLlNldFF1ZXJ5U3RyaW5nKHN0cmluZy5Kb2luKCImIiwgcXVlcnlQYXJhbXMpKTsKICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgVGFzazxTY3JpcHRSZXNwb25zZT4gT3V0cHV0SGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBjb250ZXh0LkJvZHk7CgogICAgICAgICAgICAvLyBDaGVjayBpZiBzZXJ2aWNlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5pc1N1Y2Nlc3MgPT0gZmFsc2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlcnJvclR5cGUgPSBDbGFzc2lmeVNlcnZpY2VFcnJvcihyZXNwb25zZT8uZXJyb3JNZXNzYWdlPy5Ub1N0cmluZygpID8/ICIiKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSA9ICJzZXJ2aWNlLWVycm9yIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0gbmV3CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJGYWlsZWQgdG8gZmV0Y2ggYWJzZW5jZSBlbnRyaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID0gIlNFUlZJQ0VfRVJST1IiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvclR5cGUgPSBlcnJvclR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvID0gbmV3CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElkID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5hcHBJZD8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSByZXNwb25zZT8ubWV0YWRhdGE/Lm1ldGhvZE5hbWU/LlRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwVmVyYiA9IHJlc3BvbnNlPy5tZXRhZGF0YT8uaHR0cFZlcmI/LlRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFwcG9pbnRtZW50cyIsICJlcnJvciIgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEdldCBpdGVtcyBmcm9tIHNlcnZpY2UgcmVzcG9uc2UKICAgICAgICAgICAgLy8gUmVzcG9uc2Ugc3RydWN0dXJlOiB7IGRhdGE6IHsgaXRlbXM6IFsuLi5dIH0sIGlzU3VjY2VzczogdHJ1ZSwgLi4uIH0KICAgICAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhOwogICAgICAgICAgICB2YXIgaXRlbXMgPSByZXNwb25zZURhdGE/Lml0ZW1zOwoKICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0gInJlemVydmF0aW9ucy1zdWNjZXNzIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpdGVtcwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiYXZhaWxhYmlsaXR5IiwgInN1Y2Nlc3MiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAib3V0cHV0LWVycm9yIiwKICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9ICJJbnRlcm5hbCBwcm9jZXNzaW5nIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiUFJPQ0VTU0lOR19FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXNjcmlwdGlvbiA9IGV4Lk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAjcmVnaW9uIEhlbHBlciBNZXRob2RzCgogICAgcHJpdmF0ZSBzdHJpbmcgQ2xhc3NpZnlTZXJ2aWNlRXJyb3Ioc3RyaW5nIGVycm9yTWVzc2FnZSkKICAgIHsKICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvbnRhaW5zKCJ0aW1lb3V0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAidGltZW91dCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygidW5hdXRob3JpemVkIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAiYXV0aGVudGljYXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImZvcmJpZGRlbiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gImF1dGhvcml6YXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoIm5vdCBmb3VuZCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gIm5vdC1mb3VuZCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygic2VydmljZSB1bmF2YWlsYWJsZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gInNlcnZpY2UtdW5hdmFpbGFibGUiOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKICAgICAgICAgICAgcmV0dXJuICJjb25uZWN0aW9uLWVycm9yIjsKCiAgICAgICAgcmV0dXJuICJnZW5lcmFsLWVycm9yIjsKICAgIH0KCiAgICAjZW5kcmVnaW9uCn0K"
22
+ "code": "dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CnVzaW5nIEJCVC5Xb3JrZmxvdy5EZWZpbml0aW9uczsKLy8vIDxzdW1tYXJ5PgovLy8gTWFwcGluZyBmb3IgR2V0QXZhaWxhYmxlU2xvdHNUYXNrIChEYXByU2VydmljZVRhc2sgLSBUeXBlIDMpCi8vLyBRdWVyaWVzIGFic2VuY2UtZW50cnkgd29ya2Zsb3cgdmlhIERhcHIgc2VydmljZSBpbnZvY2F0aW9uIHRvIGdldCBwdWJsaWMgaG9saWRheXMsIAovLy8gd29ya2luZyBob3VycyBjaGFuZ2VzLCBhbmQgcGVyc29uYWwgbGVhdmVzLgovLy8gVGhlbiBjYWxjdWxhdGVzIGF2YWlsYWJsZSBhcHBvaW50bWVudCBzbG90cyBmb3IgdGhlIGdpdmVuIGFkdmlzb3IgYW5kIGRhdGUuCi8vLyAKLy8vIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL2J1cmdhbi10ZWNoL3ZuZXh0LXJ1bnRpbWUvYmxvYi9tYWluL2RvYy9lbi9mbG93L3Rhc2tzL2RhcHItc2VydmljZS5tZAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgY2xhc3MgR2V0UmV6ZXJ2YXRpb25zTWFwcGluZyA6IFNjcmlwdEJhc2UsIElNYXBwaW5nCnsKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgc2VydmljZVRhc2sgPSB0YXNrIGFzIERhcHJTZXJ2aWNlVGFzazsKICAgICAgICBpZiAoc2VydmljZVRhc2sgPT0gbnVsbCkKICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRhc2sgbXVzdCBiZSBhIERhcHJTZXJ2aWNlVGFzayIpOwoKICAgICAgICB2YXIgYXBwSWQgPSBHZXRDb25maWdWYWx1ZSgiREFQUl9BUFBfSUQiKTsKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFwcElkKSkKICAgICAgICAgICAgc2VydmljZVRhc2suU2V0QXBwSWQoYXBwSWQpOwoKICAgICAgICAvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBxdWVyeSBzdHJpbmcgKEdFVCByZXF1ZXN0KQogICAgICAgIHZhciBhZHZpc29ySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAiYWR2aXNvcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bImFkdmlzb3JJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciB1c2VySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAidXNlcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bInVzZXJJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBtYW5hZ2VySWQgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAibWFuYWdlcklkIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bIm1hbmFnZXJJZCJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBzdGFydERhdGUgPSBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycyAhPSBudWxsICYmIEhhc1Byb3BlcnR5KGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzLCAic3RhcnREYXRlIikgPyBjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycz9bInN0YXJ0RGF0ZSJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwogICAgICAgIHZhciBlbmREYXRlID0gY29udGV4dC5RdWVyeVBhcmFtZXRlcnMgIT0gbnVsbCAmJiBIYXNQcm9wZXJ0eShjb250ZXh0LlF1ZXJ5UGFyYW1ldGVycywgImVuZERhdGUiKSA/IGNvbnRleHQuUXVlcnlQYXJhbWV0ZXJzP1siZW5kRGF0ZSJdPy5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwoKICAgICAgICAvLyBCdWlsZCBmaWx0ZXIgY29uZGl0aW9ucwogICAgICAgIHZhciBjb25kaXRpb25zID0gbmV3IExpc3Q8c3RyaW5nPigpOwoKICAgICAgICAvLyBDdXJyZW50U3RhdGUgaW4gKCJhY3RpdmUiLCAiY2FuLXN0YXJ0LW1lZXRpbmciLCAiYWNjZXB0LXRlcm1zIikKICAgICAgICBjb25kaXRpb25zLkFkZCgKICAgICAgICAgICAgIntcIm9yXCI6WyIgKwogICAgICAgICAgICAie1wiY3VycmVudFN0YXRlXCI6e1wiZXFcIjpcImFjdGl2ZVwifX0sIiArCiAgICAgICAgICAgICJ7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiaW4tbWVldFwifX0sIiArCiAgICAgICAgICAgICJ7XCJjdXJyZW50U3RhdGVcIjp7XCJlcVwiOlwiYWNjZXB0LXRlcm1zXCJ9fSIgKwogICAgICAgICAgICAiXX0iKTsKCiAgICAgICAgLy8gU3RhdHVzID0gIkEiCiAgICAgICAgY29uZGl0aW9ucy5BZGQoIntcInN0YXR1c1wiOntcImVxXCI6XCJBXCJ9fSIpOwoKICAgICAgICAvLyBDb25kaXRpb25hbDogYWR2aXNvciBmaWx0ZXIg4oCUIHByaW1hcnkgYWR2aXNvciBPUiB2aWRlb0NhbGxVcmxUb0FkZCBtYXAgaGFzIGFuIGVudHJ5IGZvciB0aGlzIGFkdmlzb3IgaWQKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGFkdmlzb3JJZCkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZXNjYXBlZEFkdmlzb3JJZCA9IGFkdmlzb3JJZC5SZXBsYWNlKCJcXCIsICJcXFxcIikuUmVwbGFjZSgiXCIiLCAiXFxcIiIpOwogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgKICAgICAgICAgICAgICAgICJ7XCJvclwiOlsiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1wiYWR2aXNvclwiOntcImVxXCI6XCIiICsgZXNjYXBlZEFkdmlzb3JJZCArICJcIn19fSwiICsKICAgICAgICAgICAgICAgICJ7XCJhdHRyaWJ1dGVzXCI6e1widmlkZW9DYWxsVXJsVG9BZGQuIiArIGVzY2FwZWRBZHZpc29ySWQgKyAiXCI6e1wiaXNOdWxsXCI6ZmFsc2V9fX0iICsKICAgICAgICAgICAgICAgICJdfSIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29uZGl0aW9uYWw6IHVzZXIgZmlsdGVyCiAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh1c2VySWQpKQogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcInVzZXJcIjp7XCJlcVwiOlwiIiArIHVzZXJJZCArICJcIn19fSIpOwoKICAgICAgICAvLyBDb25kaXRpb25hbDogbWFuYWdlciBmaWx0ZXIKICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG1hbmFnZXJJZCkpCiAgICAgICAgICAgIGNvbmRpdGlvbnMuQWRkKCJ7XCJhdHRyaWJ1dGVzXCI6e1wibWFuYWdlclwiOntcImVxXCI6XCIiICsgbWFuYWdlcklkICsgIlwifX19Iik7CgogICAgICAgIC8vIENvbmRpdGlvbmFsOiBzdGFydERhdGUgZmlsdGVyIChhdHRyaWJ1dGVzLnN0YXJ0RGF0ZVRpbWUgPj0gc3RhcnREYXRlKQogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoc3RhcnREYXRlKSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBub3JtYWxpemVkU3RhcnQgPSBOb3JtYWxpemVUb1V0Y1N0cmluZyhzdGFydERhdGUpOwogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcInN0YXJ0RGF0ZVRpbWVcIjp7XCJkZ3RcIjpcIiIgKyBub3JtYWxpemVkU3RhcnQgKyAiXCJ9fX0iKTsKICAgICAgICB9CgogICAgICAgIC8vIENvbmRpdGlvbmFsOiBlbmREYXRlIGZpbHRlciAoYXR0cmlidXRlcy5lbmREYXRlVGltZSA8PSBlbmREYXRlKQogICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZW5kRGF0ZSkpCiAgICAgICAgewogICAgICAgICAgICB2YXIgbm9ybWFsaXplZEVuZCA9IE5vcm1hbGl6ZVRvVXRjU3RyaW5nKGVuZERhdGUpOwogICAgICAgICAgICBjb25kaXRpb25zLkFkZCgie1wiYXR0cmlidXRlc1wiOntcImVuZERhdGVUaW1lXCI6e1wiZGx0XCI6XCIiICsgbm9ybWFsaXplZEVuZCArICJcIn19fSIpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGZpbHRlckpzb24gPSAie1wiYW5kXCI6WyIgKyBzdHJpbmcuSm9pbigiLCIsIGNvbmRpdGlvbnMpICsgIl19IjsKCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IExpc3Q8c3RyaW5nPnsKICAgICAgICAgICAgInBhZ2VTaXplPTEwMCIsCiAgICAgICAgICAgICQiZmlsdGVyPXtmaWx0ZXJKc29ufSIKICAgICAgICB9OwogICAgICAgIExvZ0Vycm9yKCJUZXN0IHF1ZXJ5IHBhcmFtczogIitzdHJpbmcuSm9pbigiJiIsIHF1ZXJ5UGFyYW1zKSk7CiAgICAgICAgc2VydmljZVRhc2suU2V0UXVlcnlTdHJpbmcoc3RyaW5nLkpvaW4oIiYiLCBxdWVyeVBhcmFtcykpOwogICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlKCkpOwogICAgfQoKICAgIHB1YmxpYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBPdXRwdXRIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGNvbnRleHQuQm9keTsKCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHNlcnZpY2UgY2FsbCB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzU3VjY2VzcyA9PSBmYWxzZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVycm9yVHlwZSA9IENsYXNzaWZ5U2VydmljZUVycm9yKHJlc3BvbnNlPy5lcnJvck1lc3NhZ2U/LlRvU3RyaW5nKCkgPz8gIiIpOwoKICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0gInNlcnZpY2UtZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSBuZXcKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkZhaWxlZCB0byBmZXRjaCBhYnNlbmNlIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSAiU0VSVklDRV9FUlJPUiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZSA9IGVycm9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2U/LmVycm9yTWVzc2FnZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUluZm8gPSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWQgPSByZXNwb25zZT8ubWV0YWRhdGE/LmFwcElkPy5Ub1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHJlc3BvbnNlPy5tZXRhZGF0YT8ubWV0aG9kTmFtZT8uVG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBWZXJiID0gcmVzcG9uc2U/Lm1ldGFkYXRhPy5odHRwVmVyYj8uVG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUYWdzID0gbmV3W10geyAiYXBwb2ludG1lbnRzIiwgImVycm9yIiB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gR2V0IGl0ZW1zIGZyb20gc2VydmljZSByZXNwb25zZQogICAgICAgICAgICAvLyBSZXNwb25zZSBzdHJ1Y3R1cmU6IHsgZGF0YTogeyBpdGVtczogWy4uLl0gfSwgaXNTdWNjZXNzOiB0cnVlLCAuLi4gfQogICAgICAgICAgICB2YXIgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2U/LmRhdGE7CiAgICAgICAgICAgIHZhciBpdGVtcyA9IHJlc3BvbnNlRGF0YT8uaXRlbXM7CgogICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5ldyBTY3JpcHRSZXNwb25zZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPSAicmV6ZXJ2YXRpb25zLXN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGl0ZW1zCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVGFncyA9IG5ld1tdIHsgImFwcG9pbnRtZW50cyIsICJhdmFpbGFiaWxpdHkiLCAic3VjY2VzcyIgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9ICJvdXRwdXQtZXJyb3IiLAogICAgICAgICAgICAgICAgRGF0YSA9IG5ldwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVycm9yID0gIkludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IiLAogICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9ICJQUk9DRVNTSU5HX0VSUk9SIiwKICAgICAgICAgICAgICAgICAgICBlcnJvckRlc2NyaXB0aW9uID0gZXguTWVzc2FnZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhZ3MgPSBuZXdbXSB7ICJhcHBvaW50bWVudHMiLCAiZXJyb3IiIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgICNyZWdpb24gSGVscGVyIE1ldGhvZHMKCiAgICBwcml2YXRlIHN0cmluZyBOb3JtYWxpemVUb1V0Y1N0cmluZyhzdHJpbmcgZGF0ZVN0cikKICAgIHsKICAgICAgICBpZiAoRGF0ZVRpbWVPZmZzZXQuVHJ5UGFyc2UoZGF0ZVN0ciwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwKICAgICAgICAgICAgU3lzdGVtLkdsb2JhbGl6YXRpb24uRGF0ZVRpbWVTdHlsZXMuTm9uZSwgb3V0IHZhciBkdG8pKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGR0by5VdGNEYXRlVGltZS5Ub1N0cmluZygieXl5eS1NTS1kZFRISDptbTpzc1oiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGVTdHI7CiAgICB9CgogICAgcHJpdmF0ZSBzdHJpbmcgQ2xhc3NpZnlTZXJ2aWNlRXJyb3Ioc3RyaW5nIGVycm9yTWVzc2FnZSkKICAgIHsKICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLkNvbnRhaW5zKCJ0aW1lb3V0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAidGltZW91dCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygidW5hdXRob3JpemVkIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCiAgICAgICAgICAgIHJldHVybiAiYXV0aGVudGljYXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImZvcmJpZGRlbiIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gImF1dGhvcml6YXRpb24iOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoIm5vdCBmb3VuZCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gIm5vdC1mb3VuZCI7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5Db250YWlucygic2VydmljZSB1bmF2YWlsYWJsZSIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKQogICAgICAgICAgICByZXR1cm4gInNlcnZpY2UtdW5hdmFpbGFibGUiOwogICAgICAgIGlmIChlcnJvck1lc3NhZ2UuQ29udGFpbnMoImNvbm5lY3Rpb24iLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkKICAgICAgICAgICAgcmV0dXJuICJjb25uZWN0aW9uLWVycm9yIjsKCiAgICAgICAgcmV0dXJuICJnZW5lcmFsLWVycm9yIjsKICAgIH0KCiAgICAjZW5kcmVnaW9uCn0K"
23
23
  }
24
24
  }
25
25
  }
@@ -147,8 +147,8 @@ public class GetAbsenceEntryMapping : ScriptBase, IMapping
147
147
  {
148
148
  DateTime startDateFilter = default;
149
149
  DateTime endDateFilter = default;
150
- bool hasStartFilter = !string.IsNullOrEmpty(startDateStr) && DateTime.TryParse(startDateStr, out startDateFilter);
151
- bool hasEndFilter = !string.IsNullOrEmpty(endDateStr) && DateTime.TryParse(endDateStr, out endDateFilter);
150
+ bool hasStartFilter = !string.IsNullOrEmpty(startDateStr) && TryParseToUtc(startDateStr, out startDateFilter);
151
+ bool hasEndFilter = !string.IsNullOrEmpty(endDateStr) && TryParseToUtc(endDateStr, out endDateFilter);
152
152
 
153
153
  var filteredItems = new List<dynamic>();
154
154
  foreach (dynamic item in items)
@@ -161,8 +161,8 @@ public class GetAbsenceEntryMapping : ScriptBase, IMapping
161
161
 
162
162
  DateTime itemStart = default;
163
163
  DateTime itemEnd = default;
164
- bool parsedStart = !string.IsNullOrEmpty(itemStartStr) && DateTime.TryParse(itemStartStr, out itemStart);
165
- bool parsedEnd = !string.IsNullOrEmpty(itemEndStr) && DateTime.TryParse(itemEndStr, out itemEnd);
164
+ bool parsedStart = !string.IsNullOrEmpty(itemStartStr) && TryParseToUtc(itemStartStr, out itemStart);
165
+ bool parsedEnd = !string.IsNullOrEmpty(itemEndStr) && TryParseToUtc(itemEndStr, out itemEnd);
166
166
 
167
167
  bool include = true;
168
168
 
@@ -215,6 +215,20 @@ public class GetAbsenceEntryMapping : ScriptBase, IMapping
215
215
  }
216
216
  }
217
217
 
218
+ private bool TryParseToUtc(string dateStr, out DateTime utcDateTime)
219
+ {
220
+ utcDateTime = default;
221
+ if (string.IsNullOrEmpty(dateStr)) return false;
222
+ if (DateTimeOffset.TryParse(dateStr,
223
+ System.Globalization.CultureInfo.InvariantCulture,
224
+ System.Globalization.DateTimeStyles.None, out var dto))
225
+ {
226
+ utcDateTime = dto.UtcDateTime;
227
+ return true;
228
+ }
229
+ return false;
230
+ }
231
+
218
232
  private string ReadParam(ScriptContext context, string name)
219
233
  {
220
234
  if (context.QueryParameters == null || !HasProperty(context.QueryParameters, name))
@@ -45,13 +45,13 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
45
45
  var now = DateTime.UtcNow;
46
46
  if (period == "month")
47
47
  {
48
- startDate = startDate ?? now.AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ss");
49
- endDate = endDate ?? now.ToString("yyyy-MM-ddTHH:mm:ss");
48
+ startDate = startDate ?? now.AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ssZ");
49
+ endDate = endDate ?? now.ToString("yyyy-MM-ddTHH:mm:ssZ");
50
50
  }
51
51
  else
52
52
  {
53
- startDate = startDate ?? now.AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ss");
54
- endDate = endDate ?? now.ToString("yyyy-MM-ddTHH:mm:ss");
53
+ startDate = startDate ?? now.AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ssZ");
54
+ endDate = endDate ?? now.ToString("yyyy-MM-ddTHH:mm:ssZ");
55
55
  }
56
56
  }
57
57
 
@@ -108,8 +108,8 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
108
108
 
109
109
  DateTime filterStart = DateTime.MinValue;
110
110
  DateTime filterEnd = DateTime.MaxValue;
111
- if (!string.IsNullOrEmpty(startDate)) DateTime.TryParse(startDate, out filterStart);
112
- if (!string.IsNullOrEmpty(endDate)) DateTime.TryParse(endDate, out filterEnd);
111
+ if (!string.IsNullOrEmpty(startDate)) TryParseToUtc(startDate, out filterStart);
112
+ if (!string.IsNullOrEmpty(endDate)) TryParseToUtc(endDate, out filterEnd);
113
113
 
114
114
  if (items != null)
115
115
  {
@@ -122,7 +122,7 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
122
122
  if (string.IsNullOrEmpty(itemStartStr)) continue;
123
123
 
124
124
  DateTime itemStart;
125
- if (!DateTime.TryParse(itemStartStr, out itemStart)) continue;
125
+ if (!TryParseToUtc(itemStartStr, out itemStart)) continue;
126
126
 
127
127
  if (itemStart < filterStart || itemStart > filterEnd) continue;
128
128
 
@@ -138,7 +138,7 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
138
138
  if (!string.IsNullOrEmpty(itemEndStr))
139
139
  {
140
140
  DateTime itemEnd;
141
- if (DateTime.TryParse(itemEndStr, out itemEnd))
141
+ if (TryParseToUtc(itemEndStr, out itemEnd))
142
142
  totalDurationMinutes += (itemEnd - itemStart).TotalMinutes;
143
143
  }
144
144
  }
@@ -180,6 +180,20 @@ public class GetAdvisorStatsMapping : ScriptBase, IMapping
180
180
  }
181
181
  }
182
182
 
183
+ private bool TryParseToUtc(string dateStr, out DateTime utcDateTime)
184
+ {
185
+ utcDateTime = default;
186
+ if (string.IsNullOrEmpty(dateStr)) return false;
187
+ if (DateTimeOffset.TryParse(dateStr,
188
+ System.Globalization.CultureInfo.InvariantCulture,
189
+ System.Globalization.DateTimeStyles.None, out var dto))
190
+ {
191
+ utcDateTime = dto.UtcDateTime;
192
+ return true;
193
+ }
194
+ return false;
195
+ }
196
+
183
197
  private string ReadParam(ScriptContext context, string name)
184
198
  {
185
199
  if (context.QueryParameters == null || !HasProperty(context.QueryParameters, name))
@@ -164,10 +164,11 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
164
164
  }
165
165
  }
166
166
 
167
- var unavailableRanges = GetUnavailableRanges(personalLeaves, requestedDate);
167
+ var tz = ResolveTimeZone(context);
168
+ var unavailableRanges = GetUnavailableRanges(personalLeaves, requestedDate, tz);
168
169
 
169
170
  // Half-day / full-day public holiday handling
170
- var holidayRanges = GetHolidayRanges(publicHolidays, requestedDate);
171
+ var holidayRanges = GetHolidayRanges(publicHolidays, requestedDate, tz);
171
172
  if (holidayRanges != null)
172
173
  {
173
174
  if (holidayRanges.Count == 1
@@ -201,7 +202,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
201
202
  }
202
203
 
203
204
  var availableSlots = CalculateAvailableSlots(workingHours, unavailableRanges, duration);
204
- availableSlots = FilterSlotsExcludingPastForBusinessToday(availableSlots, requestedDate, ResolveTimeZone(context));
205
+ availableSlots = FilterSlotsExcludingPastForBusinessToday(availableSlots, requestedDate, tz);
205
206
 
206
207
  return Task.FromResult(new ScriptResponse
207
208
  {
@@ -273,7 +274,14 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
273
274
  /// Linux/macOS: IANA ids (Europe/Istanbul). Windows: often Turkey Standard Time.
274
275
  /// Tries aliases, then fixed UTC+3 for Turkey (no DST since 2016) if system DB has neither.
275
276
  /// </summary>
276
- private static TimeZoneInfo FindTimeZoneById(string id)
277
+ private DateTime ParseToUtc(string dateStr)
278
+ {
279
+ var dto = DateTimeOffset.Parse(dateStr,
280
+ System.Globalization.CultureInfo.InvariantCulture);
281
+ return dto.UtcDateTime;
282
+ }
283
+
284
+ private TimeZoneInfo FindTimeZoneById(string id)
277
285
  {
278
286
  foreach (var candidate in GetTimeZoneIdCandidates(id))
279
287
  {
@@ -295,7 +303,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
295
303
  throw new TimeZoneNotFoundException($"Time zone ID '{id}' was not found on this system.");
296
304
  }
297
305
 
298
- private static IEnumerable<string> GetTimeZoneIdCandidates(string id)
306
+ private IEnumerable<string> GetTimeZoneIdCandidates(string id)
299
307
  {
300
308
  yield return id;
301
309
 
@@ -309,14 +317,14 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
309
317
  }
310
318
  }
311
319
 
312
- private static bool IsTurkeyTimeZoneId(string id)
320
+ private bool IsTurkeyTimeZoneId(string id)
313
321
  {
314
322
  return string.Equals(id, "Europe/Istanbul", StringComparison.OrdinalIgnoreCase)
315
323
  || string.Equals(id, "Turkey Standard Time", StringComparison.OrdinalIgnoreCase);
316
324
  }
317
325
 
318
326
  /// <summary>Fixed UTC+3; matches Turkey wall time since 2016 (DST abolished).</summary>
319
- private static TimeZoneInfo CreateTurkeyFixedUtcPlus3TimeZone()
327
+ private TimeZoneInfo CreateTurkeyFixedUtcPlus3TimeZone()
320
328
  {
321
329
  return TimeZoneInfo.CreateCustomTimeZone(
322
330
  "Europe/Istanbul-Fallback",
@@ -359,7 +367,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
359
367
  /// Full-day holiday: single range 00:00-23:59.
360
368
  /// Half-day holiday: partial range (e.g., 00:00-13:00).
361
369
  /// </summary>
362
- private List<Tuple<TimeSpan, TimeSpan>> GetHolidayRanges(List<dynamic> holidays, DateTime date)
370
+ private List<Tuple<TimeSpan, TimeSpan>> GetHolidayRanges(List<dynamic> holidays, DateTime date, TimeZoneInfo tz)
363
371
  {
364
372
  var ranges = new List<Tuple<TimeSpan, TimeSpan>>();
365
373
  bool hasHoliday = false;
@@ -381,8 +389,8 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
381
389
  if (string.IsNullOrEmpty(startDateTimeStr) || string.IsNullOrEmpty(endDateTimeStr))
382
390
  continue;
383
391
 
384
- var startDateTime = DateTime.Parse(startDateTimeStr);
385
- var endDateTime = DateTime.Parse(endDateTimeStr);
392
+ var startDateTime = TimeZoneInfo.ConvertTimeFromUtc(ParseToUtc(startDateTimeStr), tz);
393
+ var endDateTime = TimeZoneInfo.ConvertTimeFromUtc(ParseToUtc(endDateTimeStr), tz);
386
394
 
387
395
  if (date.Date < startDateTime.Date || date.Date > endDateTime.Date)
388
396
  continue;
@@ -453,7 +461,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
453
461
  return result.Count > 0 ? result : null;
454
462
  }
455
463
 
456
- private List<Tuple<TimeSpan, TimeSpan>> GetUnavailableRanges(List<dynamic> personalLeaves, DateTime date)
464
+ private List<Tuple<TimeSpan, TimeSpan>> GetUnavailableRanges(List<dynamic> personalLeaves, DateTime date, TimeZoneInfo tz)
457
465
  {
458
466
  var ranges = new List<Tuple<TimeSpan, TimeSpan>>();
459
467
 
@@ -474,8 +482,8 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
474
482
  if (string.IsNullOrEmpty(startDateTimeStr) || string.IsNullOrEmpty(endDateTimeStr))
475
483
  continue;
476
484
 
477
- var startDateTime = DateTime.Parse(startDateTimeStr);
478
- var endDateTime = DateTime.Parse(endDateTimeStr);
485
+ var startDateTime = TimeZoneInfo.ConvertTimeFromUtc(ParseToUtc(startDateTimeStr), tz);
486
+ var endDateTime = TimeZoneInfo.ConvertTimeFromUtc(ParseToUtc(endDateTimeStr), tz);
479
487
 
480
488
  if (date.Date < startDateTime.Date || date.Date > endDateTime.Date)
481
489
  continue;
@@ -550,7 +558,7 @@ public class GetAvailableSlotsMapping : ScriptBase, IMapping
550
558
  /// When the requested calendar day equals "today" in the business timezone, drop slots whose
551
559
  /// local start time is not after "now" in that timezone. Slot strings match working hours (wall clock in that TZ).
552
560
  /// </summary>
553
- private static List<string> FilterSlotsExcludingPastForBusinessToday(List<string> slots, DateTime requestedDate, TimeZoneInfo tz)
561
+ private List<string> FilterSlotsExcludingPastForBusinessToday(List<string> slots, DateTime requestedDate, TimeZoneInfo tz)
554
562
  {
555
563
  if (slots == null || slots.Count == 0)
556
564
  return slots ?? new List<string>();
@@ -86,11 +86,17 @@ public class GetRezervationsMapping : ScriptBase, IMapping
86
86
 
87
87
  // Conditional: startDate filter (attributes.startDateTime >= startDate)
88
88
  if (!string.IsNullOrEmpty(startDate))
89
- conditions.Add("{\"attributes\":{\"startDateTime\":{\"dgt\":\"" + startDate + "\"}}}");
89
+ {
90
+ var normalizedStart = NormalizeToUtcString(startDate);
91
+ conditions.Add("{\"attributes\":{\"startDateTime\":{\"dgt\":\"" + normalizedStart + "\"}}}");
92
+ }
90
93
 
91
94
  // Conditional: endDate filter (attributes.endDateTime <= endDate)
92
95
  if (!string.IsNullOrEmpty(endDate))
93
- conditions.Add("{\"attributes\":{\"endDateTime\":{\"dlt\":\"" + endDate + "\"}}}");
96
+ {
97
+ var normalizedEnd = NormalizeToUtcString(endDate);
98
+ conditions.Add("{\"attributes\":{\"endDateTime\":{\"dlt\":\"" + normalizedEnd + "\"}}}");
99
+ }
94
100
 
95
101
  var filterJson = "{\"and\":[" + string.Join(",", conditions) + "]}";
96
102
 
@@ -167,6 +173,17 @@ public class GetRezervationsMapping : ScriptBase, IMapping
167
173
 
168
174
  #region Helper Methods
169
175
 
176
+ private string NormalizeToUtcString(string dateStr)
177
+ {
178
+ if (DateTimeOffset.TryParse(dateStr,
179
+ System.Globalization.CultureInfo.InvariantCulture,
180
+ System.Globalization.DateTimeStyles.None, out var dto))
181
+ {
182
+ return dto.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
183
+ }
184
+ return dateStr;
185
+ }
186
+
170
187
  private string ClassifyServiceError(string errorMessage)
171
188
  {
172
189
  if (errorMessage.Contains("timeout", StringComparison.OrdinalIgnoreCase))