@cartanova/qgrid-cli 2.6.1 → 2.6.4

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 (81) hide show
  1. package/README.ko.md +2 -0
  2. package/README.md +2 -0
  3. package/bundle/dist/application/qgrid/oauth.js +21 -3
  4. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +40 -6
  5. package/bundle/dist/application/qgrid/qgrid.frame.js +47 -19
  6. package/bundle/dist/application/qgrid/qgrid.types.js +13 -3
  7. package/bundle/dist/application/qgrid/token-death.js +77 -0
  8. package/bundle/dist/application/queries.generated.js +3 -2
  9. package/bundle/dist/application/request-log/request-log.model.js +105 -31
  10. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  11. package/bundle/dist/application/sonamu.generated.js +60 -5
  12. package/bundle/dist/application/sonamu.generated.sso.js +18 -2
  13. package/bundle/dist/application/token/token.model.js +53 -2
  14. package/bundle/dist/i18n/en.js +3 -1
  15. package/bundle/dist/i18n/ko.js +3 -1
  16. package/bundle/dist/i18n/sd.generated.js +18 -1
  17. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +49 -0
  18. package/bundle/dist/migrations/20260807145144_alter_request_logs_alter1.js +13 -0
  19. package/bundle/dist/migrations/20260807164057_alter_request_logs_alter1.js +13 -0
  20. package/bundle/dist/server-error-handler.js +5 -3
  21. package/bundle/dist/sonamu.config.js +5 -1
  22. package/bundle/dist/utils/providers/openai/openai-refresh.js +12 -1
  23. package/bundle/dist/utils/slack-notify.js +65 -0
  24. package/bundle/src/application/qgrid/oauth.ts +20 -1
  25. package/bundle/src/application/qgrid/qgrid-oauth-redirect.test.ts +15 -3
  26. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +30 -2
  27. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +44 -6
  28. package/bundle/src/application/qgrid/qgrid.frame.ts +67 -47
  29. package/bundle/src/application/qgrid/qgrid.types.ts +10 -0
  30. package/bundle/src/application/qgrid/token-death.test.ts +150 -0
  31. package/bundle/src/application/qgrid/token-death.ts +96 -0
  32. package/bundle/src/application/queries.generated.ts +5 -2
  33. package/bundle/src/application/request-log/request-log.entity.json +46 -7
  34. package/bundle/src/application/request-log/request-log.model.test.ts +153 -42
  35. package/bundle/src/application/request-log/request-log.model.ts +136 -50
  36. package/bundle/src/application/sonamu.generated.http +19 -1
  37. package/bundle/src/application/sonamu.generated.sso.ts +16 -0
  38. package/bundle/src/application/sonamu.generated.ts +58 -3
  39. package/bundle/src/application/token/token.model.test.ts +49 -0
  40. package/bundle/src/application/token/token.model.ts +75 -0
  41. package/bundle/src/i18n/en.ts +3 -0
  42. package/bundle/src/i18n/ko.ts +3 -0
  43. package/bundle/src/i18n/sd.generated.ts +17 -0
  44. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +110 -0
  45. package/bundle/src/migrations/20260807145144_alter_request_logs_alter1.ts +13 -0
  46. package/bundle/src/migrations/20260807164057_alter_request_logs_alter1.ts +13 -0
  47. package/bundle/src/server-error-handler.test.ts +58 -0
  48. package/bundle/src/server-error-handler.ts +16 -5
  49. package/bundle/src/sonamu.config.ts +6 -0
  50. package/bundle/src/utils/providers/openai/openai-refresh.ts +17 -0
  51. package/bundle/src/utils/slack-notify.test.ts +97 -0
  52. package/bundle/src/utils/slack-notify.ts +74 -0
  53. package/bundle/web-dist/client/assets/index-BGQSGMcK.css +1 -0
  54. package/bundle/web-dist/client/assets/index-CnNT0mdq.js +78 -0
  55. package/bundle/web-dist/client/assets/logs-DCY81UWb.js +1 -0
  56. package/bundle/web-dist/client/assets/{monit-CyqMmy1G.js → monit-D5OoAday.js} +1 -1
  57. package/bundle/web-dist/client/assets/routes-B4D9C86u.js +5 -0
  58. package/bundle/web-dist/client/assets/{sd.generated-CjW3rfJ8.js → sd.generated-DYdwSB2I.js} +1 -1
  59. package/bundle/web-dist/client/assets/{services.generated-BuT6Gp8V.js → services.generated-BsAvotjG.js} +1 -1
  60. package/bundle/web-dist/client/assets/{show-C5WxfoAt.js → show-BSX8ii7Z.js} +3 -3
  61. package/bundle/web-dist/client/assets/tokens-Gapk41cz.js +1 -0
  62. package/bundle/web-dist/client/assets/{use-update-token-mutation-DBkxL29Y.js → use-update-token-mutation-DqEpK7It.js} +1 -1
  63. package/bundle/web-dist/client/index.html +3 -3
  64. package/bundle/web-dist/server/assets/{lazyRouteComponent-PRxXWW3t.js → lazyRouteComponent-BaZaveNc.js} +1 -1
  65. package/bundle/web-dist/server/assets/{logs-D0z1Ghj1.js → logs-DMOw3SjD.js} +91 -42
  66. package/bundle/web-dist/server/assets/{monit-dBXxnAyI.js → monit-UmcqHroX.js} +2 -2
  67. package/bundle/web-dist/server/assets/{routes-B3p7fuwk.js → routes-Sv_4FjtH.js} +52 -46
  68. package/bundle/web-dist/server/assets/{sd.generated-ek-tz-7H.js → sd.generated-B0xqnHEo.js} +21 -0
  69. package/bundle/web-dist/server/assets/{services.generated-BNuxWs7K.js → services.generated-DqAKskAS.js} +23 -8
  70. package/bundle/web-dist/server/assets/{show-0iNioJ2I.js → show-C-oSdzHX.js} +31 -25
  71. package/bundle/web-dist/server/assets/{tokens-CvytQ9Xy.js → tokens-h-2A3wfD.js} +292 -191
  72. package/bundle/web-dist/server/assets/{use-update-token-mutation-BBCC2GKM.js → use-update-token-mutation-DHCaa7Ku.js} +1 -1
  73. package/bundle/web-dist/server/entry-server.generated.js +70 -29
  74. package/package.json +1 -1
  75. package/skills/qgrid/references/cli-env-and-server-boot.md +8 -0
  76. package/skills/qgrid/references/token-auth-quota-lifecycle.md +11 -0
  77. package/bundle/web-dist/client/assets/index-BGGBFmzE.js +0 -78
  78. package/bundle/web-dist/client/assets/index-GA9b-zy4.css +0 -1
  79. package/bundle/web-dist/client/assets/logs-Dh19u6Tk.js +0 -1
  80. package/bundle/web-dist/client/assets/routes-Cy0gCq8c.js +0 -5
  81. package/bundle/web-dist/client/assets/tokens-Ciolqw4l.js +0 -1
@@ -187,6 +187,23 @@ const entityLabels = {
187
187
  "entity.RequestLog.tool_call_count": "tool call 횟수",
188
188
  "entity.RequestLog.is_image_generation": "이미지 생성 turn 여부 (quota 귀속용)",
189
189
  "enum.RequestLogOrderBy.id-desc": "ID최신순",
190
+ "enum.RequestLogOrderBy.id-asc": "ID오래된순",
191
+ "enum.RequestLogOrderBy.created_at-desc": "등록일시최신순",
192
+ "enum.RequestLogOrderBy.created_at-asc": "등록일시오래된순",
193
+ "enum.RequestLogOrderBy.ttft_ms-desc": "TTFT긴순",
194
+ "enum.RequestLogOrderBy.ttft_ms-asc": "TTFT짧은순",
195
+ "enum.RequestLogOrderBy.duration_ms-desc": "소요시간긴순",
196
+ "enum.RequestLogOrderBy.duration_ms-asc": "소요시간짧은순",
197
+ "enum.RequestLogOrderBy.input_tokens-desc": "입력토큰많은순",
198
+ "enum.RequestLogOrderBy.input_tokens-asc": "입력토큰적은순",
199
+ "enum.RequestLogOrderBy.output_tokens-desc": "출력토큰많은순",
200
+ "enum.RequestLogOrderBy.output_tokens-asc": "출력토큰적은순",
201
+ "enum.RequestLogOrderBy.cache_read_tokens-desc": "캐시읽기많은순",
202
+ "enum.RequestLogOrderBy.cache_read_tokens-asc": "캐시읽기적은순",
203
+ "enum.RequestLogOrderBy.cache_creation_tokens-desc": "캐시생성많은순",
204
+ "enum.RequestLogOrderBy.cache_creation_tokens-asc": "캐시생성적은순",
205
+ "enum.RequestLogOrderBy.cost_usd-desc": "비용높은순",
206
+ "enum.RequestLogOrderBy.cost_usd-asc": "비용낮은순",
190
207
  "enum.RequestLogSearchField.id": "ID",
191
208
  "enum.RequestLogSearchField.token_name": "토큰이름",
192
209
  "enum.RequestLogSearchField.user_prompt": "사용자 프롬프트",
@@ -360,4 +377,4 @@ SD.enumLabels = (enumName) => {
360
377
  //#endregion
361
378
  export { SD, defineLocale, localizedColumn };
362
379
 
363
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QuZ2VuZXJhdGVkLmpzIiwibmFtZXMiOlsia28iLCJlbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pMThuL3NkLmdlbmVyYXRlZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBnZW5lcmF0ZWRcbiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlxuICovXG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtcblxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcImtvXCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9IFtcImtvXCIsIFwiZW5cIl0gYXMgY29uc3Q7XG5mdW5jdGlvbiBnZXRDdXJyZW50TG9jYWxlKCk6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0ge1xuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmV0dXJuIChjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID8/IERFRkFVTFRfTE9DQUxFO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cblxuaW1wb3J0IGVuIGZyb20gXCIuL2VuXCI7XG5pbXBvcnQga28gZnJvbSBcIi4va29cIjtcblxuLy8gcmVhY3QtY29tcG9uZW50cyBpMThuIGtleXNcbmNvbnN0IHJjS2V5c0tvID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwi66Gc65SpIOykkS4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIuyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLmFzeW5jU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gQ29tYm9ib3ggQ29tcG9uZW50XG4gIFwicmMuY29tYm9ib3gubm9SZXN1bHRzXCI6IFwi6rKA7IOJIOqysOqzvOqwgCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5jb21ib2JveC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIuyEoO2Dne2VmOyEuOyalC4uLlwiLFxuXG4gIC8vIERhdGVQaWNrZXIgQ29tcG9uZW50XG4gIFwicmMuZGF0ZVBpY2tlci5waWNrRGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVQaWNrZXIuc2VsZWN0RGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwi64Kg7KecIOy2lOqwgFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIuq4sOqwhFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcblxuICAvLyBGaWxlSW5wdXQgQ29tcG9uZW50XG4gIFwicmMuZmlsZUlucHV0LmJyb3dzZUZpbGVzXCI6IFwi7YyM7J28IOywvuq4sFwiLFxuICBcInJjLmZpbGVJbnB1dC5kcm9wWm9uZVwiOiBcIu2MjOydvOydhCDrk5zrnpjqt7jtlZjqsbDrgpgg7YG066at7ZWY7JesIOyXheuhnOuTnFwiLFxuICBcInJjLmZpbGVJbnB1dC5maWxlUGxhY2Vob2xkZXJcIjogXCLtjIzsnbxcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIuydtOuvuOyngFwiLFxuICBcInJjLmZpbGVJbnB1dC5tYXhGaWxlc0V4Y2VlZGVkXCI6IChtYXhGaWxlczogbnVtYmVyKSA9PlxuICAgIGDstZzrjIAgJHttYXhGaWxlc33qsJwg7YyM7J2866eMIOyXheuhnOuTnCDqsIDriqXtlanri4jri6RgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwi64yA6riwIOykkVwiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCLsoJzqsbBcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwi7JeF66Gc65OcIOyLpO2MqFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCLsl4XroZzrk5wg7KSRLi4uXCIsXG5cbiAgLy8gTW9udGhQaWNrZXJNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmFkZE1vbnRoXCI6IFwi7JuUIOy2lOqwgFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuZGF0ZVJhbmdlXCI6IFwi6riw6rCEXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwi7KKF66OM7J28XCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5wbGFjZWhvbGRlclwiOiBcIuyblCDshKDtg51cIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnN0YXJ0RGF0ZVwiOiBcIuyLnOyekeydvFwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwi7KCE7LK0IO2VtOygnFwiLFxuICBcInJjLm11bHRpU2VsZWN0LmNsb3NlXCI6IFwi64ur6riwXCIsXG4gIFwicmMubXVsdGlTZWxlY3QubW9yZUl0ZW1zXCI6IChjb3VudDogbnVtYmVyKSA9PiBgKyR7Y291bnR96rCcIOuNlOuztOq4sGAsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zXCI6IFwi7Ji17IWY7J20IOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm5vT3B0aW9uc1NlbGVjdGVkXCI6IFwi7ISg7YOd65CcIOyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR96rCcIOyYteyFmGAsXG4gIFwicmMubXVsdGlTZWxlY3Quc2VsZWN0QWxsXCI6IFwi7KCE7LK0IOyEoO2DnVwiLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gUGFnaW5hdGlvbiBDb21wb25lbnRcbiAgXCJyYy5wYWdpbmF0aW9uLm5leHRcIjogXCLri6TsnYxcIixcbiAgXCJyYy5wYWdpbmF0aW9uLnByZXZpb3VzXCI6IFwi7J207KCEXCIsXG4gIFwicmMucGFnaW5hdGlvbi5zaG93aW5nXCI6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT5cbiAgICBgJHt0b3RhbH3qsJwg7KSRICR7c3RhcnR9LSR7ZW5kfWAsXG5cbiAgLy8gQ2FsZW5kYXIgQ29tcG9uZW50XG4gIFwicmMuY2FsZW5kYXIubW9udGguMFwiOiBcIjHsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xXCI6IFwiMuyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCIz7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguM1wiOiBcIjTsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC40XCI6IFwiNeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjVcIjogXCI27JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguNlwiOiBcIjfsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC43XCI6IFwiOOyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCI57JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguOVwiOiBcIjEw7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguMTBcIjogXCIxMeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjExXCI6IFwiMTLsm5RcIixcblxuICAvLyBTb25hbXUgRmlsdGVyIENvbXBvbmVudFxuICBcInJjLnNvbmFtdUZpbHRlci50aXRsZVwiOiBcIuyGjOuCmOustCDtlYTthLBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbHlcIjogXCLsoIHsmqlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCLstIjquLDtmZRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYWRkUnVsZVwiOiBcIuq3nOy5mSDstpTqsIBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAn7JWE7KeBIOq3nOy5meydtCDsl4bsirXri4jri6QuIFwiKyDqt5zsuZkg7LaU6rCAXCLrpbwg7YG066at7ZWY7JesIOyLnOyeke2VmOyEuOyalC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIu2VhOuTnCDshKDtg51cIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc2VsZWN0T3BlcmF0b3JcIjogXCLsl7DsgrDsnpAg7ISg7YOdXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCLrqLzsoIAg7Jew7IKw7J6Q66W8IOyEoO2Dne2VmOyEuOyalFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlclZhbHVlXCI6IFwi6rCSIOyeheugpVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlck51bWJlclwiOiBcIuyIq+yekCDsnoXroKVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm90U3VwcG9ydGVkXCI6IFwi7KeA7JuQ7ZWY7KeAIOyViuydjFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zdGFydERhdGVcIjogXCLsi5zsnpHsnbxcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW5kRGF0ZVwiOiBcIuyiheujjOydvFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hcHBsaWVkRmlsdGVyc1wiOiBcIvCfjLIg7KCB7Jqp65CcIOyGjOuCmOustCDtlYTthLBcIixcblxuICAvLyBDb21tb25cbiAgXCJyYy5jb21tb24uY2FuY2VsXCI6IFwi7Leo7IaMXCIsXG4gIFwicmMuY29tbW9uLnNhdmVcIjogXCLsoIDsnqVcIixcbn07XG5cbmNvbnN0IHJjS2V5c0VuID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwiTG9hZGluZy4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIk5vIG9wdGlvbnNcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuYXN5bmNTZWxlY3Quc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBDb21ib2JveCBDb21wb25lbnRcbiAgXCJyYy5jb21ib2JveC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuY29tYm9ib3guc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBEYXRlUGlja2VyIENvbXBvbmVudFxuICBcInJjLmRhdGVQaWNrZXIucGlja0RhdGVcIjogXCJQaWNrIGRhdGVcIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVBpY2tlci5zZWxlY3REYXRlXCI6IFwiU2VsZWN0IGRhdGVcIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwiQWRkIGRhdGVcIixcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5kYXRlUmFuZ2VcIjogXCJSYW5nZVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVNlbGVjdG9yTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuXG4gIC8vIEZpbGVJbnB1dCBDb21wb25lbnRcbiAgXCJyYy5maWxlSW5wdXQuYnJvd3NlRmlsZXNcIjogXCJCcm93c2UgZmlsZXNcIixcbiAgXCJyYy5maWxlSW5wdXQuZHJvcFpvbmVcIjogXCJEcmFnIGZpbGVzIGhlcmUgb3IgY2xpY2sgdG8gdXBsb2FkXCIsXG4gIFwicmMuZmlsZUlucHV0LmZpbGVQbGFjZWhvbGRlclwiOiBcIkZpbGVcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIkltYWdlXCIsXG4gIFwicmMuZmlsZUlucHV0Lm1heEZpbGVzRXhjZWVkZWRcIjogKG1heEZpbGVzOiBudW1iZXIpID0+IGBNYXhpbXVtICR7bWF4RmlsZXN9IGZpbGVzIGFsbG93ZWRgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwiUGVuZGluZ1wiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCJSZW1vdmVcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwiVXBsb2FkIGZhaWxlZFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCJVcGxvYWRpbmcuLi5cIixcblxuICAvLyBNb250aFBpY2tlck11bHRpcGxlIENvbXBvbmVudFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuYWRkTW9udGhcIjogXCJBZGQgbW9udGhcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIlJhbmdlXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBtb250aFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwiQ2xlYXIgYWxsXCIsXG4gIFwicmMubXVsdGlTZWxlY3QuY2xvc2VcIjogXCJDbG9zZVwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm1vcmVJdGVtc1wiOiAoY291bnQ6IG51bWJlcikgPT4gYCske2NvdW50fSBtb3JlYCxcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub09wdGlvbnNcIjogXCJObyBvcHRpb25zXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zU2VsZWN0ZWRcIjogXCJObyBvcHRpb25zIHNlbGVjdGVkXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9SZXN1bHRzXCI6IFwiTm8gcmVzdWx0c1wiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR9IG9wdGlvbnNgLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdEFsbFwiOiBcIlNlbGVjdCBhbGxcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIlNlbGVjdC4uLlwiLFxuXG4gIC8vIFBhZ2luYXRpb24gQ29tcG9uZW50XG4gIFwicmMucGFnaW5hdGlvbi5uZXh0XCI6IFwiTmV4dFwiLFxuICBcInJjLnBhZ2luYXRpb24ucHJldmlvdXNcIjogXCJQcmV2aW91c1wiLFxuICBcInJjLnBhZ2luYXRpb24uc2hvd2luZ1wiOiAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgYFNob3dpbmcgJHtzdGFydH0tJHtlbmR9IG9mICR7dG90YWx9YCxcblxuICAvLyBDYWxlbmRhciBDb21wb25lbnRcbiAgXCJyYy5jYWxlbmRhci5tb250aC4wXCI6IFwiSmFudWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjFcIjogXCJGZWJydWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCJNYXJjaFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjNcIjogXCJBcHJpbFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjRcIjogXCJNYXlcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC41XCI6IFwiSnVuZVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjZcIjogXCJKdWx5XCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguN1wiOiBcIkF1Z3VzdFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCJTZXB0ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC45XCI6IFwiT2N0b2JlclwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjEwXCI6IFwiTm92ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xMVwiOiBcIkRlY2VtYmVyXCIsXG5cbiAgLy8gU29uYW11IEZpbHRlciBDb21wb25lbnRcbiAgXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIjogXCJTb25hbXUgRmlsdGVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmFwcGx5XCI6IFwiQXBwbHlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCJSZXNldFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hZGRSdWxlXCI6IFwiQWRkIFJ1bGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAnTm8gcnVsZXMgeWV0LiBDbGljayBcIisgQWRkIFJ1bGVcIiB0byBzdGFydC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIlNlbGVjdCBmaWVsZFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RPcGVyYXRvclwiOiBcIk9wZXJhdG9yXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCJTZWxlY3Qgb3BlcmF0b3IgZmlyc3RcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW50ZXJWYWx1ZVwiOiBcIkVudGVyIHZhbHVlXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmVudGVyTnVtYmVyXCI6IFwiRW50ZXIgbnVtYmVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLm5vdFN1cHBvcnRlZFwiOiBcIk5vdCBzdXBwb3J0ZWRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbGllZEZpbHRlcnNcIjogXCLwn4yyIEFwcGxpZWQgU29uYW11RmlsdGVyc1wiLFxuXG4gIC8vIENvbW1vblxuICBcInJjLmNvbW1vbi5jYW5jZWxcIjogXCJDYW5jZWxcIixcbiAgXCJyYy5jb21tb24uc2F2ZVwiOiBcIlNhdmVcIixcbn0gYXMgY29uc3Q7XG5cbi8vIGVudGl0eS5qc29u7JeQ7IScIOy2lOy2nO2VnCBlbnRpdHkgbGFiZWxzIChkZWZhdWx0TG9jYWxlIOyghOyaqSlcbmNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1wiOiBcIlJlcXVlc3RMb2dcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRva2VuX25hbWVcIjogXCLthqDtgbAg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucHJvamVjdF9uYW1lXCI6IFwi7ZSE66Gc7KCd7Yq4IOydtOumhFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLm1vZGVsX25hbWVcIjogXCLrqqjrjbgg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IOydtOumhCAoZmFsbGJhY2sg7KCEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnVzZXJfcHJvbXB0XCI6IFwi7IKs7Jqp7J6QIO2UhOuhrO2UhO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnN5c3RlbV9wcm9tcHRcIjogXCLsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq4XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVzcG9uc2VcIjogXCJsbG0g7J2R64u1IOyghOusuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmlucHV0X3Rva2Vuc1wiOiBcIuyeheugpSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5vdXRwdXRfdG9rZW5zXCI6IFwi7Lac66ClIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX3JlYWRfdG9rZW5zXCI6IFwi7LqQ7IucIOydveq4sCDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIjogXCLsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCI6IFwiMeyLnOqwhCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5kdXJhdGlvbl9tc1wiOiBcIuydkeuLtSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cudHRmdF9tc1wiOiBcImZpcnN0IGdlbiBUVEZUKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3RfdXNkXCI6IFwiQVBJIOu5hOyaqVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3Rfc291cmNlXCI6IFwi67mE7JqpIOy2nOyymChwcm92aWRlci9wcmljaW5nX3RhYmxlL21peGVkKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmltYWdlX2Nvc3RfdXNkXCI6IFwi7J2066+47KeAIOyDneyEsSDstpTsoJUg67mE7JqpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaW1hZ2VfY29zdF9tZXRob2RcIjogXCLsnbTrr7jsp4Ag67mE7JqpIOy2lOyglSDrsKnsi51cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5lZmZvcnRcIjogXCJlZmZvcnQgbGV2ZWxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5oaXN0b3J5XCI6IFwiaW5qZWN0X2l0ZW1zIO2eiOyKpO2GoOumrFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRvb2xzXCI6IFwi7JqU7LKt7JeQIOyepeywqeuQnCB0b29sIOygleydmCDrqqnroZ1cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5zdGF0dXNcIjogXCLsi6Ttlokg7IOB7YOcXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuZXJyb3JfbWVzc2FnZVwiOiBcIuyXkOufrCDrqZTsi5zsp4BcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy50b29sX2NhbGxfY291bnRcIjogXCJ0b29sIGNhbGwg7Zqf7IiYXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaXNfaW1hZ2VfZ2VuZXJhdGlvblwiOiBcIuydtOuvuOyngCDsg53shLEgdHVybiDsl6zrtoAgKHF1b3RhIOq3gOyGjeyaqSlcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1NlYXJjaEZpZWxkLmlkXCI6IFwiSURcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTZWFyY2hGaWVsZC50b2tlbl9uYW1lXCI6IFwi7Yag7YGw7J2066aEXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU2VhcmNoRmllbGQudXNlcl9wcm9tcHRcIjogXCLsgqzsmqnsnpAg7ZSE66Gs7ZSE7Yq4XCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RhdHVzLnJ1bm5pbmdcIjogXCLsi6Ttlokg7KSRXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RhdHVzLnN1Y2NlZWRlZFwiOiBcIuyEseqztVwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0YXR1cy5lcnJvclwiOiBcIuyXkOufrFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0YXR1cy5hYm9ydGVkXCI6IFwi7KSR64uoXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwXCI6IFwiUmVxdWVzdExvZ1N0ZXBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuaWRcIjogXCJJRFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jcmVhdGVkX2F0XCI6IFwi65Ox66Gd7J287IucXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnJlcXVlc3RfbG9nXCI6IFwi67aA66qoIHJlcXVlc3QgbG9nIElEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnN0ZXBfaW5kZXhcIjogXCJhaS1zZGsgc3RlcCBudW1iZXIgKDAtYmFzZWQpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnR5cGVcIjogXCJzdGVwIO2DgOyehVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5tb2RlbF9uYW1lXCI6IFwi7Iuk7KCcIHNlcnZpbmcg66qo6424XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnJlcXVlc3RlZF9tb2RlbF9uYW1lXCI6IFwi7JqU7LKtIOuqqOuNuCAoZmFsbGJhY2sg7KCEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5mYWxsYmFja19jb3VudFwiOiBcIuuqqOuNuCBmYWxsYmFjayDtmp/siJhcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuaW5wdXRfdG9rZW5zXCI6IFwi7J6F66ClIO2GoO2BsCAoZ2VuZXJhdGUpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLm91dHB1dF90b2tlbnNcIjogXCLstpzroKUg7Yag7YGwIChnZW5lcmF0ZSlcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY2FjaGVfcmVhZF90b2tlbnNcIjogXCLsupDsi5wg7J296riwIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIjogXCLsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIjogXCI167aEIFRUTCDsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIjogXCIx7Iuc6rCEIFRUTCDsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jb3N0X3VzZFwiOiBcInN0ZXAg67mE7JqpIChtaWNyby1VU0QpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNvc3Rfc291cmNlXCI6IFwi67mE7JqpIOy2nOyymChwcm92aWRlci9wcmljaW5nX3RhYmxlKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5kdXJhdGlvbl9tc1wiOiBcIuyGjOyalOyLnOqwhChtcylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudHRmdF9tc1wiOiBcIkdlbiBUVEZUKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5maW5pc2hfcmVhc29uXCI6IFwi7JmE66OMIOyCrOycoFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5yZWFzb25pbmdfdGV4dFwiOiBcInJlYXNvbmluZyDthY3siqTtirhcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVhc29uaW5nX3Rva2Vuc1wiOiBcInJlYXNvbmluZyDthqDtgbAg7IiYXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfY2FsbF9pbmRleFwiOiBcIuqwmeydgCBzdGVwIOuCtCB0b29sIGNhbGwg7Iic7IScXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfY2FsbF9pZFwiOiBcInRvb2wgY2FsbCBJRFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX25hbWVcIjogXCJ0b29sIOydtOumhFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX2FyZ3NcIjogXCJ0b29sIOyduOyekCAoSlNPTiBzdHJpbmcpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfcmVzdWx0XCI6IFwidG9vbCDqsrDqs7wgKEpTT04gc3RyaW5nKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX2R1cmF0aW9uX21zXCI6IFwidG9vbCDsi6Ttlokg7IaM7JqU7Iuc6rCEKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5lcnJvclwiOiBcInN0ZXAg7JeQ65+sIOuplOyLnOyngFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0ZXBUeXBlLmdlbmVyYXRlXCI6IFwiTExNIOyDneyEsVwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0ZXBUeXBlLnRvb2xfY2FsbFwiOiBcIlRvb2wg7Zi47LacXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcE9yZGVyQnkuaWQtYXNjXCI6IFwiSUTsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGVwU2VhcmNoRmllbGQuaWRcIjogXCJJRFwiLFxuICBcImVudGl0eS5Ub2tlblwiOiBcIlRva2VuXCIsXG4gIFwiZW50aXR5LlRva2VuLmlkXCI6IFwiSURcIixcbiAgXCJlbnRpdHkuVG9rZW4uY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5Ub2tlbi5wcm92aWRlclwiOiBcIu2UhOuhnOuwlOydtOuNlFwiLFxuICBcImVudGl0eS5Ub2tlbi5jcmVkZW50aWFsc1wiOiBcIuyduOymnSDsoJXrs7QgKEpTT05CKVwiLFxuICBcImVudGl0eS5Ub2tlbi5uYW1lXCI6IFwi7Yag7YGwIOydtOumhFwiLFxuICBcImVudGl0eS5Ub2tlbi5hY3RpdmVcIjogXCLtmZzshLEg7Jes67aAXCIsXG4gIFwiZW50aXR5LlRva2VuLm9yZFwiOiBcIuygleugrCDsiJzshJxcIixcbiAgXCJlbnRpdHkuVG9rZW4ucXVvdGFfdGhyZXNob2xkXCI6IFwicXVvdGEg7IKs7Jqp66WgIOyehOqzhOy5mCglKS4gbnVsbOydtOuptCDrr7jshKTsoJVcIixcbiAgXCJlbnRpdHkuVG9rZW4ud2VpZ2h0XCI6IFwi6rCA7KSRIOudvOyatOuTnOuhnOu5iCDrnbzsmrDtjIUg6rCA7KSR7LmYICgxLi4xMDApXCIsXG4gIFwiZW51bS5Ub2tlbk9yZGVyQnkuaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIsXG4gIFwiZW51bS5Ub2tlbk9yZGVyQnkub3JkLWFzY1wiOiBcIuyInOyEnOyInFwiLFxuICBcImVudW0uVG9rZW5TZWFyY2hGaWVsZC5pZFwiOiBcIklEXCIsXG4gIFwiZW51bS5Ub2tlblNlYXJjaEZpZWxkLm5hbWVcIjogXCLsnbTrpoRcIixcbn0gYXMgY29uc3Q7XG5cbi8vIGRlZmF1bHRMb2NhbGXsnZggZGljdGlvbmFyeeulvCDquLDspIDsnLzroZwg7YKkIOy2lOy2nFxudHlwZSBSQ0tleXMgPSB0eXBlb2YgcmNLZXlzS287XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mIGtvO1xudHlwZSBFbnRpdHlMYWJlbHMgPSB0eXBlb2YgZW50aXR5TGFiZWxzO1xudHlwZSBSYXdNZXJnZWREaWN0aW9uYXJ5ID0gUkNLZXlzICZcbiAgT21pdDxFbnRpdHlMYWJlbHMsIGtleW9mIChSQ0tleXMgJiBQcm9qZWN0RGljdGlvbmFyeSk+ICZcbiAgUHJvamVjdERpY3Rpb25hcnk7XG5cbi8vIO2CpOuKlCDsnKDsp4DtlZjrkJgsIOqwkiDtg4DsnoXsnYAgc3RyaW5nIOuYkOuKlCDtlajsiJjroZwg7J2867CY7ZmUICjri6TrpbggbG9jYWxl7J2YIOumrO2EsOuftCDtg4DsnoUg7Lap64+MIOuwqeyngClcbmV4cG9ydCB0eXBlIE1lcmdlZERpY3Rpb25hcnkgPSB7XG4gIFtLIGluIGtleW9mIFJhd01lcmdlZERpY3Rpb25hcnldOiBSYXdNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICAgID8gKC4uLmFyZ3M6IFApID0+IHN0cmluZ1xuICAgIDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIERpY3RLZXkgPSBrZXlvZiBNZXJnZWREaWN0aW9uYXJ5O1xuZXhwb3J0IHR5cGUgTG9jYWxpemVkU3RyaW5nID0gc3RyaW5nICYgeyBfX2JyYW5kOiBcIkxvY2FsaXplZFN0cmluZ1wiIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVMb2NhbGUoZGljdDogUGFydGlhbDxNZXJnZWREaWN0aW9uYXJ5Pikge1xuICByZXR1cm4gZGljdDtcbn1cblxuLy8g6rCBIGxvY2FsZeuzhOuhnCByYy1rZXlzICsgZW50aXR5IGxhYmVscyArIO2UhOuhnOygne2KuCBkaWN0IO2Vqey5qFxuY29uc3QgZGljdGlvbmFyaWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+PiA9IHtcbiAga286IHsgLi4ucmNLZXlzS28sIC4uLmVudGl0eUxhYmVscywgLi4ua28gfSxcbiAgZW46IHsgLi4ucmNLZXlzRW4sIC4uLmVuIH0sXG59O1xuXG50eXBlIFNEUmV0dXJuVHlwZTxLIGV4dGVuZHMgRGljdEtleT4gPSBNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICA/ICguLi5hcmdzOiBQKSA9PiBMb2NhbGl6ZWRTdHJpbmdcbiAgOiBMb2NhbGl6ZWRTdHJpbmc7XG5cbmZ1bmN0aW9uIGdldERpY3RWYWx1ZTxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLLCBsb2NhbGU6IHN0cmluZyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdFtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMi4gZGVmYXVsdCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGlmIChsb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFICYmIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMy4gc3VwcG9ydGVkIGxvY2FsZXMg7Iic7ZqMXG4gIGZvciAoY29uc3Qgc3VwcG9ydGVkTG9jYWxlIG9mIFNVUFBPUlRFRF9MT0NBTEVTKSB7XG4gICAgaWYgKHN1cHBvcnRlZExvY2FsZSAhPT0gbG9jYWxlICYmIHN1cHBvcnRlZExvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUpIHtcbiAgICAgIGlmIChkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiDrqqjrkZAg7Iuk7YyoIOyLnCBrZXkg67CY7ZmYXG4gIHJldHVybiBrZXkgYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg7ZWo7IiYXG4gKiBsb2NhbGXsl5Ag66ee64qUIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRChcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCLsoIDsnqVcIiAoTG9jYWxpemVkU3RyaW5nKVxuICogU0QoXCJ1c2VyLm5vdEZvdW5kXCIpKDEpICAvLyDihpIgXCLsobTsnqztlZjsp4Ag7JWK64qUIFVzZXIgSUQgMVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTRDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgY29uc3QgbG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiDtirnsoJUgbG9jYWxl7J2YIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWY64qUIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IEVOID0gU0QubG9jYWxlKFwiZW5cIik7XG4gKiBFTihcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCJTYXZlXCJcbiAqL1xuU0QubG9jYWxlID1cbiAgKGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT5cbiAgPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4gPT4ge1xuICAgIHJldHVybiBnZXREaWN0VmFsdWUoa2V5LCBsb2NhbGUpO1xuICB9O1xuXG4vLyBMb2NhbGl6ZWQg6rCA64ql7ZWcIENvbHVtbiDtg4DsnoUg6rOE7IKwXG50eXBlIExvY2FsaXplZEJhc2VDb2x1bW48VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBLIGV4dGVuZHMgYCR7aW5mZXIgQmFzZX1fJHsodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdfWBcbiAgICA/IEJhc2VcbiAgICA6IEs7XG59W2tleW9mIFQgJiBzdHJpbmddO1xuXG4vKipcbiAqIGxvY2FsZeyXkCDrlLDrnbwg7KCB7KCI7ZWcIOy7rOufvCDqsJLsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogRELsl5AgbmFtZSwgbmFtZV9rbywgbmFtZV9lbuyymOufvCBsb2NhbGl6ZWQgY29sdW1u7J20IOyeiOydhCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAga28sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAganDsnbwg65WMKTogY29sdW1uX2pwIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9rbyDihpIgY29sdW1uX2VuXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGVuLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGtv7J28IOuVjCk6IGNvbHVtbl9rbyDihpIgY29sdW1uIOKGkiBjb2x1bW5fZW4g4oaSIGNvbHVtbl9qcFxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2NhbGl6ZWRDb2x1bW4odGFnLCBcIm5hbWVcIilcbiAqL1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQ7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG50eXBlIE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IFYgZXh0ZW5kcyBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50XG4gICAgICA/IHN0cmluZ1xuICAgICAgOiBWIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgaW5mZXIgTFY+PlxuICAgICAgICA/IE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMVj5cbiAgICAgICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uQ2FuZGlkYXRlPFQsIEsgZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCAoSyBleHRlbmRzIGtleW9mIFQgPyBUW0tdIDogbmV2ZXIpXG4gIHwge1xuICAgICAgW0wgaW4gKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV06IGAke0t9XyR7TH1gIGV4dGVuZHMga2V5b2YgVFxuICAgICAgICA/IFRbYCR7S31fJHtMfWBdXG4gICAgICAgIDogbmV2ZXI7XG4gICAgfVsodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdXTtcbnR5cGUgTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEsgZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCBMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208TG9jYWxpemVkQ29sdW1uQ2FuZGlkYXRlPFQsIEs+PlxuICB8IHVuZGVmaW5lZDtcbnR5cGUgTG9jYWxlVmFsdWVNYXAgPSBQYXJ0aWFsPFJlY29yZDwodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLCB1bmtub3duPj47XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5WYWx1ZSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYmlnaW50XCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQgfCBcIlwiIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZExvY2FsZVZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4+KFxuICByb3c6IFQsXG4gIGNvbHVtbjogSyxcbiAgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLFxuKTogdW5rbm93biB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gcm93W2NvbHVtbl07XG4gIGlmIChjb2x1bW5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY29sdW1uVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb2x1bW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIChjb2x1bW5WYWx1ZSBhcyBMb2NhbGVWYWx1ZU1hcClbbG9jYWxlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBLIGV4dGVuZHMgTG9jYWxpemVkQmFzZUNvbHVtbjxUPixcbj4ocm93OiBULCBjb2x1bW46IEspOiBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz4ge1xuICBjb25zdCBjdXJyZW50TG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhjdXJyZW50TG9jYWxlKSA/IGN1cnJlbnRMb2NhbGUgOiBERUZBVUxUX0xPQ0FMRTtcbiAgY29uc3Qgb3RoZXJMb2NhbGVzID0gU1VQUE9SVEVEX0xPQ0FMRVMuZmlsdGVyKFxuICAgIChsOiBzdHJpbmcpID0+IGwgIT09IGxvY2FsZSAmJiBsICE9PSBERUZBVUxUX0xPQ0FMRSxcbiAgKTtcbiAgY29uc3QgbG9jYWxpemVkS2V5ID0gKGNvbHVtbjogSywgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSA9PlxuICAgIGAke2NvbHVtbn1fJHtsb2NhbGV9YDtcbiAgY29uc3QgdmFsdWVzID0gW1xuICAgIHsgdmFsdWU6IHJvd1tsb2NhbGl6ZWRLZXkoY29sdW1uLCBsb2NhbGUpXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIGxvY2FsZSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIHsgdmFsdWU6IHJvd1tjb2x1bW5dLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgREVGQVVMVF9MT0NBTEUpXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIERFRkFVTFRfTE9DQUxFKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgLi4ub3RoZXJMb2NhbGVzLmZsYXRNYXAoKGwpID0+IFtcbiAgICAgIHsgdmFsdWU6IHJvd1tsb2NhbGl6ZWRLZXkoY29sdW1uLCBsKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIGwpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICBdKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IHsgdmFsdWUsIHNvdXJjZSB9IG9mIHZhbHVlcykge1xuICAgIGlmICghaXNFbXB0eUxvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSAmJiBpc0xvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgc291cmNlID09PSBcImRpcmVjdFwiICYmXG4gICAgICAhaXNFbXB0eUxvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSAmJlxuICAgICAgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSlcbiAgICApIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudW3snZggbG9jYWxpemVkIGxhYmVsc+ulvCBQcm94eeuhnCDrsJjtmZjtlanri4jri6QuXG4gKiBTZWxlY3Qg7Lu07Y+s64SM7Yq4IOuTseyXkOyEnCBFbnVtTGFiZWxba2V5XSDrjIDsi6Ag7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRC5lbnVtTGFiZWxzKFwiVGFnT3JkZXJCeVwiKVtrZXldICAvLyDihpIg7ZiE7J6sIGxvY2FsZeydmCDrnbzrsqhcbiAqL1xuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiwge1xuICAgIGdldChfLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGljdEtleSA9IGBlbnVtLiR7ZW51bU5hbWV9LiR7a2V5fWAgYXMgRGljdEtleTtcbiAgICAgIHJldHVybiBnZXREaWN0VmFsdWUoZGljdEtleSwgZ2V0Q3VycmVudExvY2FsZSgpKTtcbiAgICB9LFxuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBT0EsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxvQkFBb0IsQ0FBQyxNQUFNLElBQUk7QUFDckMsU0FBUyxtQkFBdUQ7Q0FDOUQsSUFBSTtFQUVGLE9BRFksT0FBTyxXQUNYLENBQUEsQ0FBSSxVQUFpRDtDQUMvRCxRQUFRO0VBQ04sT0FBTztDQUNUO0FBQ0Y7QUFNQSxNQUFNLFdBQVc7Q0FFZiwwQkFBMEI7Q0FDMUIsNEJBQTRCO0NBQzVCLDRCQUE0QjtDQUM1QixvQ0FBb0M7Q0FHcEMseUJBQXlCO0NBQ3pCLGlDQUFpQztDQUdqQywwQkFBMEI7Q0FDMUIsNkJBQTZCO0NBQzdCLDRCQUE0QjtDQUc1QixtQ0FBbUM7Q0FDbkMscUNBQXFDO0NBQ3JDLHVDQUF1QztDQUN2QyxzQ0FBc0M7Q0FHdEMsNEJBQTRCO0NBQzVCLHlCQUF5QjtDQUN6QixnQ0FBZ0M7Q0FDaEMsaUNBQWlDO0NBQ2pDLGtDQUFrQyxhQUNoQyxNQUFNLFNBQVM7Q0FDakIsd0JBQXdCO0NBQ3hCLHVCQUF1QjtDQUN2Qiw2QkFBNkI7Q0FDN0IsMEJBQTBCO0NBRzFCLG1DQUFtQztDQUNuQyxvQ0FBb0M7Q0FDcEMsa0NBQWtD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
380
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QuZ2VuZXJhdGVkLmpzIiwibmFtZXMiOlsia28iLCJlbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pMThuL3NkLmdlbmVyYXRlZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBnZW5lcmF0ZWRcbiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlxuICovXG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtcblxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcImtvXCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9IFtcImtvXCIsIFwiZW5cIl0gYXMgY29uc3Q7XG5mdW5jdGlvbiBnZXRDdXJyZW50TG9jYWxlKCk6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0ge1xuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmV0dXJuIChjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID8/IERFRkFVTFRfTE9DQUxFO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cblxuaW1wb3J0IGVuIGZyb20gXCIuL2VuXCI7XG5pbXBvcnQga28gZnJvbSBcIi4va29cIjtcblxuLy8gcmVhY3QtY29tcG9uZW50cyBpMThuIGtleXNcbmNvbnN0IHJjS2V5c0tvID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwi66Gc65SpIOykkS4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIuyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLmFzeW5jU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gQ29tYm9ib3ggQ29tcG9uZW50XG4gIFwicmMuY29tYm9ib3gubm9SZXN1bHRzXCI6IFwi6rKA7IOJIOqysOqzvOqwgCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5jb21ib2JveC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIuyEoO2Dne2VmOyEuOyalC4uLlwiLFxuXG4gIC8vIERhdGVQaWNrZXIgQ29tcG9uZW50XG4gIFwicmMuZGF0ZVBpY2tlci5waWNrRGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVQaWNrZXIuc2VsZWN0RGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwi64Kg7KecIOy2lOqwgFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIuq4sOqwhFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcblxuICAvLyBGaWxlSW5wdXQgQ29tcG9uZW50XG4gIFwicmMuZmlsZUlucHV0LmJyb3dzZUZpbGVzXCI6IFwi7YyM7J28IOywvuq4sFwiLFxuICBcInJjLmZpbGVJbnB1dC5kcm9wWm9uZVwiOiBcIu2MjOydvOydhCDrk5zrnpjqt7jtlZjqsbDrgpgg7YG066at7ZWY7JesIOyXheuhnOuTnFwiLFxuICBcInJjLmZpbGVJbnB1dC5maWxlUGxhY2Vob2xkZXJcIjogXCLtjIzsnbxcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIuydtOuvuOyngFwiLFxuICBcInJjLmZpbGVJbnB1dC5tYXhGaWxlc0V4Y2VlZGVkXCI6IChtYXhGaWxlczogbnVtYmVyKSA9PlxuICAgIGDstZzrjIAgJHttYXhGaWxlc33qsJwg7YyM7J2866eMIOyXheuhnOuTnCDqsIDriqXtlanri4jri6RgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwi64yA6riwIOykkVwiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCLsoJzqsbBcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwi7JeF66Gc65OcIOyLpO2MqFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCLsl4XroZzrk5wg7KSRLi4uXCIsXG5cbiAgLy8gTW9udGhQaWNrZXJNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmFkZE1vbnRoXCI6IFwi7JuUIOy2lOqwgFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuZGF0ZVJhbmdlXCI6IFwi6riw6rCEXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwi7KKF66OM7J28XCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5wbGFjZWhvbGRlclwiOiBcIuyblCDshKDtg51cIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnN0YXJ0RGF0ZVwiOiBcIuyLnOyekeydvFwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwi7KCE7LK0IO2VtOygnFwiLFxuICBcInJjLm11bHRpU2VsZWN0LmNsb3NlXCI6IFwi64ur6riwXCIsXG4gIFwicmMubXVsdGlTZWxlY3QubW9yZUl0ZW1zXCI6IChjb3VudDogbnVtYmVyKSA9PiBgKyR7Y291bnR96rCcIOuNlOuztOq4sGAsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zXCI6IFwi7Ji17IWY7J20IOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm5vT3B0aW9uc1NlbGVjdGVkXCI6IFwi7ISg7YOd65CcIOyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR96rCcIOyYteyFmGAsXG4gIFwicmMubXVsdGlTZWxlY3Quc2VsZWN0QWxsXCI6IFwi7KCE7LK0IOyEoO2DnVwiLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gUGFnaW5hdGlvbiBDb21wb25lbnRcbiAgXCJyYy5wYWdpbmF0aW9uLm5leHRcIjogXCLri6TsnYxcIixcbiAgXCJyYy5wYWdpbmF0aW9uLnByZXZpb3VzXCI6IFwi7J207KCEXCIsXG4gIFwicmMucGFnaW5hdGlvbi5zaG93aW5nXCI6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT5cbiAgICBgJHt0b3RhbH3qsJwg7KSRICR7c3RhcnR9LSR7ZW5kfWAsXG5cbiAgLy8gQ2FsZW5kYXIgQ29tcG9uZW50XG4gIFwicmMuY2FsZW5kYXIubW9udGguMFwiOiBcIjHsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xXCI6IFwiMuyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCIz7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguM1wiOiBcIjTsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC40XCI6IFwiNeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjVcIjogXCI27JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguNlwiOiBcIjfsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC43XCI6IFwiOOyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCI57JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguOVwiOiBcIjEw7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguMTBcIjogXCIxMeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjExXCI6IFwiMTLsm5RcIixcblxuICAvLyBTb25hbXUgRmlsdGVyIENvbXBvbmVudFxuICBcInJjLnNvbmFtdUZpbHRlci50aXRsZVwiOiBcIuyGjOuCmOustCDtlYTthLBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbHlcIjogXCLsoIHsmqlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCLstIjquLDtmZRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYWRkUnVsZVwiOiBcIuq3nOy5mSDstpTqsIBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAn7JWE7KeBIOq3nOy5meydtCDsl4bsirXri4jri6QuIFwiKyDqt5zsuZkg7LaU6rCAXCLrpbwg7YG066at7ZWY7JesIOyLnOyeke2VmOyEuOyalC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIu2VhOuTnCDshKDtg51cIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc2VsZWN0T3BlcmF0b3JcIjogXCLsl7DsgrDsnpAg7ISg7YOdXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCLrqLzsoIAg7Jew7IKw7J6Q66W8IOyEoO2Dne2VmOyEuOyalFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlclZhbHVlXCI6IFwi6rCSIOyeheugpVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlck51bWJlclwiOiBcIuyIq+yekCDsnoXroKVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm90U3VwcG9ydGVkXCI6IFwi7KeA7JuQ7ZWY7KeAIOyViuydjFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zdGFydERhdGVcIjogXCLsi5zsnpHsnbxcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW5kRGF0ZVwiOiBcIuyiheujjOydvFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hcHBsaWVkRmlsdGVyc1wiOiBcIvCfjLIg7KCB7Jqp65CcIOyGjOuCmOustCDtlYTthLBcIixcblxuICAvLyBDb21tb25cbiAgXCJyYy5jb21tb24uY2FuY2VsXCI6IFwi7Leo7IaMXCIsXG4gIFwicmMuY29tbW9uLnNhdmVcIjogXCLsoIDsnqVcIixcbn07XG5cbmNvbnN0IHJjS2V5c0VuID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwiTG9hZGluZy4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIk5vIG9wdGlvbnNcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuYXN5bmNTZWxlY3Quc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBDb21ib2JveCBDb21wb25lbnRcbiAgXCJyYy5jb21ib2JveC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuY29tYm9ib3guc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBEYXRlUGlja2VyIENvbXBvbmVudFxuICBcInJjLmRhdGVQaWNrZXIucGlja0RhdGVcIjogXCJQaWNrIGRhdGVcIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVBpY2tlci5zZWxlY3REYXRlXCI6IFwiU2VsZWN0IGRhdGVcIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwiQWRkIGRhdGVcIixcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5kYXRlUmFuZ2VcIjogXCJSYW5nZVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVNlbGVjdG9yTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuXG4gIC8vIEZpbGVJbnB1dCBDb21wb25lbnRcbiAgXCJyYy5maWxlSW5wdXQuYnJvd3NlRmlsZXNcIjogXCJCcm93c2UgZmlsZXNcIixcbiAgXCJyYy5maWxlSW5wdXQuZHJvcFpvbmVcIjogXCJEcmFnIGZpbGVzIGhlcmUgb3IgY2xpY2sgdG8gdXBsb2FkXCIsXG4gIFwicmMuZmlsZUlucHV0LmZpbGVQbGFjZWhvbGRlclwiOiBcIkZpbGVcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIkltYWdlXCIsXG4gIFwicmMuZmlsZUlucHV0Lm1heEZpbGVzRXhjZWVkZWRcIjogKG1heEZpbGVzOiBudW1iZXIpID0+IGBNYXhpbXVtICR7bWF4RmlsZXN9IGZpbGVzIGFsbG93ZWRgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwiUGVuZGluZ1wiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCJSZW1vdmVcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwiVXBsb2FkIGZhaWxlZFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCJVcGxvYWRpbmcuLi5cIixcblxuICAvLyBNb250aFBpY2tlck11bHRpcGxlIENvbXBvbmVudFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuYWRkTW9udGhcIjogXCJBZGQgbW9udGhcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIlJhbmdlXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBtb250aFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwiQ2xlYXIgYWxsXCIsXG4gIFwicmMubXVsdGlTZWxlY3QuY2xvc2VcIjogXCJDbG9zZVwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm1vcmVJdGVtc1wiOiAoY291bnQ6IG51bWJlcikgPT4gYCske2NvdW50fSBtb3JlYCxcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub09wdGlvbnNcIjogXCJObyBvcHRpb25zXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zU2VsZWN0ZWRcIjogXCJObyBvcHRpb25zIHNlbGVjdGVkXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9SZXN1bHRzXCI6IFwiTm8gcmVzdWx0c1wiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR9IG9wdGlvbnNgLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdEFsbFwiOiBcIlNlbGVjdCBhbGxcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIlNlbGVjdC4uLlwiLFxuXG4gIC8vIFBhZ2luYXRpb24gQ29tcG9uZW50XG4gIFwicmMucGFnaW5hdGlvbi5uZXh0XCI6IFwiTmV4dFwiLFxuICBcInJjLnBhZ2luYXRpb24ucHJldmlvdXNcIjogXCJQcmV2aW91c1wiLFxuICBcInJjLnBhZ2luYXRpb24uc2hvd2luZ1wiOiAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgYFNob3dpbmcgJHtzdGFydH0tJHtlbmR9IG9mICR7dG90YWx9YCxcblxuICAvLyBDYWxlbmRhciBDb21wb25lbnRcbiAgXCJyYy5jYWxlbmRhci5tb250aC4wXCI6IFwiSmFudWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjFcIjogXCJGZWJydWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCJNYXJjaFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjNcIjogXCJBcHJpbFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjRcIjogXCJNYXlcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC41XCI6IFwiSnVuZVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjZcIjogXCJKdWx5XCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguN1wiOiBcIkF1Z3VzdFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCJTZXB0ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC45XCI6IFwiT2N0b2JlclwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjEwXCI6IFwiTm92ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xMVwiOiBcIkRlY2VtYmVyXCIsXG5cbiAgLy8gU29uYW11IEZpbHRlciBDb21wb25lbnRcbiAgXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIjogXCJTb25hbXUgRmlsdGVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmFwcGx5XCI6IFwiQXBwbHlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCJSZXNldFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hZGRSdWxlXCI6IFwiQWRkIFJ1bGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAnTm8gcnVsZXMgeWV0LiBDbGljayBcIisgQWRkIFJ1bGVcIiB0byBzdGFydC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIlNlbGVjdCBmaWVsZFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RPcGVyYXRvclwiOiBcIk9wZXJhdG9yXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCJTZWxlY3Qgb3BlcmF0b3IgZmlyc3RcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW50ZXJWYWx1ZVwiOiBcIkVudGVyIHZhbHVlXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmVudGVyTnVtYmVyXCI6IFwiRW50ZXIgbnVtYmVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLm5vdFN1cHBvcnRlZFwiOiBcIk5vdCBzdXBwb3J0ZWRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbGllZEZpbHRlcnNcIjogXCLwn4yyIEFwcGxpZWQgU29uYW11RmlsdGVyc1wiLFxuXG4gIC8vIENvbW1vblxuICBcInJjLmNvbW1vbi5jYW5jZWxcIjogXCJDYW5jZWxcIixcbiAgXCJyYy5jb21tb24uc2F2ZVwiOiBcIlNhdmVcIixcbn0gYXMgY29uc3Q7XG5cbi8vIGVudGl0eS5qc29u7JeQ7IScIOy2lOy2nO2VnCBlbnRpdHkgbGFiZWxzIChkZWZhdWx0TG9jYWxlIOyghOyaqSlcbmNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1wiOiBcIlJlcXVlc3RMb2dcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRva2VuX25hbWVcIjogXCLthqDtgbAg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucHJvamVjdF9uYW1lXCI6IFwi7ZSE66Gc7KCd7Yq4IOydtOumhFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLm1vZGVsX25hbWVcIjogXCLrqqjrjbgg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IOydtOumhCAoZmFsbGJhY2sg7KCEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnVzZXJfcHJvbXB0XCI6IFwi7IKs7Jqp7J6QIO2UhOuhrO2UhO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnN5c3RlbV9wcm9tcHRcIjogXCLsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq4XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVzcG9uc2VcIjogXCJsbG0g7J2R64u1IOyghOusuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmlucHV0X3Rva2Vuc1wiOiBcIuyeheugpSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5vdXRwdXRfdG9rZW5zXCI6IFwi7Lac66ClIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX3JlYWRfdG9rZW5zXCI6IFwi7LqQ7IucIOydveq4sCDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIjogXCLsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCI6IFwiMeyLnOqwhCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5kdXJhdGlvbl9tc1wiOiBcIuydkeuLtSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cudHRmdF9tc1wiOiBcImZpcnN0IGdlbiBUVEZUKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3RfdXNkXCI6IFwiQVBJIOu5hOyaqVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3Rfc291cmNlXCI6IFwi67mE7JqpIOy2nOyymChwcm92aWRlci9wcmljaW5nX3RhYmxlL21peGVkKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmltYWdlX2Nvc3RfdXNkXCI6IFwi7J2066+47KeAIOyDneyEsSDstpTsoJUg67mE7JqpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaW1hZ2VfY29zdF9tZXRob2RcIjogXCLsnbTrr7jsp4Ag67mE7JqpIOy2lOyglSDrsKnsi51cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5lZmZvcnRcIjogXCJlZmZvcnQgbGV2ZWxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5oaXN0b3J5XCI6IFwiaW5qZWN0X2l0ZW1zIO2eiOyKpO2GoOumrFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRvb2xzXCI6IFwi7JqU7LKt7JeQIOyepeywqeuQnCB0b29sIOygleydmCDrqqnroZ1cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5zdGF0dXNcIjogXCLsi6Ttlokg7IOB7YOcXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuZXJyb3JfbWVzc2FnZVwiOiBcIuyXkOufrCDrqZTsi5zsp4BcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy50b29sX2NhbGxfY291bnRcIjogXCJ0b29sIGNhbGwg7Zqf7IiYXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaXNfaW1hZ2VfZ2VuZXJhdGlvblwiOiBcIuydtOuvuOyngCDsg53shLEgdHVybiDsl6zrtoAgKHF1b3RhIOq3gOyGjeyaqSlcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuaWQtYXNjXCI6IFwiSUTsmKTrnpjrkJzsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmNyZWF0ZWRfYXQtZGVzY1wiOiBcIuuTseuhneydvOyLnOy1nOyLoOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY3JlYXRlZF9hdC1hc2NcIjogXCLrk7HroZ3snbzsi5zsmKTrnpjrkJzsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LnR0ZnRfbXMtZGVzY1wiOiBcIlRURlTquLTsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LnR0ZnRfbXMtYXNjXCI6IFwiVFRGVOynp+ydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuZHVyYXRpb25fbXMtZGVzY1wiOiBcIuyGjOyalOyLnOqwhOq4tOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuZHVyYXRpb25fbXMtYXNjXCI6IFwi7IaM7JqU7Iuc6rCE7Ken7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5pbnB1dF90b2tlbnMtZGVzY1wiOiBcIuyeheugpe2GoO2BsOunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuaW5wdXRfdG9rZW5zLWFzY1wiOiBcIuyeheugpe2GoO2BsOyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkub3V0cHV0X3Rva2Vucy1kZXNjXCI6IFwi7Lac66Cl7Yag7YGw66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5vdXRwdXRfdG9rZW5zLWFzY1wiOiBcIuy2nOugpe2GoO2BsOyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfcmVhZF90b2tlbnMtZGVzY1wiOiBcIuy6kOyLnOydveq4sOunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfcmVhZF90b2tlbnMtYXNjXCI6IFwi7LqQ7Iuc7J296riw7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9jcmVhdGlvbl90b2tlbnMtZGVzY1wiOiBcIuy6kOyLnOyDneyEseunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfY3JlYXRpb25fdG9rZW5zLWFzY1wiOiBcIuy6kOyLnOyDneyEseyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY29zdF91c2QtZGVzY1wiOiBcIuu5hOyaqeuGkuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY29zdF91c2QtYXNjXCI6IFwi67mE7Jqp64Ku7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU2VhcmNoRmllbGQuaWRcIjogXCJJRFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1NlYXJjaEZpZWxkLnRva2VuX25hbWVcIjogXCLthqDtgbDsnbTrpoRcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTZWFyY2hGaWVsZC51c2VyX3Byb21wdFwiOiBcIuyCrOyaqeyekCDtlITroaztlITtirhcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMucnVubmluZ1wiOiBcIuyLpO2WiSDspJFcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMuc3VjY2VlZGVkXCI6IFwi7ISx6rO1XCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RhdHVzLmVycm9yXCI6IFwi7JeQ65+sXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RhdHVzLmFib3J0ZWRcIjogXCLspJHri6hcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXBcIjogXCJSZXF1ZXN0TG9nU3RlcFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNyZWF0ZWRfYXRcIjogXCLrk7HroZ3snbzsi5xcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVxdWVzdF9sb2dcIjogXCLrtoDrqqggcmVxdWVzdCBsb2cgSURcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuc3RlcF9pbmRleFwiOiBcImFpLXNkayBzdGVwIG51bWJlciAoMC1iYXNlZClcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudHlwZVwiOiBcInN0ZXAg7YOA7J6FXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLm1vZGVsX25hbWVcIjogXCLsi6TsoJwgc2VydmluZyDrqqjrjbhcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IChmYWxsYmFjayDsoIQpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5pbnB1dF90b2tlbnNcIjogXCLsnoXroKUg7Yag7YGwIChnZW5lcmF0ZSlcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAub3V0cHV0X3Rva2Vuc1wiOiBcIuy2nOugpSDthqDtgbAgKGdlbmVyYXRlKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jYWNoZV9yZWFkX3Rva2Vuc1wiOiBcIuy6kOyLnCDsnb3quLAg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiOiBcIuy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiOiBcIjHsi5zqsIQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNvc3RfdXNkXCI6IFwic3RlcCDruYTsmqkgKG1pY3JvLVVTRClcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY29zdF9zb3VyY2VcIjogXCLruYTsmqkg7Lac7LKYKHByb3ZpZGVyL3ByaWNpbmdfdGFibGUpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmR1cmF0aW9uX21zXCI6IFwi7IaM7JqU7Iuc6rCEKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50dGZ0X21zXCI6IFwiR2VuIFRURlQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmZpbmlzaF9yZWFzb25cIjogXCLsmYTro4wg7IKs7JygXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnJlYXNvbmluZ190ZXh0XCI6IFwicmVhc29uaW5nIO2FjeyKpO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5yZWFzb25pbmdfdG9rZW5zXCI6IFwicmVhc29uaW5nIO2GoO2BsCDsiJhcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9jYWxsX2luZGV4XCI6IFwi6rCZ7J2AIHN0ZXAg64K0IHRvb2wgY2FsbCDsiJzshJxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9jYWxsX2lkXCI6IFwidG9vbCBjYWxsIElEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfbmFtZVwiOiBcInRvb2wg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfYXJnc1wiOiBcInRvb2wg7J247J6QIChKU09OIHN0cmluZylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9yZXN1bHRcIjogXCJ0b29sIOqysOqzvCAoSlNPTiBzdHJpbmcpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfZHVyYXRpb25fbXNcIjogXCJ0b29sIOyLpO2WiSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmVycm9yXCI6IFwic3RlcCDsl5Drn6wg66mU7Iuc7KeAXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcFR5cGUuZ2VuZXJhdGVcIjogXCJMTE0g7IOd7ISxXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcFR5cGUudG9vbF9jYWxsXCI6IFwiVG9vbCDtmLjstpxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGVwT3JkZXJCeS5pZC1hc2NcIjogXCJJROyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0ZXBTZWFyY2hGaWVsZC5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlRva2VuXCI6IFwiVG9rZW5cIixcbiAgXCJlbnRpdHkuVG9rZW4uaWRcIjogXCJJRFwiLFxuICBcImVudGl0eS5Ub2tlbi5jcmVhdGVkX2F0XCI6IFwi65Ox66Gd7J287IucXCIsXG4gIFwiZW50aXR5LlRva2VuLnByb3ZpZGVyXCI6IFwi7ZSE66Gc67CU7J20642UXCIsXG4gIFwiZW50aXR5LlRva2VuLmNyZWRlbnRpYWxzXCI6IFwi7J247KadIOygleuztCAoSlNPTkIpXCIsXG4gIFwiZW50aXR5LlRva2VuLm5hbWVcIjogXCLthqDtgbAg7J2066aEXCIsXG4gIFwiZW50aXR5LlRva2VuLmFjdGl2ZVwiOiBcIu2ZnOyEsSDsl6zrtoBcIixcbiAgXCJlbnRpdHkuVG9rZW4ub3JkXCI6IFwi7KCV66CsIOyInOyEnFwiLFxuICBcImVudGl0eS5Ub2tlbi5xdW90YV90aHJlc2hvbGRcIjogXCJxdW90YSDsgqzsmqnrpaAg7J6E6rOE7LmYKCUpLiBudWxs7J2066m0IOuvuOyEpOyglVwiLFxuICBcImVudGl0eS5Ub2tlbi53ZWlnaHRcIjogXCLqsIDspJEg65287Jq065Oc66Gc67mIIOudvOyasO2MhSDqsIDspJHsuZggKDEuLjEwMClcIixcbiAgXCJlbnVtLlRva2VuT3JkZXJCeS5pZC1kZXNjXCI6IFwiSUTstZzsi6DsiJxcIixcbiAgXCJlbnVtLlRva2VuT3JkZXJCeS5vcmQtYXNjXCI6IFwi7Iic7ISc7IicXCIsXG4gIFwiZW51bS5Ub2tlblNlYXJjaEZpZWxkLmlkXCI6IFwiSURcIixcbiAgXCJlbnVtLlRva2VuU2VhcmNoRmllbGQubmFtZVwiOiBcIuydtOumhFwiLFxufSBhcyBjb25zdDtcblxuLy8gZGVmYXVsdExvY2FsZeydmCBkaWN0aW9uYXJ566W8IOq4sOykgOycvOuhnCDtgqQg7LaU7LacXG50eXBlIFJDS2V5cyA9IHR5cGVvZiByY0tleXNLbztcbnR5cGUgUHJvamVjdERpY3Rpb25hcnkgPSB0eXBlb2Yga287XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJlxuICBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJlxuICBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG5jb25zdCBkaWN0aW9uYXJpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4+ID0ge1xuICBrbzogeyAuLi5yY0tleXNLbywgLi4uZW50aXR5TGFiZWxzLCAuLi5rbyB9LFxuICBlbjogeyAuLi5yY0tleXNFbiwgLi4uZW4gfSxcbn07XG5cbnR5cGUgU0RSZXR1cm5UeXBlPEsgZXh0ZW5kcyBEaWN0S2V5PiA9IE1lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gID8gKC4uLmFyZ3M6IFApID0+IExvY2FsaXplZFN0cmluZ1xuICA6IExvY2FsaXplZFN0cmluZztcblxuZnVuY3Rpb24gZ2V0RGljdFZhbHVlPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEssIGxvY2FsZTogc3RyaW5nKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgLy8gMS4g7KeA7KCV65CcIGxvY2FsZeyXkOyEnCDsobDtmoxcbiAgY29uc3QgZGljdCA9IGRpY3Rpb25hcmllc1tsb2NhbGVdO1xuICBpZiAoZGljdD8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkaWN0W2tleV0gYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG4gIH1cblxuICAvLyAyLiBkZWZhdWx0IGxvY2FsZeyXkOyEnCDsobDtmoxcbiAgaWYgKGxvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUgJiYgZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkaWN0aW9uYXJpZXNbREVGQVVMVF9MT0NBTEVdW2tleV0gYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG4gIH1cblxuICAvLyAzLiBzdXBwb3J0ZWQgbG9jYWxlcyDsiJztmoxcbiAgZm9yIChjb25zdCBzdXBwb3J0ZWRMb2NhbGUgb2YgU1VQUE9SVEVEX0xPQ0FMRVMpIHtcbiAgICBpZiAoc3VwcG9ydGVkTG9jYWxlICE9PSBsb2NhbGUgJiYgc3VwcG9ydGVkTG9jYWxlICE9PSBERUZBVUxUX0xPQ0FMRSkge1xuICAgICAgaWYgKGRpY3Rpb25hcmllc1tzdXBwb3J0ZWRMb2NhbGVdPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIOuqqOuRkCDsi6TtjKgg7IucIGtleSDrsJjtmZhcbiAgcmV0dXJuIGtleSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeSDtlajsiJhcbiAqIGxvY2FsZeyXkCDrp57ripQg67KI7JetIO2FjeyKpO2KuOulvCDrsJjtmZjtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIFNEKFwiY29tbW9uLnNhdmVcIikgIC8vIOKGkiBcIuyggOyepVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKiBTRChcInVzZXIubm90Rm91bmRcIikoMSkgIC8vIOKGkiBcIuyhtOyerO2VmOyngCDslYrripQgVXNlciBJRCAxXCIgKExvY2FsaXplZFN0cmluZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNEPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4ge1xuICBjb25zdCBsb2NhbGUgPSBnZXRDdXJyZW50TG9jYWxlKCk7XG4gIHJldHVybiBnZXREaWN0VmFsdWUoa2V5LCBsb2NhbGUpO1xufVxuXG4vKipcbiAqIO2KueyglSBsb2NhbGXsnZgg67KI7JetIO2FjeyKpO2KuOulvCDrsJjtmZjtlZjripQg7ZWo7IiY66W8IOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgRU4gPSBTRC5sb2NhbGUoXCJlblwiKTtcbiAqIEVOKFwiY29tbW9uLnNhdmVcIikgIC8vIOKGkiBcIlNhdmVcIlxuICovXG5TRC5sb2NhbGUgPVxuICAobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSA9PlxuICA8SyBleHRlbmRzIERpY3RLZXk+KGtleTogSyk6IFNEUmV0dXJuVHlwZTxLPiA9PiB7XG4gICAgcmV0dXJuIGdldERpY3RWYWx1ZShrZXksIGxvY2FsZSk7XG4gIH07XG5cbi8vIExvY2FsaXplZCDqsIDriqXtlZwgQ29sdW1uIO2DgOyehSDqs4TsgrBcbnR5cGUgTG9jYWxpemVkQmFzZUNvbHVtbjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IEsgZXh0ZW5kcyBgJHtpbmZlciBCYXNlfV8keyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl19YFxuICAgID8gQmFzZVxuICAgIDogSztcbn1ba2V5b2YgVCAmIHN0cmluZ107XG5cbi8qKlxuICogbG9jYWxl7JeQIOuUsOudvCDsoIHsoIjtlZwg7Lus65+8IOqwkuydhCDrsJjtmZjtlanri4jri6QuXG4gKiBEQuyXkCBuYW1lLCBuYW1lX2tvLCBuYW1lX2Vu7LKY65+8IGxvY2FsaXplZCBjb2x1bW7snbQg7J6I7J2EIOuVjCDsgqzsmqntlanri4jri6QuXG4gKlxuICog7Jqw7ISg7Iic7JyEICjsp4Dsm5Ag66Gc7LyA7J287J2AIGtvL2pwL2Vu7J206rOgLCDshJzruYTsiqTsnZgg6riw67O4IOuhnOy8gOydvOydgCBrbywg7IKs7Jqp7J6Q7J2YIOuhnOy8gOydvOydgCBqcOydvCDrlYwpOiBjb2x1bW5fanAg4oaSIGNvbHVtbiDihpIgY29sdW1uX2tvIOKGkiBjb2x1bW5fZW5cbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAgZW4sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAga2/snbwg65WMKTogY29sdW1uX2tvIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9lbiDihpIgY29sdW1uX2pwXG4gKlxuICogQGV4YW1wbGVcbiAqIGxvY2FsaXplZENvbHVtbih0YWcsIFwibmFtZVwiKVxuICovXG50eXBlIExvY2FsaXplZENvbHVtblNjYWxhclZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludDtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWUgPSBzdHJpbmcgfCBzdHJpbmdbXTtcbnR5cGUgTmVzdGVkTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IG5ldmVyO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208Vj4gPSBWIGV4dGVuZHMgc3RyaW5nXG4gID8gc3RyaW5nXG4gIDogViBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgPyBzdHJpbmdbXVxuICAgIDogViBleHRlbmRzIG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnRcbiAgICAgID8gc3RyaW5nXG4gICAgICA6IFYgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDwodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLCBpbmZlciBMVj4+XG4gICAgICAgID8gTmVzdGVkTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPExWPlxuICAgICAgICA6IG5ldmVyO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IChLIGV4dGVuZHMga2V5b2YgVCA/IFRbS10gOiBuZXZlcilcbiAgfCB7XG4gICAgICBbTCBpbiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdXTogYCR7S31fJHtMfWAgZXh0ZW5kcyBrZXlvZiBUXG4gICAgICAgID8gVFtgJHtLfV8ke0x9YF1cbiAgICAgICAgOiBuZXZlcjtcbiAgICB9Wyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSz4+XG4gIHwgdW5kZWZpbmVkO1xudHlwZSBMb2NhbGVWYWx1ZU1hcCA9IFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIHVua25vd24+PjtcblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblNjYWxhclZhbHVlIHtcbiAgcmV0dXJuIFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIiwgXCJiaWdpbnRcIl0uaW5jbHVkZXModHlwZW9mIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eUxvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCB8IFwiXCIge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIjtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkTG9jYWxlVmFsdWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBLIGV4dGVuZHMgTG9jYWxpemVkQmFzZUNvbHVtbjxUPj4oXG4gIHJvdzogVCxcbiAgY29sdW1uOiBLLFxuICBsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgY29sdW1uVmFsdWUgPSByb3dbY29sdW1uXTtcbiAgaWYgKGNvbHVtblZhbHVlID09PSBudWxsIHx8IHR5cGVvZiBjb2x1bW5WYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNvbHVtblZhbHVlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gKGNvbHVtblZhbHVlIGFzIExvY2FsZVZhbHVlTWFwKVtsb2NhbGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxpemVkQ29sdW1uPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+LFxuPihyb3c6IFQsIGNvbHVtbjogSyk6IExvY2FsaXplZENvbHVtblJldHVybjxULCBLPiB7XG4gIGNvbnN0IGN1cnJlbnRMb2NhbGUgPSBnZXRDdXJyZW50TG9jYWxlKCk7XG4gIGNvbnN0IGxvY2FsZSA9IFNVUFBPUlRFRF9MT0NBTEVTLmluY2x1ZGVzKGN1cnJlbnRMb2NhbGUpID8gY3VycmVudExvY2FsZSA6IERFRkFVTFRfTE9DQUxFO1xuICBjb25zdCBvdGhlckxvY2FsZXMgPSBTVVBQT1JURURfTE9DQUxFUy5maWx0ZXIoXG4gICAgKGw6IHN0cmluZykgPT4gbCAhPT0gbG9jYWxlICYmIGwgIT09IERFRkFVTFRfTE9DQUxFLFxuICApO1xuICBjb25zdCBsb2NhbGl6ZWRLZXkgPSAoY29sdW1uOiBLLCBsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID0+XG4gICAgYCR7Y29sdW1ufV8ke2xvY2FsZX1gO1xuICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIGxvY2FsZSldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICB7IHZhbHVlOiBnZXROZXN0ZWRMb2NhbGVWYWx1ZShyb3csIGNvbHVtbiwgbG9jYWxlKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2NvbHVtbl0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IHJvd1tsb2NhbGl6ZWRLZXkoY29sdW1uLCBERUZBVUxUX0xPQ0FMRSldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICB7IHZhbHVlOiBnZXROZXN0ZWRMb2NhbGVWYWx1ZShyb3csIGNvbHVtbiwgREVGQVVMVF9MT0NBTEUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICAuLi5vdGhlckxvY2FsZXMuZmxhdE1hcCgobCkgPT4gW1xuICAgICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIGwpXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgICB7IHZhbHVlOiBnZXROZXN0ZWRMb2NhbGVWYWx1ZShyb3csIGNvbHVtbiwgbCksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIF0pLFxuICBdO1xuXG4gIGZvciAoY29uc3QgeyB2YWx1ZSwgc291cmNlIH0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKCFpc0VtcHR5TG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWUpICYmIGlzTG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiZcbiAgICAgICFpc0VtcHR5TG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWUpICYmXG4gICAgICBpc0xvY2FsaXplZENvbHVtblNjYWxhclZhbHVlKHZhbHVlKVxuICAgICkge1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkgYXMgTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRW51beydmCBsb2NhbGl6ZWQgbGFiZWxz66W8IFByb3h566GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIFNlbGVjdCDsu7Ttj6zrhIztirgg65Ox7JeQ7IScIEVudW1MYWJlbFtrZXldIOuMgOyLoCDsgqzsmqntlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIFNELmVudW1MYWJlbHMoXCJUYWdPcmRlckJ5XCIpW2tleV0gIC8vIOKGkiDtmITsnqwgbG9jYWxl7J2YIOudvOuyqFxuICovXG5TRC5lbnVtTGFiZWxzID0gKGVudW1OYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBMb2NhbGl6ZWRTdHJpbmc+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBSZWNvcmQ8c3RyaW5nLCBMb2NhbGl6ZWRTdHJpbmc+LCB7XG4gICAgZ2V0KF8sIGtleTogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaWN0S2V5ID0gYGVudW0uJHtlbnVtTmFtZX0uJHtrZXl9YCBhcyBEaWN0S2V5O1xuICAgICAgcmV0dXJuIGdldERpY3RWYWx1ZShkaWN0S2V5LCBnZXRDdXJyZW50TG9jYWxlKCkpO1xuICAgIH0sXG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQSxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLG9CQUFvQixDQUFDLE1BQU0sSUFBSTtBQUNyQyxTQUFTLG1CQUF1RDtDQUM5RCxJQUFJO0VBRUYsT0FEWSxPQUFPLFdBQ1gsQ0FBQSxDQUFJLFVBQWlEO0NBQy9ELFFBQVE7RUFDTixPQUFPO0NBQ1Q7QUFDRjtBQU1BLE1BQU0sV0FB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
@@ -0,0 +1,49 @@
1
+ import { calculateCostUsd } from "../utils/providers/common/model-cost.js";
2
+ //#region src/migrations/20260807133553_manual__backfill_request_log_cost.ts
3
+ const MICRO_USD = 1e6;
4
+ const CHUNK_SIZE = 5e3;
5
+ function isAnthropicRow(row) {
6
+ return row.token_name?.startsWith("anthropic/") === true || row.model_name?.startsWith("claude-") === true || row.model_name?.startsWith("anthropic/claude-") === true;
7
+ }
8
+ function backfilledCostMicroUsd(row) {
9
+ if (!row.model_name) return Math.max(row.cost_usd ?? 0, 0);
10
+ const inputTokens = isAnthropicRow(row) && row.input_tokens < row.cache_read_tokens + row.cache_creation_tokens ? row.input_tokens + row.cache_read_tokens + row.cache_creation_tokens : row.input_tokens;
11
+ const usd = calculateCostUsd(row.model_name.includes("/") ? row.model_name.split("/").pop() : row.model_name, {
12
+ inputTokens,
13
+ outputTokens: row.output_tokens,
14
+ cachedInputTokens: row.cache_read_tokens,
15
+ cacheCreationInputTokens: row.cache_creation_tokens,
16
+ ...row.cache_creation_5m_tokens !== null ? { cacheCreationInputTokens5m: row.cache_creation_5m_tokens } : {},
17
+ ...row.cache_creation_1h_tokens !== null ? { cacheCreationInputTokens1h: row.cache_creation_1h_tokens } : {}
18
+ });
19
+ return Math.max(Math.round(usd * MICRO_USD), 0);
20
+ }
21
+ async function up(knex) {
22
+ let lastId = 0;
23
+ let processed = 0;
24
+ for (;;) {
25
+ const { rows } = await knex.raw(`SELECT id, token_name, model_name, input_tokens, output_tokens,
26
+ cache_read_tokens, cache_creation_tokens,
27
+ cache_creation_5m_tokens, cache_creation_1h_tokens, cost_usd
28
+ FROM request_logs
29
+ WHERE (cost_source IS NULL OR cost_usd IS NULL) AND id > ?
30
+ ORDER BY id
31
+ LIMIT ?`, [lastId, CHUNK_SIZE]);
32
+ if (rows.length === 0) break;
33
+ const values = rows.map((row) => `(${row.id}, ${backfilledCostMicroUsd(row)})`).join(",");
34
+ await knex.raw(`UPDATE request_logs AS t
35
+ SET cost_usd = v.cost_usd, cost_source = 'backfilled'
36
+ FROM (VALUES ${values}) AS v(id, cost_usd)
37
+ WHERE t.id = v.id`);
38
+ lastId = rows[rows.length - 1].id;
39
+ processed += rows.length;
40
+ }
41
+ console.log(`[backfill] request_logs cost backfilled: ${processed} rows`);
42
+ }
43
+ async function down(knex) {
44
+ await knex.raw(`UPDATE request_logs SET cost_source = NULL WHERE cost_source = 'backfilled'`);
45
+ }
46
+ //#endregion
47
+ export { down, up };
48
+
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA4MDcxMzM1NTNfbWFudWFsX19iYWNrZmlsbF9yZXF1ZXN0X2xvZ19jb3N0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb25zLzIwMjYwODA3MTMzNTUzX21hbnVhbF9fYmFja2ZpbGxfcmVxdWVzdF9sb2dfY29zdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGxlZ2FjeSByZXF1ZXN0X2xvZ3Mg7J2YIOu5hOyaqeydhCDtmZXsoJXqsJLsnLzroZwg67Cx7ZWE7ZWc64ukLlxuICpcbiAqIOuwsOqyvTogYGNvc3Rfc291cmNlYCDqsIAg7JeG64qUIHJvdyDripQg7KGw7ZqM7ZWgIOuVjOuniOuLpCDslbHsnbQg7ZiE7J6sIOqwgOqyqe2RnOuhnCDsnqzqs4TsgrDtlbQg7JmU64ukXG4gKiAoYG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvd2ApLiDsnoXroKXsnbQg6rOg7KCV7J206528IOqysOqzvOuPhCDtla3sg4Eg6rCZ7J2A642wLCA5NuunjCDtlokg7YWM7J2067iU7JeQ7IScXG4gKiAyMy4266eMIO2WieydhCDrp6Qg7JqU7LKtIOyVseycvOuhnCDrgYzslrTsmKTripQg67mE7Jqp66eMIOuCqOuKlOuLpC4g7ZWcIOuyiCDqs4TsgrDtlbQg7KCA7J6l7ZWY66m0IOy0neu5hOyaqSDsp5Hqs4TqsIBcbiAqIOuLqOydvCBTUUwgU1VNIOycvOuhnCDrgZ3rgpzri6QuXG4gKlxuICog6rOE7IKw7Iud7J2AIOyVseydmCBgbm9ybWFsaXplZFVzYWdlRm9yQ29zdGAgKyBgY2FsY3VsYXRlQ29zdFVzZGAg66W8IOq3uOuMgOuhnCDsmK7quLQg6rKD7J2064ukLlxuICog65GQIOuhnOyngeydtCDqsIjrnbzsp4DrqbQg67Cx7ZWE65CcIOqwkuqzvCDsi6Dqt5wg7KCA7J6l6rCS7J2YIOq4sOykgOydtCDri6zrnbzsp4Drr4DroZwsIOqwgOqyqe2RnOulvCDrsJTqv4Ag65WM64qUXG4gKiDsnbQg66eI7J206re466CI7J207IWY7J20IOyVhOuLiOudvCDslbEg7L2U65Oc66eMIOuwlOq+uOuptCDrkJzri6Qo7J2066+4IO2ZleygleuQnCDqsJLsnYAg7Jyg7KeA65CY64qUIOqyg+ydtCDqs4Tslb0pLlxuICpcbiAqIOuQmOuPjOumrOq4sDogZG93biDsnYAgYGNvc3Rfc291cmNlPSdiYWNrZmlsbGVkJ2Ag7J24IHJvdyDsnZgg7ZGc7Iud66eMIOygnOqxsO2VtCDsnqzqs4TsgrAg64yA7IOB7Jy866GcXG4gKiDrkJjrj4zrprDri6QuIOybkOuzuCBgY29zdF91c2RgIOuKlCDrs7Xsm5DrkJjsp4Ag7JWK64qU64ukIOKAlCDrkJjrj4zrprQg7IiYIOyXhuuKlCDsk7DquLDri6QuIOuNruydtOuKlCDqsJLsnYBcbiAqIE5VTEwg7J207JeI6rGw64KYLCDsnYzsiJjsmIDqsbDrgpgsIOq1rOuyhOyghCDqsIDqsqntkZzroZwg6rOE7IKw65CcIOqwkuydtOqzoCwg7KGw7ZqMIOqyveuhnOuKlCDsnbTrk6TsnYQg6re464yA66GcXG4gKiDrs7Tsl6zspIAg7KCB7J20IOyXhuuLpCjtla3sg4Eg7ZiE7J6sIOqwgOqyqe2RnOuhnCDsnqzqs4TsgrDtlbQg7ZGc7IucKS4g6re4656Y7IScIO2ZlOuptOyXkCDrs7TsnbTrjZgg7LSd7JWh7J2AXG4gKiDrsLHtlYQg7KCE7ZuE66GcIOuPmeydvO2VmOupsCwg7Iuk7KeIIOyGkOyLpOydgCDsl4bri6QuXG4gKi9cbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbi8vIOuniOydtOq3uOugiOydtOyFmCDrn6zrhIjripQgdHNjb25maWcg7J2YIGJ1bmRsZXIg7ZW07ISd7J2EIOyTsOyngCDslYrripQg7Iic7IiYIEVTTSDroZzrjZTrnbwg7ZmV7J6l7J6Q6rCAIO2VhOyalO2VmOuLpC5cbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LmpzXCI7XG5cbmNvbnN0IE1JQ1JPX1VTRCA9IDFfMDAwXzAwMDtcbmNvbnN0IENIVU5LX1NJWkUgPSA1XzAwMDtcblxudHlwZSBMZWdhY3lSb3cgPSB7XG4gIGlkOiBudW1iZXI7XG4gIHRva2VuX25hbWU6IHN0cmluZyB8IG51bGw7XG4gIG1vZGVsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IG51bWJlciB8IG51bGw7XG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogbnVtYmVyIHwgbnVsbDtcbiAgY29zdF91c2Q6IG51bWJlciB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1Jvdyhyb3c6IExlZ2FjeVJvdyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHJvdy50b2tlbl9uYW1lPy5zdGFydHNXaXRoKFwiYW50aHJvcGljL1wiKSA9PT0gdHJ1ZSB8fFxuICAgIHJvdy5tb2RlbF9uYW1lPy5zdGFydHNXaXRoKFwiY2xhdWRlLVwiKSA9PT0gdHJ1ZSB8fFxuICAgIHJvdy5tb2RlbF9uYW1lPy5zdGFydHNXaXRoKFwiYW50aHJvcGljL2NsYXVkZS1cIikgPT09IHRydWVcbiAgKTtcbn1cblxuZnVuY3Rpb24gYmFja2ZpbGxlZENvc3RNaWNyb1VzZChyb3c6IExlZ2FjeVJvdyk6IG51bWJlciB7XG4gIGlmICghcm93Lm1vZGVsX25hbWUpIHJldHVybiBNYXRoLm1heChyb3cuY29zdF91c2QgPz8gMCwgMCk7XG5cbiAgLy8gQW50aHJvcGljIOydgCBpbnB1dC9jYWNoZV9yZWFkL2NhY2hlX2NyZWF0aW9uIOydhCDsg4HtmLgg67Cw7YOA7KCB7Jy866GcIOuztOqzoO2VnOuLpC4g6rO86rGwIOyggOyepSDqsr3roZzqsIBcbiAgLy8g7J2066W8IO2Vqey5mOyngCDslYrslYQgaW5wdXRfdG9rZW5zIOqwgCDsnpHqsowg64Ko7J2AIHJvdyDrpbwg67O17JuQ7ZWc64ukLlxuICBjb25zdCBzcGxpdElucHV0ID1cbiAgICBpc0FudGhyb3BpY1Jvdyhyb3cpICYmIHJvdy5pbnB1dF90b2tlbnMgPCByb3cuY2FjaGVfcmVhZF90b2tlbnMgKyByb3cuY2FjaGVfY3JlYXRpb25fdG9rZW5zO1xuICBjb25zdCBpbnB1dFRva2VucyA9IHNwbGl0SW5wdXRcbiAgICA/IHJvdy5pbnB1dF90b2tlbnMgKyByb3cuY2FjaGVfcmVhZF90b2tlbnMgKyByb3cuY2FjaGVfY3JlYXRpb25fdG9rZW5zXG4gICAgOiByb3cuaW5wdXRfdG9rZW5zO1xuXG4gIGNvbnN0IG1vZGVsID0gcm93Lm1vZGVsX25hbWUuaW5jbHVkZXMoXCIvXCIpID8gcm93Lm1vZGVsX25hbWUuc3BsaXQoXCIvXCIpLnBvcCgpISA6IHJvdy5tb2RlbF9uYW1lO1xuICBjb25zdCB1c2QgPSBjYWxjdWxhdGVDb3N0VXNkKG1vZGVsLCB7XG4gICAgaW5wdXRUb2tlbnMsXG4gICAgb3V0cHV0VG9rZW5zOiByb3cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZWRJbnB1dFRva2Vuczogcm93LmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2Vuczogcm93LmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gbnVsbFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSBudWxsXG4gICAgICA/IHsgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJvdy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgfVxuICAgICAgOiB7fSksXG4gIH0pO1xuICByZXR1cm4gTWF0aC5tYXgoTWF0aC5yb3VuZCh1c2QgKiBNSUNST19VU0QpLCAwKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGxhc3RJZCA9IDA7XG4gIGxldCBwcm9jZXNzZWQgPSAwO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IGtuZXgucmF3PHsgcm93czogTGVnYWN5Um93W10gfT4oXG4gICAgICBgU0VMRUNUIGlkLCB0b2tlbl9uYW1lLCBtb2RlbF9uYW1lLCBpbnB1dF90b2tlbnMsIG91dHB1dF90b2tlbnMsXG4gICAgICAgICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zLCBjYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucywgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLCBjb3N0X3VzZFxuICAgICAgICAgRlJPTSByZXF1ZXN0X2xvZ3NcbiAgICAgICAgV0hFUkUgKGNvc3Rfc291cmNlIElTIE5VTEwgT1IgY29zdF91c2QgSVMgTlVMTCkgQU5EIGlkID4gP1xuICAgICAgICBPUkRFUiBCWSBpZFxuICAgICAgICBMSU1JVCA/YCxcbiAgICAgIFtsYXN0SWQsIENIVU5LX1NJWkVdLFxuICAgICk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSBicmVhaztcblxuICAgIC8vIGNodW5rIOuLuSDtlZwg67KI7J2YIFVQREFURSAuLi4gRlJPTSAoVkFMVUVTIC4uLikg66GcIOyZleuzteydhCDspITsnbjri6QuXG4gICAgY29uc3QgdmFsdWVzID0gcm93cy5tYXAoKHJvdykgPT4gYCgke3Jvdy5pZH0sICR7YmFja2ZpbGxlZENvc3RNaWNyb1VzZChyb3cpfSlgKS5qb2luKFwiLFwiKTtcbiAgICBhd2FpdCBrbmV4LnJhdyhcbiAgICAgIGBVUERBVEUgcmVxdWVzdF9sb2dzIEFTIHRcbiAgICAgICAgICBTRVQgY29zdF91c2QgPSB2LmNvc3RfdXNkLCBjb3N0X3NvdXJjZSA9ICdiYWNrZmlsbGVkJ1xuICAgICAgICAgRlJPTSAoVkFMVUVTICR7dmFsdWVzfSkgQVMgdihpZCwgY29zdF91c2QpXG4gICAgICAgIFdIRVJFIHQuaWQgPSB2LmlkYCxcbiAgICApO1xuXG4gICAgbGFzdElkID0gcm93c1tyb3dzLmxlbmd0aCAtIDFdIS5pZDtcbiAgICBwcm9jZXNzZWQgKz0gcm93cy5sZW5ndGg7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgW2JhY2tmaWxsXSByZXF1ZXN0X2xvZ3MgY29zdCBiYWNrZmlsbGVkOiAke3Byb2Nlc3NlZH0gcm93c2ApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXgucmF3KGBVUERBVEUgcmVxdWVzdF9sb2dzIFNFVCBjb3N0X3NvdXJjZSA9IE5VTEwgV0hFUkUgY29zdF9zb3VyY2UgPSAnYmFja2ZpbGxlZCdgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUF1QkEsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sYUFBYTtBQWVuQixTQUFTLGVBQWUsS0FBeUI7Q0FDL0MsT0FDRSxJQUFJLFlBQVksV0FBVyxZQUFZLE1BQU0sUUFDN0MsSUFBSSxZQUFZLFdBQVcsU0FBUyxNQUFNLFFBQzFDLElBQUksWUFBWSxXQUFXLG1CQUFtQixNQUFNO0FBRXhEO0FBRUEsU0FBUyx1QkFBdUIsS0FBd0I7Q0FDdEQsSUFBSSxDQUFDLElBQUksWUFBWSxPQUFPLEtBQUssSUFBSSxJQUFJLFlBQVksR0FBRyxDQUFDO0NBTXpELE1BQU0sY0FESixlQUFlLEdBQUcsS0FBSyxJQUFJLGVBQWUsSUFBSSxvQkFBb0IsSUFBSSx3QkFFcEUsSUFBSSxlQUFlLElBQUksb0JBQW9CLElBQUksd0JBQy9DLElBQUk7Q0FHUixNQUFNLE1BQU0saUJBREUsSUFBSSxXQUFXLFNBQVMsR0FBRyxJQUFJLElBQUksV0FBVyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSyxJQUFJLFlBQ2hEO0VBQ2xDO0VBQ0EsY0FBYyxJQUFJO0VBQ2xCLG1CQUFtQixJQUFJO0VBQ3ZCLDBCQUEwQixJQUFJO0VBQzlCLEdBQUksSUFBSSw2QkFBNkIsT0FDakMsRUFBRSw0QkFBNEIsSUFBSSx5QkFBeUIsSUFDM0QsQ0FBQztFQUNMLEdBQUksSUFBSSw2QkFBNkIsT0FDakMsRUFBRSw0QkFBNEIsSUFBSSx5QkFBeUIsSUFDM0QsQ0FBQztDQUNQLENBQUM7Q0FDRCxPQUFPLEtBQUssSUFBSSxLQUFLLE1BQU0sTUFBTSxTQUFTLEdBQUcsQ0FBQztBQUNoRDtBQUVBLGVBQXNCLEdBQUcsTUFBMkI7Q0FDbEQsSUFBSSxTQUFTO0NBQ2IsSUFBSSxZQUFZO0NBRWhCLFNBQVM7RUFDUCxNQUFNLEVBQUUsU0FBUyxNQUFNLEtBQUssSUFDMUI7Ozs7OztrQkFPQSxDQUFDLFFBQVEsVUFBVSxDQUNyQjtFQUNBLElBQUksS0FBSyxXQUFXLEdBQUc7RUFHdkIsTUFBTSxTQUFTLEtBQUssS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksdUJBQXVCLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUc7RUFDeEYsTUFBTSxLQUFLLElBQ1Q7O3dCQUVrQixPQUFPOzBCQUUzQjtFQUVBLFNBQVMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFFO0VBQ2hDLGFBQWEsS0FBSztDQUNwQjtDQUVBLFFBQVEsSUFBSSw0Q0FBNEMsVUFBVSxNQUFNO0FBQzFFO0FBRUEsZUFBc0IsS0FBSyxNQUEyQjtDQUNwRCxNQUFNLEtBQUssSUFBSSw2RUFBNkU7QUFDOUYifQ==
@@ -0,0 +1,13 @@
1
+ //#region src/migrations/20260807145144_alter_request_logs_alter1.ts
2
+ async function up(knex) {
3
+ await knex.raw(`CREATE INDEX request_logs_project_name_cost_usd_index ON request_logs USING btree(project_name ASC NULLS LAST, cost_usd ASC NULLS LAST);`);
4
+ }
5
+ async function down(knex) {
6
+ await knex.schema.alterTable("request_logs", (table) => {
7
+ table.dropIndex(["project_name", "cost_usd"], "request_logs_project_name_cost_usd_index");
8
+ });
9
+ }
10
+ //#endregion
11
+ export { down, up };
12
+
13
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA4MDcxNDUxNDRfYWx0ZXJfcmVxdWVzdF9sb2dzX2FsdGVyMS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9ucy8yMDI2MDgwNzE0NTE0NF9hbHRlcl9yZXF1ZXN0X2xvZ3NfYWx0ZXIxLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXgucmF3KFxuICAgIGBDUkVBVEUgSU5ERVggcmVxdWVzdF9sb2dzX3Byb2plY3RfbmFtZV9jb3N0X3VzZF9pbmRleCBPTiByZXF1ZXN0X2xvZ3MgVVNJTkcgYnRyZWUocHJvamVjdF9uYW1lIEFTQyBOVUxMUyBMQVNULCBjb3N0X3VzZCBBU0MgTlVMTFMgTEFTVCk7YCxcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwicmVxdWVzdF9sb2dzXCIsICh0YWJsZSkgPT4ge1xuICAgIHRhYmxlLmRyb3BJbmRleChbXCJwcm9qZWN0X25hbWVcIiwgXCJjb3N0X3VzZFwiXSwgXCJyZXF1ZXN0X2xvZ3NfcHJvamVjdF9uYW1lX2Nvc3RfdXNkX2luZGV4XCIpO1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUVBLGVBQXNCLEdBQUcsTUFBMkI7Q0FDbEQsTUFBTSxLQUFLLElBQ1QsMElBQ0Y7QUFDRjtBQUVBLGVBQXNCLEtBQUssTUFBMkI7Q0FDcEQsTUFBTSxLQUFLLE9BQU8sV0FBVyxpQkFBaUIsVUFBVTtFQUN0RCxNQUFNLFVBQVUsQ0FBQyxnQkFBZ0IsVUFBVSxHQUFHLDBDQUEwQztDQUMxRixDQUFDO0FBQ0gifQ==
@@ -0,0 +1,13 @@
1
+ //#region src/migrations/20260807164057_alter_request_logs_alter1.ts
2
+ async function up(knex) {
3
+ await knex.raw(`CREATE INDEX request_logs_model_name_index ON request_logs USING btree(model_name ASC NULLS LAST);`);
4
+ }
5
+ async function down(knex) {
6
+ await knex.schema.alterTable("request_logs", (table) => {
7
+ table.dropIndex(["model_name"], "request_logs_model_name_index");
8
+ });
9
+ }
10
+ //#endregion
11
+ export { down, up };
12
+
13
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA4MDcxNjQwNTdfYWx0ZXJfcmVxdWVzdF9sb2dzX2FsdGVyMS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9ucy8yMDI2MDgwNzE2NDA1N19hbHRlcl9yZXF1ZXN0X2xvZ3NfYWx0ZXIxLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXgucmF3KFxuICAgIGBDUkVBVEUgSU5ERVggcmVxdWVzdF9sb2dzX21vZGVsX25hbWVfaW5kZXggT04gcmVxdWVzdF9sb2dzIFVTSU5HIGJ0cmVlKG1vZGVsX25hbWUgQVNDIE5VTExTIExBU1QpO2AsXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcInJlcXVlc3RfbG9nc1wiLCAodGFibGUpID0+IHtcbiAgICB0YWJsZS5kcm9wSW5kZXgoW1wibW9kZWxfbmFtZVwiXSwgXCJyZXF1ZXN0X2xvZ3NfbW9kZWxfbmFtZV9pbmRleFwiKTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFFQSxlQUFzQixHQUFHLE1BQTJCO0NBQ2xELE1BQU0sS0FBSyxJQUNULG9HQUNGO0FBQ0Y7QUFFQSxlQUFzQixLQUFLLE1BQTJCO0NBQ3BELE1BQU0sS0FBSyxPQUFPLFdBQVcsaUJBQWlCLFVBQVU7RUFDdEQsTUFBTSxVQUFVLENBQUMsWUFBWSxHQUFHLCtCQUErQjtDQUNqRSxDQUFDO0FBQ0gifQ==
@@ -1,9 +1,11 @@
1
- import { isSoException } from "sonamu";
1
+ import { SoException } from "sonamu";
2
2
  import { getLogger } from "@logtape/logtape";
3
3
  //#region src/server-error-handler.ts
4
+ const RETRY_AFTER_SECONDS = "30";
4
5
  function handleServerError(error, reply) {
5
6
  getLogger(["qgrid"]).error(`${error}`);
6
- const statusCode = isSoException(error) && Number.isInteger(error.statusCode) && error.statusCode >= 400 && error.statusCode <= 599 ? error.statusCode : 500;
7
+ const statusCode = error instanceof SoException && Number.isInteger(error.statusCode) && error.statusCode >= 400 && error.statusCode <= 599 ? error.statusCode : 500;
8
+ if (statusCode === 503) reply.header("Retry-After", RETRY_AFTER_SECONDS);
7
9
  reply.status(statusCode).send({
8
10
  name: error.name,
9
11
  message: error.message
@@ -12,4 +14,4 @@ function handleServerError(error, reply) {
12
14
  //#endregion
13
15
  export { handleServerError };
14
16
 
15
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWVycm9yLWhhbmRsZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci1lcnJvci1oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBpc1NvRXhjZXB0aW9uIH0gZnJvbSBcInNvbmFtdVwiO1xuXG4vLyBzdGF0dXNDb2RlIOulvCDsi6DrorDtlZjripQg67KU7JyE66W8IFNvbmFtdSDsmIjsmbgg6rOE7JW9KGlzU29FeGNlcHRpb24p7Jy866GcIO2VnOygle2VnOuLpC4gcWdyaWQg64qUIO2UhOuhneyLnOudvFxuLy8gdXBzdHJlYW0gSFRUUCDsmKTrpZgoZmV0Y2gvdW5kaWNpIOulmCnrj4Qgc3RhdHVzQ29kZSDrpbwg64us6rOgIOuCmOyYpOuKlOuNsCwg6re46rG4IGR1Y2stdHlwaW5nIOycvOuhnFxuLy8g6re464yA66GcIOyXkOy9lO2VmOuptCB1cHN0cmVhbSDsnZggNDAxLzQyOSDqsIAg7Zi47Lac7J6QIOyekOyLoOydmCDsmKTrpZjroZwg65GU6rCR7ZWc64ukLiBTb25hbXUg7JiI7Jm46rCAIOyVhOuLiOuptCA1MDAuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlU2VydmVyRXJyb3IoZXJyb3I6IEVycm9yLCByZXBseTogRmFzdGlmeVJlcGx5KTogdm9pZCB7XG4gIGdldExvZ2dlcihbXCJxZ3JpZFwiXSkuZXJyb3IoYCR7ZXJyb3J9YCk7XG4gIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgIGlzU29FeGNlcHRpb24oZXJyb3IpICYmXG4gICAgTnVtYmVyLmlzSW50ZWdlcihlcnJvci5zdGF0dXNDb2RlKSAmJlxuICAgIGVycm9yLnN0YXR1c0NvZGUgPj0gNDAwICYmXG4gICAgZXJyb3Iuc3RhdHVzQ29kZSA8PSA1OTlcbiAgICAgID8gZXJyb3Iuc3RhdHVzQ29kZVxuICAgICAgOiA1MDA7XG5cbiAgcmVwbHkuc3RhdHVzKHN0YXR1c0NvZGUpLnNlbmQoe1xuICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQU9BLFNBQWdCLGtCQUFrQixPQUFjLE9BQTJCO0NBQ3pFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxPQUFPO0NBQ3JDLE1BQU0sYUFDSixjQUFjLEtBQUssS0FDbkIsT0FBTyxVQUFVLE1BQU0sVUFBVSxLQUNqQyxNQUFNLGNBQWMsT0FDcEIsTUFBTSxjQUFjLE1BQ2hCLE1BQU0sYUFDTjtDQUVOLE1BQU0sT0FBTyxVQUFVLENBQUMsQ0FBQyxLQUFLO0VBQzVCLE1BQU0sTUFBTTtFQUNaLFNBQVMsTUFBTTtDQUNqQixDQUFDO0FBQ0gifQ==
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWVycm9yLWhhbmRsZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci1lcnJvci1oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBTb0V4Y2VwdGlvbiB9IGZyb20gXCJzb25hbXVcIjtcblxuLy8gZGlzcGF0Y2hlciDquLDrj5nsnYAgZGV2MCDquLDspIAgMX4y67aEIOqxuOumsOuLpCjsm4zsu6QgMjXqsJwgw5cgc3Bhd24g6rCE6rKpKS4g6re467O064ukIOynp+qyjCDsnqHsnLzrqbRcbi8vIOyerOyLnOuPhOqwgCDqsJnsnYAgNTAzIOydhCDri6Tsi5wg67Cb64qU64ukLlxuY29uc3QgUkVUUllfQUZURVJfU0VDT05EUyA9IFwiMzBcIjtcblxuLy8gc3RhdHVzQ29kZSDrpbwg7Iug66Kw7ZWY64qUIOuylOychOulvCBTb25hbXUg7JiI7Jm466GcIO2VnOygle2VnOuLpC4gcWdyaWQg64qUIO2UhOuhneyLnOudvCB1cHN0cmVhbSBIVFRQXG4vLyDsmKTrpZgoZmV0Y2gvdW5kaWNpIOulmCnrj4Qgc3RhdHVzQ29kZSDrpbwg64us6rOgIOuCmOyYpOuKlOuNsCwg6re46rG4IOq3uOuMgOuhnCDsl5DsvZTtlZjrqbQgdXBzdHJlYW0g7J2YXG4vLyA0MDEvNDI5IOqwgCDtmLjstpzsnpAg7J6Q7Iug7J2YIOyYpOulmOuhnCDrkZTqsJHtlZzri6QuIFNvbmFtdSDsmIjsmbjqsIAg7JWE64uI66m0IDUwMC5cbi8vXG4vLyBzb25hbXUg7J2YIGlzU29FeGNlcHRpb24g7J2AIGBzdGF0dXNDb2RlICE9PSB1bmRlZmluZWRgIOunjCDrs7TripQgZHVjay10eXBpbmcg7J206528IOuwlOuhnCDqt7hcbi8vIHVwc3RyZWFtIOyYiOyZuOulvCDthrXqs7zsi5ztgqjri6QuIOyXrOq4sOyEnOuKlCBpbnN0YW5jZW9mIOuhnCDsi6TsoJwg6rOE7JW97J2EIO2ZleyduO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVTZXJ2ZXJFcnJvcihlcnJvcjogRXJyb3IsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiB2b2lkIHtcbiAgZ2V0TG9nZ2VyKFtcInFncmlkXCJdKS5lcnJvcihgJHtlcnJvcn1gKTtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgZXJyb3IgaW5zdGFuY2VvZiBTb0V4Y2VwdGlvbiAmJlxuICAgIE51bWJlci5pc0ludGVnZXIoZXJyb3Iuc3RhdHVzQ29kZSkgJiZcbiAgICBlcnJvci5zdGF0dXNDb2RlID49IDQwMCAmJlxuICAgIGVycm9yLnN0YXR1c0NvZGUgPD0gNTk5XG4gICAgICA/IGVycm9yLnN0YXR1c0NvZGVcbiAgICAgIDogNTAwO1xuXG4gIC8vIDUwMyDsnYAgXCLsp4DquIjsnYAg7JWE64uI7KeA66eMIOqzpyDrkJzri6RcIuuKlCDrnLvsnbTrnbwg7J6s7Iuc64+EIOyLnOygkOydhCDtlajqu5gg7KSA64ukLiDqsJLsnbQg7JeG7Jy866m0XG4gIC8vIO2BtOudvOydtOyWuO2KuOuKlCDsnqzsi5zrj4Qg6rCE6rKp7J2EIOyKpOyKpOuhnCDsoJXtlbTslbwg7ZWY6rOgLCDrjIDqsJwg7KaJ7IucIOyerOyLnOuPhO2VtCDrtoDtlZjrp4wg7YKk7Jq064ukLlxuICBpZiAoc3RhdHVzQ29kZSA9PT0gNTAzKSByZXBseS5oZWFkZXIoXCJSZXRyeS1BZnRlclwiLCBSRVRSWV9BRlRFUl9TRUNPTkRTKTtcblxuICByZXBseS5zdGF0dXMoc3RhdHVzQ29kZSkuc2VuZCh7XG4gICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsTUFBTSxzQkFBc0I7QUFRNUIsU0FBZ0Isa0JBQWtCLE9BQWMsT0FBMkI7Q0FDekUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLE9BQU87Q0FDckMsTUFBTSxhQUNKLGlCQUFpQixlQUNqQixPQUFPLFVBQVUsTUFBTSxVQUFVLEtBQ2pDLE1BQU0sY0FBYyxPQUNwQixNQUFNLGNBQWMsTUFDaEIsTUFBTSxhQUNOO0NBSU4sSUFBSSxlQUFlLEtBQUssTUFBTSxPQUFPLGVBQWUsbUJBQW1CO0NBRXZFLE1BQU0sT0FBTyxVQUFVLENBQUMsQ0FBQyxLQUFLO0VBQzVCLE1BQU0sTUFBTTtFQUNaLFNBQVMsTUFBTTtDQUNqQixDQUFDO0FBQ0gifQ==
@@ -146,14 +146,18 @@ var sonamu_config_default = defineConfig({
146
146
  const openaiDispatcher = new OpenAIDispatcher();
147
147
  await openaiDispatcher.start();
148
148
  QgridDispatcher.openaiDispatcher = openaiDispatcher;
149
+ QgridDispatcher.startupState.openai = "ready";
149
150
  } catch (e) {
151
+ QgridDispatcher.startupState.openai = "failed";
150
152
  log.warn(`openai dispatcher failed: ${e.message}`);
151
153
  }
152
154
  try {
153
155
  const anthropicDispatcher = new AnthropicDispatcher();
154
156
  await anthropicDispatcher.start();
155
157
  QgridDispatcher.anthropicDispatcher = anthropicDispatcher;
158
+ QgridDispatcher.startupState.anthropic = "ready";
156
159
  } catch (e) {
160
+ QgridDispatcher.startupState.anthropic = "failed";
157
161
  log.warn(`anthropic dispatcher failed: ${e.message}`);
158
162
  }
159
163
  const anthropicCount = QgridDispatcher.anthropicDispatcher?.tokenCount ?? 0;
@@ -180,4 +184,4 @@ var sonamu_config_default = defineConfig({
180
184
  //#endregion
181
185
  export { sonamu_config_default as default };
182
186
 
183
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHsgUWdyaWREaXNwYXRjaGVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgUWdyaWRGcmFtZSB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lXCI7XG5pbXBvcnQgeyBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBlbnN1cmVUb2tlbnNUcmlnZ2VyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tdHJpZ2dlci1zZXR1cFwiO1xuaW1wb3J0IHsgaGFuZGxlU2VydmVyRXJyb3IgfSBmcm9tIFwiLi9zZXJ2ZXItZXJyb3ItaGFuZGxlclwiO1xuaW1wb3J0IHsgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5cbmNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5IT1NUID8/IFwibG9jYWxob3N0XCI7XG5jb25zdCBwb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQgPz8gNDQ5MDApO1xuXG5jb25zdCBjb25uQ29uZmlnID0ge1xuICBob3N0OiBwcm9jZXNzLmVudi5TT05BTVVfREJfSE9TVCA/PyBcImxvY2FsaG9zdFwiLFxuICBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BPUlQgPz8gNTQzMiksXG4gIHVzZXI6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9VU0VSID8/IFwicG9zdGdyZXNcIixcbiAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9QQVNTV09SRCA/PyBcInBvc3RncmVzXCIsXG4gIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5TT05BTVVfREJfTkFNRSA/PyBcInFncmlkXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBwcm9qZWN0TmFtZTogcHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FID8/IFwiUWdyaWRcIixcbiAgZGF0YWJhc2U6IHtcbiAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5jb25uQ29uZmlnLFxuICAgICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpczogMTAwMDAsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGFwaToge1xuICAgIGRpcjogXCJhcGlcIixcbiAgICB0aW1lem9uZTogXCJBc2lhL1Nlb3VsXCIsXG4gICAgcm91dGU6IHtcbiAgICAgIHByZWZpeDogXCIvYXBpXCIsXG4gICAgfSxcbiAgfSxcbiAgaTE4bjoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwia29cIixcbiAgICBzdXBwb3J0ZWRMb2NhbGVzOiBbXCJrb1wiLCBcImVuXCJdLFxuICB9LFxuICBzeW5jOiB7XG4gICAgdGFyZ2V0czogW1wid2ViXCJdLFxuICB9LFxuICB0ZXN0OiB7XG4gICAgcGFyYWxsZWw6IHRydWUsXG4gICAgbWF4V29ya2VyczogNCxcbiAgICBkZXZSdW5uZXI6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICB9LFxuICBsb2dnaW5nOiB7XG4gICAgc2lua3M6IHtcbiAgICAgIGNvbnNvbGU6IGdldENvbnNvbGVTaW5rKHtcbiAgICAgICAgZm9ybWF0dGVyOiBnZXRQcmV0dHlGb3JtYXR0ZXIoe1xuICAgICAgICAgIHRpbWVzdGFtcDogXCJ0aW1lXCIsXG4gICAgICAgICAgY2F0ZWdvcnlXaWR0aDogMjAsXG4gICAgICAgICAgY2F0ZWdvcnlUcnVuY2F0ZTogXCJtaWRkbGVcIixcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIC8vIE1vbml0IO2DreyaqSBpbi1tZW1vcnkgcmluZyBidWZmZXIuIO2PrOunt+ydgCBzaW5rIOuzhCDigJQg7L2Y7IaUIOy2nOugpeydgCDqt7jrjIDroZzri6QuXG4gICAgICBtb25pdDogbW9uaXRMb2dTaW5rLFxuICAgIH0sXG4gICAgbG9nZ2VyczogW1xuICAgICAgLy8gcWdyaWQg66Gc6re4ICjsmpTssq0g67aE67CwLCBvYXV0aC91c2FnZSBBUEkpXG4gICAgICB7IGNhdGVnb3J5OiBbXCJxZ3JpZFwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwiaW5mb1wiIH0sXG4gICAgICAvLyBzb25hbXUg66Gc6re464qUIHdhcm5pbmcg7J207IOB66eMXG4gICAgICB7IGNhdGVnb3J5OiBbXCJzb25hbXVcIl0sIHNpbmtzOiBbXCJjb25zb2xlXCIsIFwibW9uaXRcIl0sIGxvd2VzdExldmVsOiBcIndhcm5pbmdcIiB9LFxuICAgICAgLy8gZmFzdGlmeSDroZzqt7gg7LCo64uoXG4gICAgICB7IGNhdGVnb3J5OiBbXCJmYXN0aWZ5XCJdLCBzaW5rczogW10sIGxvd2VzdExldmVsOiBcImZhdGFsXCIgfSxcbiAgICBdLFxuICB9LFxuICBzZXJ2ZXI6IHtcbiAgICBsaXN0ZW46IHsgcG9ydCwgaG9zdCB9LFxuICAgIGZhc3RpZnk6IHtcbiAgICAgIGJvZHlMaW1pdDogMTAgKiAxMDI0ICogMTAyNCxcbiAgICB9LFxuICAgIHBsdWdpbnM6IHtcbiAgICAgIGZvcm1ib2R5OiB0cnVlLFxuICAgICAgcXM6IHRydWUsXG4gICAgICBzc2U6IHRydWUsXG4gICAgICBtdWx0aXBhcnQ6IHsgbGltaXRzOiB7IGZpbGVTaXplOiAxMDI0ICogMTAyNCAqIDMwIH0gfSxcbiAgICAgIHN0YXRpYzoge1xuICAgICAgICByb290OiBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIvLi4vXCIsIFwicHVibGljXCIpLFxuICAgICAgICBwcmVmaXg6IFwiL2FwaS9wdWJsaWNcIixcbiAgICAgIH0sXG4gICAgICBjdXN0b206IChzZXJ2ZXIpID0+IHtcbiAgICAgICAgLy8gT0F1dGgg7L2c67CxIOKAlCBBbnRocm9waWPsnbQgL2NhbGxiYWNr7Jy866GcIOumrOuLpOydtOugie2KuFxuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2NhbGxiYWNrXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgY29kZSwgc3RhdGUgfSA9IHJlcXVlc3QucXVlcnkgYXMgeyBjb2RlPzogc3RyaW5nOyBzdGF0ZT86IHN0cmluZyB9O1xuICAgICAgICAgIGlmICghY29kZSB8fCAhc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPW1pc3NpbmdfcGFyYW1zXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIFFncmlkRnJhbWUuaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlLCBzdGF0ZSwgcmVwbHkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcbiAgICAgICAgICAgICAgYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE9wZW5BSSBPQXV0aCDripQgY29kZXggYXBwLXNlcnZlciDqsIAg7J6Q7LK0IGNhbGxiYWNrIOyEnOuyhOulvCDsmKzrprxcbiAgICAgICAgLy8gaGFuZGxlT3BlbkFJQ2FsbGJhY2sg67aI7ZWE7JqUIOKAlCBvYXV0aENvbXBsZXRlT3BlbkFJIEFQSSDroZwg7JmE66OMIO2ZleyduFxuICAgICAgfSxcbiAgICB9LFxuICAgIGFwaUNvbmZpZzoge1xuICAgICAgY29udGV4dFByb3ZpZGVyOiAoZGVmYXVsdENvbnRleHQsIHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZWZhdWx0Q29udGV4dCxcbiAgICAgICAgICBpcDogcmVxdWVzdC5pcCxcbiAgICAgICAgICBib2R5OiByZXF1ZXN0LmJvZHksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZ3VhcmRIYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgIGNhY2hlQ29udHJvbEhhbmRsZXI6IChyZXEpID0+IHtcbiAgICAgICAgc3dpdGNoIChyZXEudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJhc3NldHNcIjpcbiAgICAgICAgICAgIC8vIEhhc2gg7Y+s7ZWo65CcIO2MjOydvDog7JiB6rWsIOy6kOyLnFxuICAgICAgICAgICAgaWYgKHJlcS5wYXRoLm1hdGNoKC8tW2EtZjAtOV0rXFwuLykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmxvbmdMaXZlZDtcblxuICAgICAgICAgIGNhc2UgXCJhcGlcIjpcbiAgICAgICAgICAgIC8vIEdFVCDsmpTssq3rp4wg7LqQ7IuxIOqzoOugpFxuICAgICAgICAgICAgaWYgKHJlcS5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAgICAgLy8g7Yq57KCVIOqyveuhnOuKlCDsp6fsnYAg7LqQ7IucXG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS9zdGF0aWMtZGF0YVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvdGVybXNcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm1lZGl1bUxpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDquLDrs7g6IOy6kOyLnCDsl4bsnYxcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubm9DYWNoZTtcblxuICAgICAgICAgIGNhc2UgXCJzc3JcIjpcbiAgICAgICAgICAgIC8vIFNTUiDtjpjsnbTsp4A6IDEw7LSIIOy6kOyLnFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zc3I7XG5cbiAgICAgICAgICBjYXNlIFwiY3NyXCI6XG4gICAgICAgICAgICAvLyBDU1IgZmFsbGJhY2sgKGluZGV4Lmh0bWwpOiAx67aEIOy6kOyLnFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubm9DYWNoZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjYWNoZToge1xuICAgICAgZGVmYXVsdDogXCJtYWluXCIsXG4gICAgICBzdG9yZXM6IHtcbiAgICAgICAgbWFpbjogc3RvcmUoKS51c2VMMUxheWVyKGNhY2hlRHJpdmVycy5tZW1vcnkoeyBtYXhTaXplOiBcIjUwbWJcIiB9KSksXG4gICAgICB9LFxuICAgICAgdHRsOiBcIjVtXCIsXG4gICAgICBwcmVmaXg6IFwiXCIsXG4gICAgfSxcbiAgICBsaWZlY3ljbGU6IHtcbiAgICAgIG9uU3RhcnQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG5cbiAgICAgICAgbGV0IHRyaWdnZXJSZWFkeSA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlVG9rZW5zVHJpZ2dlcihjb25uQ29uZmlnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgIGxvZy53YXJuKGB0cmlnZ2VyIHNldHVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBuZXcgVG9rZW5TdWJzY3JpYmVyKGNvbm5Db25maWcsIFFncmlkRGlzcGF0Y2hlcik7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcblxuICAgICAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgc3Vic2NyaWJlci5zdGFydCgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IG5ldyBPcGVuQUlEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyID0gb3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy53YXJuKGBvcGVuYWkgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFudGhyb3BpY0Rpc3BhdGNoZXIgPSBuZXcgQW50aHJvcGljRGlzcGF0Y2hlcigpO1xuICAgICAgICAgIGF3YWl0IGFudGhyb3BpY0Rpc3BhdGNoZXIuc3RhcnQoKTtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlciA9IGFudGhyb3BpY0Rpc3BhdGNoZXI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2cud2FybihgYW50aHJvcGljIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYW50aHJvcGljQ291bnQgPSBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8udG9rZW5Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlSZWFkeSA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5yZWFkeVdvcmtlckNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IG9wZW5haVRvdGFsID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LndvcmtlckNvdW50ID8/IDA7XG5cbiAgICAgICAgbG9nLmluZm8oYGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgIGxvZy5pbmZvKGBhbnRocm9waWM6ICR7YW50aHJvcGljQ291bnR9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhgb3BlbmFpOiAke29wZW5haVJlYWR5fS8ke29wZW5haVRvdGFsfSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYHN1YnNjcmliZXI6ICR7c3RhcnRlZCA/IFwiTElTVEVOIGFjdGl2ZVwiIDogXCJkZWdyYWRlZFwifSR7dHJpZ2dlclJlYWR5ID8gXCJcIiA6IFwiLCB0cmlnZ2VyIGZhaWxlZFwifWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25TaHV0ZG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oXCJncmFjZWZ1bCBzaHV0ZG93blwiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZXJyb3IsIF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBoYW5kbGVTZXJ2ZXJFcnJvcihlcnJvciwgcmVwbHkpO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBaUJBLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxLQUFLO0FBRTdDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsTUFBTSxPQUFPLFFBQVEsSUFBSSxr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
187
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHsgUWdyaWREaXNwYXRjaGVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgUWdyaWRGcmFtZSB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lXCI7XG5pbXBvcnQgeyBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBlbnN1cmVUb2tlbnNUcmlnZ2VyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tdHJpZ2dlci1zZXR1cFwiO1xuaW1wb3J0IHsgaGFuZGxlU2VydmVyRXJyb3IgfSBmcm9tIFwiLi9zZXJ2ZXItZXJyb3ItaGFuZGxlclwiO1xuaW1wb3J0IHsgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5cbmNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5IT1NUID8/IFwibG9jYWxob3N0XCI7XG5jb25zdCBwb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQgPz8gNDQ5MDApO1xuXG5jb25zdCBjb25uQ29uZmlnID0ge1xuICBob3N0OiBwcm9jZXNzLmVudi5TT05BTVVfREJfSE9TVCA/PyBcImxvY2FsaG9zdFwiLFxuICBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BPUlQgPz8gNTQzMiksXG4gIHVzZXI6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9VU0VSID8/IFwicG9zdGdyZXNcIixcbiAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9QQVNTV09SRCA/PyBcInBvc3RncmVzXCIsXG4gIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5TT05BTVVfREJfTkFNRSA/PyBcInFncmlkXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBwcm9qZWN0TmFtZTogcHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FID8/IFwiUWdyaWRcIixcbiAgZGF0YWJhc2U6IHtcbiAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5jb25uQ29uZmlnLFxuICAgICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpczogMTAwMDAsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGFwaToge1xuICAgIGRpcjogXCJhcGlcIixcbiAgICB0aW1lem9uZTogXCJBc2lhL1Nlb3VsXCIsXG4gICAgcm91dGU6IHtcbiAgICAgIHByZWZpeDogXCIvYXBpXCIsXG4gICAgfSxcbiAgfSxcbiAgaTE4bjoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwia29cIixcbiAgICBzdXBwb3J0ZWRMb2NhbGVzOiBbXCJrb1wiLCBcImVuXCJdLFxuICB9LFxuICBzeW5jOiB7XG4gICAgdGFyZ2V0czogW1wid2ViXCJdLFxuICB9LFxuICB0ZXN0OiB7XG4gICAgcGFyYWxsZWw6IHRydWUsXG4gICAgbWF4V29ya2VyczogNCxcbiAgICBkZXZSdW5uZXI6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICB9LFxuICBsb2dnaW5nOiB7XG4gICAgc2lua3M6IHtcbiAgICAgIGNvbnNvbGU6IGdldENvbnNvbGVTaW5rKHtcbiAgICAgICAgZm9ybWF0dGVyOiBnZXRQcmV0dHlGb3JtYXR0ZXIoe1xuICAgICAgICAgIHRpbWVzdGFtcDogXCJ0aW1lXCIsXG4gICAgICAgICAgY2F0ZWdvcnlXaWR0aDogMjAsXG4gICAgICAgICAgY2F0ZWdvcnlUcnVuY2F0ZTogXCJtaWRkbGVcIixcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIC8vIE1vbml0IO2DreyaqSBpbi1tZW1vcnkgcmluZyBidWZmZXIuIO2PrOunt+ydgCBzaW5rIOuzhCDigJQg7L2Y7IaUIOy2nOugpeydgCDqt7jrjIDroZzri6QuXG4gICAgICBtb25pdDogbW9uaXRMb2dTaW5rLFxuICAgIH0sXG4gICAgbG9nZ2VyczogW1xuICAgICAgLy8gcWdyaWQg66Gc6re4ICjsmpTssq0g67aE67CwLCBvYXV0aC91c2FnZSBBUEkpXG4gICAgICB7IGNhdGVnb3J5OiBbXCJxZ3JpZFwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwiaW5mb1wiIH0sXG4gICAgICAvLyBzb25hbXUg66Gc6re464qUIHdhcm5pbmcg7J207IOB66eMXG4gICAgICB7IGNhdGVnb3J5OiBbXCJzb25hbXVcIl0sIHNpbmtzOiBbXCJjb25zb2xlXCIsIFwibW9uaXRcIl0sIGxvd2VzdExldmVsOiBcIndhcm5pbmdcIiB9LFxuICAgICAgLy8gZmFzdGlmeSDroZzqt7gg7LCo64uoXG4gICAgICB7IGNhdGVnb3J5OiBbXCJmYXN0aWZ5XCJdLCBzaW5rczogW10sIGxvd2VzdExldmVsOiBcImZhdGFsXCIgfSxcbiAgICBdLFxuICB9LFxuICBzZXJ2ZXI6IHtcbiAgICBsaXN0ZW46IHsgcG9ydCwgaG9zdCB9LFxuICAgIGZhc3RpZnk6IHtcbiAgICAgIGJvZHlMaW1pdDogMTAgKiAxMDI0ICogMTAyNCxcbiAgICB9LFxuICAgIHBsdWdpbnM6IHtcbiAgICAgIGZvcm1ib2R5OiB0cnVlLFxuICAgICAgcXM6IHRydWUsXG4gICAgICBzc2U6IHRydWUsXG4gICAgICBtdWx0aXBhcnQ6IHsgbGltaXRzOiB7IGZpbGVTaXplOiAxMDI0ICogMTAyNCAqIDMwIH0gfSxcbiAgICAgIHN0YXRpYzoge1xuICAgICAgICByb290OiBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIvLi4vXCIsIFwicHVibGljXCIpLFxuICAgICAgICBwcmVmaXg6IFwiL2FwaS9wdWJsaWNcIixcbiAgICAgIH0sXG4gICAgICBjdXN0b206IChzZXJ2ZXIpID0+IHtcbiAgICAgICAgLy8gT0F1dGgg7L2c67CxIOKAlCBBbnRocm9waWPsnbQgL2NhbGxiYWNr7Jy866GcIOumrOuLpOydtOugie2KuFxuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2NhbGxiYWNrXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgY29kZSwgc3RhdGUgfSA9IHJlcXVlc3QucXVlcnkgYXMgeyBjb2RlPzogc3RyaW5nOyBzdGF0ZT86IHN0cmluZyB9O1xuICAgICAgICAgIGlmICghY29kZSB8fCAhc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPW1pc3NpbmdfcGFyYW1zXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIFFncmlkRnJhbWUuaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlLCBzdGF0ZSwgcmVwbHkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcbiAgICAgICAgICAgICAgYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE9wZW5BSSBPQXV0aCDripQgY29kZXggYXBwLXNlcnZlciDqsIAg7J6Q7LK0IGNhbGxiYWNrIOyEnOuyhOulvCDsmKzrprxcbiAgICAgICAgLy8gaGFuZGxlT3BlbkFJQ2FsbGJhY2sg67aI7ZWE7JqUIOKAlCBvYXV0aENvbXBsZXRlT3BlbkFJIEFQSSDroZwg7JmE66OMIO2ZleyduFxuICAgICAgfSxcbiAgICB9LFxuICAgIGFwaUNvbmZpZzoge1xuICAgICAgY29udGV4dFByb3ZpZGVyOiAoZGVmYXVsdENvbnRleHQsIHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZWZhdWx0Q29udGV4dCxcbiAgICAgICAgICBpcDogcmVxdWVzdC5pcCxcbiAgICAgICAgICBib2R5OiByZXF1ZXN0LmJvZHksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZ3VhcmRIYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgIGNhY2hlQ29udHJvbEhhbmRsZXI6IChyZXEpID0+IHtcbiAgICAgICAgc3dpdGNoIChyZXEudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJhc3NldHNcIjpcbiAgICAgICAgICAgIC8vIEhhc2gg7Y+s7ZWo65CcIO2MjOydvDog7JiB6rWsIOy6kOyLnFxuICAgICAgICAgICAgaWYgKHJlcS5wYXRoLm1hdGNoKC8tW2EtZjAtOV0rXFwuLykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmxvbmdMaXZlZDtcblxuICAgICAgICAgIGNhc2UgXCJhcGlcIjpcbiAgICAgICAgICAgIC8vIEdFVCDsmpTssq3rp4wg7LqQ7IuxIOqzoOugpFxuICAgICAgICAgICAgaWYgKHJlcS5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAgICAgLy8g7Yq57KCVIOqyveuhnOuKlCDsp6fsnYAg7LqQ7IucXG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS9zdGF0aWMtZGF0YVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvdGVybXNcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm1lZGl1bUxpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDquLDrs7g6IOy6kOyLnCDsl4bsnYxcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubm9DYWNoZTtcblxuICAgICAgICAgIGNhc2UgXCJzc3JcIjpcbiAgICAgICAgICAgIC8vIFNTUiDtjpjsnbTsp4A6IDEw7LSIIOy6kOyLnFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zc3I7XG5cbiAgICAgICAgICBjYXNlIFwiY3NyXCI6XG4gICAgICAgICAgICAvLyBDU1IgZmFsbGJhY2sgKGluZGV4Lmh0bWwpOiAx67aEIOy6kOyLnFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubm9DYWNoZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjYWNoZToge1xuICAgICAgZGVmYXVsdDogXCJtYWluXCIsXG4gICAgICBzdG9yZXM6IHtcbiAgICAgICAgbWFpbjogc3RvcmUoKS51c2VMMUxheWVyKGNhY2hlRHJpdmVycy5tZW1vcnkoeyBtYXhTaXplOiBcIjUwbWJcIiB9KSksXG4gICAgICB9LFxuICAgICAgdHRsOiBcIjVtXCIsXG4gICAgICBwcmVmaXg6IFwiXCIsXG4gICAgfSxcbiAgICBsaWZlY3ljbGU6IHtcbiAgICAgIG9uU3RhcnQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG5cbiAgICAgICAgbGV0IHRyaWdnZXJSZWFkeSA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlVG9rZW5zVHJpZ2dlcihjb25uQ29uZmlnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgIGxvZy53YXJuKGB0cmlnZ2VyIHNldHVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBuZXcgVG9rZW5TdWJzY3JpYmVyKGNvbm5Db25maWcsIFFncmlkRGlzcGF0Y2hlcik7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcblxuICAgICAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgc3Vic2NyaWJlci5zdGFydCgpO1xuXG4gICAgICAgIC8vIOq4sOuPmSDsg4Htg5zrpbwg64Ko6ri064ukIOKAlCBIVFRQIOuKlCDsnbTrr7gg7Je066CkIOyeiOyWtOyEnCwg7KSA67mEIOyghCDsmpTssq3snbQgXCLsnqDsi5wg7ZuEIOuQmOuKlOyngFwiXG4gICAgICAgIC8vIFwi7J6s7Iuc64+E7ZW064+EIOyViCDrkJjripTsp4BcIuulvCDqtazrtoTtlbQg7J2R64u17ZW07JW8IO2VnOuLpCg1MDMgdnMgNTAwKS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5vcGVuYWkgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBvcGVuYWkgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFudGhyb3BpY0Rpc3BhdGNoZXIgPSBuZXcgQW50aHJvcGljRGlzcGF0Y2hlcigpO1xuICAgICAgICAgIGF3YWl0IGFudGhyb3BpY0Rpc3BhdGNoZXIuc3RhcnQoKTtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlciA9IGFudGhyb3BpY0Rpc3BhdGNoZXI7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcInJlYWR5XCI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLmFudGhyb3BpYyA9IFwiZmFpbGVkXCI7XG4gICAgICAgICAgbG9nLndhcm4oYGFudGhyb3BpYyBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFudGhyb3BpY0NvdW50ID0gUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnRva2VuQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpUmVhZHkgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ucmVhZHlXb3JrZXJDb3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlUb3RhbCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy53b3JrZXJDb3VudCA/PyAwO1xuXG4gICAgICAgIGxvZy5pbmZvKGBsaXN0ZW5pbmcgb24gaHR0cDovLyR7aG9zdH06JHtwb3J0fWApO1xuICAgICAgICBsb2cuaW5mbyhgYW50aHJvcGljOiAke2FudGhyb3BpY0NvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oYG9wZW5haTogJHtvcGVuYWlSZWFkeX0vJHtvcGVuYWlUb3RhbH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBzdWJzY3JpYmVyOiAke3N0YXJ0ZWQgPyBcIkxJU1RFTiBhY3RpdmVcIiA6IFwiZGVncmFkZWRcIn0ke3RyaWdnZXJSZWFkeSA/IFwiXCIgOiBcIiwgdHJpZ2dlciBmYWlsZWRcIn1gLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9uU2h1dGRvd246IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKFwiZ3JhY2VmdWwgc2h1dGRvd25cIik7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGVycm9yLCBfcmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgaGFuZGxlU2VydmVyRXJyb3IoZXJyb3IsIHJlcGx5KTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQWlCQSxNQUFNLE9BQU8sUUFBUSxJQUFJLFFBQVE7QUFDakMsTUFBTSxPQUFPLE9BQU8sUUFBUSxJQUFJLFFBQVEsS0FBSztBQUU3QyxNQUFNLGFBQWE7Q0FDakIsTUFBTSxRQUFRLElBQUksa0JBQWtCO0NBQ3BDLE1BQU0sT0FBTyxRQUFRLElBQUksa0JBQWtCLElBQUk7Q0FDL0MsTUFBTSxRQUFRLElBQUksa0JBQWtCO0NBQ3BDLFVBQVUsUUFBUSxJQUFJLHNCQUFzQjtDQUM1QyxVQUFVLFFBQVEsSUFBSSxrQkFBa0I7QUFDMUM7QUFFQSxJQUFBLHdCQUFlLGFBQWE7Q0FDMUIsYUFBYSxRQUFRLElBQUksZ0JBQWdCO0NBQ3pDLFVBQVUsRUFDUixnQkFBZ0IsRUFDZCxZQUFZO0VBQ1YsR0FBRztFQUNILFdBQVc7RUFDWCw2QkFBNkI7Q0FDL0IsRUFDRixFQUNGO0NBQ0EsS0FBSztFQUNILEtBQUs7RUFDTCxVQUFVO0VBQ1YsT0FBTyxFQUNMLFFBQVEsT0FDVjtDQUNGO0NBQ0EsTUFBTTtFQUNKLGVBQWU7RUFDZixrQkFBa0IsQ0FBQyxNQUFNLElBQUk7Q0FDL0I7Q0FDQSxNQUFNLEVBQ0osU0FBUyxDQUFDLEtBQUssRUFDakI7Q0FDQSxNQUFNO0VBQ0osVUFBVTtFQUNWLFlBQVk7RUFDWixXQUFXLEVBQUUsU0FBUyxLQUFLO0NB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
@@ -1,4 +1,5 @@
1
1
  import { TokenModel } from "../../../application/token/token.model.js";
2
+ import { deactivateAuthDeadToken } from "../../../application/qgrid/token-death.js";
2
3
  import { OPENAI_CLIENT_ID, OPENAI_TOKEN_URL } from "./openai-constants.js";
3
4
  import { getLogger } from "@logtape/logtape";
4
5
  //#region src/utils/providers/openai/openai-refresh.ts
@@ -11,6 +12,11 @@ import { getLogger } from "@logtape/logtape";
11
12
  * - rotation 감지: 새 refresh_token 있으면 DB 즉시 업데이트
12
13
  */
13
14
  const logger = getLogger(["qgrid", "openai-refresh"]);
15
+ const PERMANENT_FAILURE_CODES = /* @__PURE__ */ new Set([
16
+ "refresh_token_expired",
17
+ "refresh_token_reused",
18
+ "refresh_token_invalidated"
19
+ ]);
14
20
  const inflightRefresh = /* @__PURE__ */ new Map();
15
21
  const lastRefreshTime = /* @__PURE__ */ new Map();
16
22
  const REFRESH_MIN_INTERVAL_MS = 5e3;
@@ -67,6 +73,11 @@ async function doRefresh(tokenId) {
67
73
  errorCode = JSON.parse(body).error;
68
74
  } catch {}
69
75
  logger.error(`OpenAI refresh FAILED token=${token.name}(id=${tokenId}) status=${resp.status} code=${errorCode ?? "?"} body=${body}`);
76
+ if (errorCode && PERMANENT_FAILURE_CODES.has(errorCode)) await deactivateAuthDeadToken({
77
+ id: tokenId,
78
+ name: token.name,
79
+ provider: "openai"
80
+ }, creds.refreshToken, `openai:${errorCode}`);
70
81
  throw new Error(`OpenAI refresh failed: ${resp.status} ${body}`);
71
82
  }
72
83
  const data = await resp.json();
@@ -101,4 +112,4 @@ async function doRefresh(tokenId) {
101
112
  //#endregion
102
113
  export { handleChatgptAuthTokensRefresh };
103
114
 
104
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlZnJlc2guanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLXJlZnJlc2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUkgY2hhdGdwdEF1dGhUb2tlbnMgcmVmcmVzaCBoYW5kbGVyLlxuICpcbiAqIC0gY29kZXggYXBwLXNlcnZlciDqsIAgNDAxIOuwm+ycvOuptCBgYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoYCBzZXJ2ZXItcmVxdWVzdCDrpbwg67O064OEXG4gKiAtIHFncmlkIOqwgCBEQiDsnZggcmVmcmVzaF90b2tlbiDsnLzroZwg7IOIIGFjY2Vzc190b2tlbiDsnYQg67Cc6riJ67Cb7JWEIOydkeuLtVxuICogLSBwZXItdG9rZW4gaW5mbGlnaHQgcHJvbWlzZSDroZwgY29uY3VycmVudCByZWZyZXNoIGRlZHVwXG4gKiAtIHJvdGF0aW9uIOqwkOyngDog7IOIIHJlZnJlc2hfdG9rZW4g7J6I7Jy866m0IERCIOymieyLnCDsl4XrjbDsnbTtirhcbiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvcGVuYWktcmVmcmVzaFwiXSk7XG5cbmltcG9ydCB7IE9QRU5BSV9DTElFTlRfSUQsIE9QRU5BSV9UT0tFTl9VUkwgfSBmcm9tIFwiLi9vcGVuYWktY29uc3RhbnRzXCI7XG5cbi8vIHBlci10b2tlbiBpbmZsaWdodCBwcm9taXNlIGRlZHVwICsgbWluaW11bSBpbnRlcnZhbFxuY29uc3QgaW5mbGlnaHRSZWZyZXNoID0gbmV3IE1hcDxudW1iZXIsIFByb21pc2U8UmVmcmVzaFJlc3VsdD4+KCk7XG5jb25zdCBsYXN0UmVmcmVzaFRpbWUgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuY29uc3QgUkVGUkVTSF9NSU5fSU5URVJWQUxfTVMgPSA1XzAwMDtcblxuaW50ZXJmYWNlIFJlZnJlc2hSZXN1bHQge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBjaGF0Z3B0QWNjb3VudElkOiBzdHJpbmc7XG4gIGNoYXRncHRQbGFuVHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPFJlZnJlc2hSZXN1bHQ+IHtcbiAgbG9nZ2VyLmluZm8oYHJlZnJlc2ggcmVxdWVzdGVkIGZvciB0b2tlbiAke3Rva2VuSWR9IChwaWQ9JHtwcm9jZXNzLnBpZH0pYCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gaW5mbGlnaHRSZWZyZXNoLmdldCh0b2tlbklkKTtcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgbG9nZ2VyLmluZm8oYHJlZnJlc2ggZGVkdXAgZm9yIHRva2VuICR7dG9rZW5JZH1gKTtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBjb25zdCBsYXN0QXQgPSBsYXN0UmVmcmVzaFRpbWUuZ2V0KHRva2VuSWQpID8/IDA7XG4gIGlmIChEYXRlLm5vdygpIC0gbGFzdEF0IDwgUkVGUkVTSF9NSU5fSU5URVJWQUxfTVMpIHtcbiAgICBsb2dnZXIuaW5mbyhgcmVmcmVzaCB0b28gc29vbiBmb3IgdG9rZW4gJHt0b2tlbklkfSwgcmVhZGluZyBjdXJyZW50IGNyZWRzIGZyb20gREJgKTtcbiAgICByZXR1cm4gcmVhZEN1cnJlbnRDcmVkcyh0b2tlbklkKTtcbiAgfVxuXG4gIGxhc3RSZWZyZXNoVGltZS5zZXQodG9rZW5JZCwgRGF0ZS5ub3coKSk7XG4gIGNvbnN0IHByb21pc2UgPSBkb1JlZnJlc2godG9rZW5JZCk7XG4gIGluZmxpZ2h0UmVmcmVzaC5zZXQodG9rZW5JZCwgcHJvbWlzZSk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpbmZsaWdodFJlZnJlc2guZGVsZXRlKHRva2VuSWQpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDdXJyZW50Q3JlZHModG9rZW5JZDogbnVtYmVyKTogUHJvbWlzZTxSZWZyZXNoUmVzdWx0PiB7XG4gIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiB0b2tlbklkIH0pO1xuICBpZiAoIXRva2VuIHx8IHRva2VuLnByb3ZpZGVyICE9PSBcIm9wZW5haVwiKSB0aHJvdyBuZXcgRXJyb3IoYHRva2VuICR7dG9rZW5JZH0gbm90IGZvdW5kYCk7XG4gIGNvbnN0IGNyZWRzID0gdG9rZW4uY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHM7XG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLFxuICAgIGNoYXRncHRBY2NvdW50SWQ6IGNyZWRzLmFjY291bnRJZCxcbiAgICBjaGF0Z3B0UGxhblR5cGU6IGNyZWRzLnBsYW5UeXBlLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb1JlZnJlc2godG9rZW5JZDogbnVtYmVyKTogUHJvbWlzZTxSZWZyZXNoUmVzdWx0PiB7XG4gIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiB0b2tlbklkIH0pO1xuICBpZiAoIXRva2VuIHx8IHRva2VuLnByb3ZpZGVyICE9PSBcIm9wZW5haVwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0b2tlbiAke3Rva2VuSWR9IG5vdCBmb3VuZCBvciBub3Qgb3BlbmFpYCk7XG4gIH1cblxuICBjb25zdCBjcmVkcyA9IHRva2VuLmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzO1xuICBpZiAoIWNyZWRzLnJlZnJlc2hUb2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgdG9rZW4gJHt0b2tlbklkfSBoYXMgbm8gcmVmcmVzaFRva2VuYCk7XG4gIH1cblxuICBsb2dnZXIuaW5mbyhgcmVmcmVzaGluZyB0b2tlbiAke3Rva2VuLm5hbWV9IChpZD0ke3Rva2VuSWR9KWApO1xuXG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChPUEVOQUlfVE9LRU5fVVJMLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgfSxcbiAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgIGdyYW50X3R5cGU6IFwicmVmcmVzaF90b2tlblwiLFxuICAgICAgY2xpZW50X2lkOiBPUEVOQUlfQ0xJRU5UX0lELFxuICAgICAgcmVmcmVzaF90b2tlbjogY3JlZHMucmVmcmVzaFRva2VuLFxuICAgIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3Aub2spIHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIik7XG4gICAgLy8gNDAxIOuzuOusuOydmCBlcnJvciDsvZTrk5zqsIAg7Yag7YGwIOyCrOunneydmCDqsrDsoJXsoIEg7IKs7J247J2064ukLlxuICAgIC8vICAgcmVmcmVzaF90b2tlbl9leHBpcmVkICAgICDihpIgcmVmcmVzaF90b2tlbiDsnpDssrQg66eM66OMXG4gICAgLy8gICByZWZyZXNoX3Rva2VuX3JldXNlZCAgICAgIOKGkiDsnbTrr7gg7IKs7Jqp65CcKO2ajOyghCDtj5DquLDrkJwpIHJlZnJlc2hfdG9rZW4g7J6s7IKs7JqpIOKGkiDtjKjrsIDrpqwg66y07Zqo7ZmUXG4gICAgLy8gICByZWZyZXNoX3Rva2VuX2ludmFsaWRhdGVkIOKGkiDshJzrsoTsuKEgcmV2b2tlXG4gICAgLy8g7JyEIDPqsJzripQg66qo65GQIOyYgeq1rCDsi6TtjKguIOyerOuTseuhnSDsmbgg67O16rWsIOu2iOqwgC5cbiAgICBsZXQgZXJyb3JDb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGVycm9yQ29kZSA9IChKU09OLnBhcnNlKGJvZHkpIGFzIHsgZXJyb3I/OiBzdHJpbmcgfSkuZXJyb3I7XG4gICAgfSBjYXRjaCB7fVxuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgIGBPcGVuQUkgcmVmcmVzaCBGQUlMRUQgdG9rZW49JHt0b2tlbi5uYW1lfShpZD0ke3Rva2VuSWR9KSBzdGF0dXM9JHtyZXNwLnN0YXR1c30gYCArXG4gICAgICAgIGBjb2RlPSR7ZXJyb3JDb2RlID8/IFwiP1wifSBib2R5PSR7Ym9keX1gLFxuICAgICk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPcGVuQUkgcmVmcmVzaCBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICR7Ym9keX1gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoX3Rva2VuPzogc3RyaW5nO1xuICAgIGV4cGlyZXNfaW4/OiBudW1iZXI7XG4gICAgaWRfdG9rZW4/OiBzdHJpbmc7XG4gIH07XG5cbiAgY29uc3QgbmV3UmVmcmVzaFRva2VuID0gZGF0YS5yZWZyZXNoX3Rva2VuID8/IGNyZWRzLnJlZnJlc2hUb2tlbjtcbiAgY29uc3Qgcm90YXRlZCA9XG4gICAgZGF0YS5yZWZyZXNoX3Rva2VuICE9PSBudWxsICYmXG4gICAgZGF0YS5yZWZyZXNoX3Rva2VuICE9PSB1bmRlZmluZWQgJiZcbiAgICBkYXRhLnJlZnJlc2hfdG9rZW4gIT09IGNyZWRzLnJlZnJlc2hUb2tlbjtcbiAgaWYgKHJvdGF0ZWQpIHtcbiAgICBsb2dnZXIuaW5mbyhgcmVmcmVzaF90b2tlbiByb3RhdGVkIGZvciB0b2tlbiAke3Rva2VuLm5hbWV9YCk7XG4gIH1cblxuICBjb25zdCB1cGRhdGVkQ3JlZHM6IE9wZW5BSUNyZWRlbnRpYWxzID0ge1xuICAgIC4uLmNyZWRzLFxuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICByZWZyZXNoVG9rZW46IG5ld1JlZnJlc2hUb2tlbixcbiAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogZGF0YS5leHBpcmVzX2luXG4gICAgICA/IERhdGUubm93KCkgKyBkYXRhLmV4cGlyZXNfaW4gKiAxMDAwXG4gICAgICA6IGNyZWRzLmFjY2Vzc1Rva2VuRXhwaXJlc0F0LFxuICAgIC4uLihkYXRhLmlkX3Rva2VuID8geyBpZFRva2VuOiBkYXRhLmlkX3Rva2VuIH0gOiB7fSksXG4gIH07XG5cbiAgLy8g7ZqM7KCEKHJvdGF0ZWQp7J20IOydvOyWtOuCrOuKlOuNsCDsnbQgc2F2ZSDqsIAg7Iuk7Yyo7ZWY66m0LCBPcGVuQUkg7Kq9IOyYmyByZWZyZXNoX3Rva2VuIOydgCDsnbTrr7hcbiAgLy8g7Y+Q6riw65CcIOyDge2DnOyXkOyEnCBEQiDsl5DripQg7JibIO2GoO2BsOydtCDrgqjripTri6Qg4oaSIOuLpOydjCByZWZyZXNoIOqwgCByZWZyZXNoX3Rva2VuX3JldXNlZCDroZxcbiAgLy8g7JiB6rWsIOyCrOunnS4g7J20IOq1rOqwhCDsi6TtjKjripQg7Yag7YGwIOyCrOunneydmCDsp4HsoJEg7JuQ7J247J2066+A66GcIOuwmOuTnOyLnCDtgazqsowg64Ko6ri064ukLlxuICB0cnkge1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbklkLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWRDcmVkcyxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICBgT3BlbkFJIHJlZnJlc2g6IERCIHNhdmUgRkFJTEVEIGFmdGVyIHJvdGF0aW9uKHJvdGF0ZWQ9JHtyb3RhdGVkfSkgYCArXG4gICAgICAgIGB0b2tlbj0ke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW5JZH0pIOKAlCDsmJsgcmVmcmVzaF90b2tlbiDtj5DquLDrkKgsIERCIOuvuOuwmOyYgSDihpIg7Yag7YGwIOyCrOunnSDsnITtl5guIGVycj0ke1N0cmluZyhlKX1gLFxuICAgICk7XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGB0b2tlbiAke3Rva2VuLm5hbWV9IHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgKHJvdGF0ZWQ9JHtyb3RhdGVkfSlgKTtcblxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICBjaGF0Z3B0QWNjb3VudElkOiBjcmVkcy5hY2NvdW50SWQsXG4gICAgY2hhdGdwdFBsYW5UeXBlOiBjcmVkcy5wbGFuVHlwZSxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBYUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBS3BELE1BQU0sa0NBQWtCLElBQUksSUFBb0M7QUFDaEUsTUFBTSxrQ0FBa0IsSUFBSSxJQUFvQjtBQUNoRCxNQUFNLDBCQUEwQjtBQVFoQyxlQUFzQiwrQkFBK0IsU0FBeUM7Q0FDNUYsT0FBTyxLQUFLLCtCQUErQixRQUFRLFFBQVEsUUFBUSxJQUFJLEVBQUU7Q0FDekUsTUFBTSxXQUFXLGdCQUFnQixJQUFJLE9BQU87Q0FDNUMsSUFBSSxVQUFVO0VBQ1osT0FBTyxLQUFLLDJCQUEyQixTQUFTO0VBQ2hELE9BQU87Q0FDVDtDQUVBLE1BQU0sU0FBUyxnQkFBZ0IsSUFBSSxPQUFPLEtBQUs7Q0FDL0MsSUFBSSxLQUFLLElBQUksSUFBSSxTQUFTLHlCQUF5QjtFQUNqRCxPQUFPLEtBQUssOEJBQThCLFFBQVEs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
115
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlZnJlc2guanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLXJlZnJlc2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUkgY2hhdGdwdEF1dGhUb2tlbnMgcmVmcmVzaCBoYW5kbGVyLlxuICpcbiAqIC0gY29kZXggYXBwLXNlcnZlciDqsIAgNDAxIOuwm+ycvOuptCBgYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoYCBzZXJ2ZXItcmVxdWVzdCDrpbwg67O064OEXG4gKiAtIHFncmlkIOqwgCBEQiDsnZggcmVmcmVzaF90b2tlbiDsnLzroZwg7IOIIGFjY2Vzc190b2tlbiDsnYQg67Cc6riJ67Cb7JWEIOydkeuLtVxuICogLSBwZXItdG9rZW4gaW5mbGlnaHQgcHJvbWlzZSDroZwgY29uY3VycmVudCByZWZyZXNoIGRlZHVwXG4gKiAtIHJvdGF0aW9uIOqwkOyngDog7IOIIHJlZnJlc2hfdG9rZW4g7J6I7Jy866m0IERCIOymieyLnCDsl4XrjbDsnbTtirhcbiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgZGVhY3RpdmF0ZUF1dGhEZWFkVG9rZW4gfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tZGVhdGhcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib3BlbmFpLXJlZnJlc2hcIl0pO1xuXG5pbXBvcnQgeyBPUEVOQUlfQ0xJRU5UX0lELCBPUEVOQUlfVE9LRU5fVVJMIH0gZnJvbSBcIi4vb3BlbmFpLWNvbnN0YW50c1wiO1xuXG4vLyDsnqzroZzqt7jsnbgg7Jm4IOuzteq1rCDrtojqsIDtlZwgcmVmcmVzaCDsi6TtjKgg7L2U65OcLiDslrTripAg6rKD7J2065OgIO2GoO2BsOydtCDso73sl4jri6TripQg7ZmV7KCVIOyLoO2YuOuLpC5cbmNvbnN0IFBFUk1BTkVOVF9GQUlMVVJFX0NPREVTID0gbmV3IFNldChbXG4gIFwicmVmcmVzaF90b2tlbl9leHBpcmVkXCIsXG4gIFwicmVmcmVzaF90b2tlbl9yZXVzZWRcIixcbiAgXCJyZWZyZXNoX3Rva2VuX2ludmFsaWRhdGVkXCIsXG5dKTtcblxuLy8gcGVyLXRva2VuIGluZmxpZ2h0IHByb21pc2UgZGVkdXAgKyBtaW5pbXVtIGludGVydmFsXG5jb25zdCBpbmZsaWdodFJlZnJlc2ggPSBuZXcgTWFwPG51bWJlciwgUHJvbWlzZTxSZWZyZXNoUmVzdWx0Pj4oKTtcbmNvbnN0IGxhc3RSZWZyZXNoVGltZSA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG5jb25zdCBSRUZSRVNIX01JTl9JTlRFUlZBTF9NUyA9IDVfMDAwO1xuXG5pbnRlcmZhY2UgUmVmcmVzaFJlc3VsdCB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGNoYXRncHRBY2NvdW50SWQ6IHN0cmluZztcbiAgY2hhdGdwdFBsYW5UeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoKHRva2VuSWQ6IG51bWJlcik6IFByb21pc2U8UmVmcmVzaFJlc3VsdD4ge1xuICBsb2dnZXIuaW5mbyhgcmVmcmVzaCByZXF1ZXN0ZWQgZm9yIHRva2VuICR7dG9rZW5JZH0gKHBpZD0ke3Byb2Nlc3MucGlkfSlgKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBpbmZsaWdodFJlZnJlc2guZ2V0KHRva2VuSWQpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBsb2dnZXIuaW5mbyhgcmVmcmVzaCBkZWR1cCBmb3IgdG9rZW4gJHt0b2tlbklkfWApO1xuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIGNvbnN0IGxhc3RBdCA9IGxhc3RSZWZyZXNoVGltZS5nZXQodG9rZW5JZCkgPz8gMDtcbiAgaWYgKERhdGUubm93KCkgLSBsYXN0QXQgPCBSRUZSRVNIX01JTl9JTlRFUlZBTF9NUykge1xuICAgIGxvZ2dlci5pbmZvKGByZWZyZXNoIHRvbyBzb29uIGZvciB0b2tlbiAke3Rva2VuSWR9LCByZWFkaW5nIGN1cnJlbnQgY3JlZHMgZnJvbSBEQmApO1xuICAgIHJldHVybiByZWFkQ3VycmVudENyZWRzKHRva2VuSWQpO1xuICB9XG5cbiAgbGFzdFJlZnJlc2hUaW1lLnNldCh0b2tlbklkLCBEYXRlLm5vdygpKTtcbiAgY29uc3QgcHJvbWlzZSA9IGRvUmVmcmVzaCh0b2tlbklkKTtcbiAgaW5mbGlnaHRSZWZyZXNoLnNldCh0b2tlbklkLCBwcm9taXNlKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICB9IGZpbmFsbHkge1xuICAgIGluZmxpZ2h0UmVmcmVzaC5kZWxldGUodG9rZW5JZCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEN1cnJlbnRDcmVkcyh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPFJlZnJlc2hSZXN1bHQ+IHtcbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQ6IHRva2VuSWQgfSk7XG4gIGlmICghdG9rZW4gfHwgdG9rZW4ucHJvdmlkZXIgIT09IFwib3BlbmFpXCIpIHRocm93IG5ldyBFcnJvcihgdG9rZW4gJHt0b2tlbklkfSBub3QgZm91bmRgKTtcbiAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscyBhcyBPcGVuQUlDcmVkZW50aWFscztcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NUb2tlbjogY3JlZHMuYWNjZXNzVG9rZW4sXG4gICAgY2hhdGdwdEFjY291bnRJZDogY3JlZHMuYWNjb3VudElkLFxuICAgIGNoYXRncHRQbGFuVHlwZTogY3JlZHMucGxhblR5cGUsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvUmVmcmVzaCh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPFJlZnJlc2hSZXN1bHQ+IHtcbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQ6IHRva2VuSWQgfSk7XG4gIGlmICghdG9rZW4gfHwgdG9rZW4ucHJvdmlkZXIgIT09IFwib3BlbmFpXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRva2VuICR7dG9rZW5JZH0gbm90IGZvdW5kIG9yIG5vdCBvcGVuYWlgKTtcbiAgfVxuXG4gIGNvbnN0IGNyZWRzID0gdG9rZW4uY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHM7XG4gIGlmICghY3JlZHMucmVmcmVzaFRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0b2tlbiAke3Rva2VuSWR9IGhhcyBubyByZWZyZXNoVG9rZW5gKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGByZWZyZXNoaW5nIHRva2VuICR7dG9rZW4ubmFtZX0gKGlkPSR7dG9rZW5JZH0pYCk7XG5cbiAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKE9QRU5BSV9UT0tFTl9VUkwsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiB9LFxuICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgZ3JhbnRfdHlwZTogXCJyZWZyZXNoX3Rva2VuXCIsXG4gICAgICBjbGllbnRfaWQ6IE9QRU5BSV9DTElFTlRfSUQsXG4gICAgICByZWZyZXNoX3Rva2VuOiBjcmVkcy5yZWZyZXNoVG9rZW4sXG4gICAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcC5vaykge1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLnRleHQoKS5jYXRjaCgoKSA9PiBcIlwiKTtcbiAgICAvLyA0MDEg67O466y47J2YIGVycm9yIOy9lOuTnOqwgCDthqDtgbAg7IKs66ed7J2YIOqysOygleyggSDsgqzsnbjsnbTri6QuXG4gICAgLy8gICByZWZyZXNoX3Rva2VuX2V4cGlyZWQgICAgIOKGkiByZWZyZXNoX3Rva2VuIOyekOyytCDrp4zro4xcbiAgICAvLyAgIHJlZnJlc2hfdG9rZW5fcmV1c2VkICAgICAg4oaSIOydtOuvuCDsgqzsmqnrkJwo7ZqM7KCEIO2PkOq4sOuQnCkgcmVmcmVzaF90b2tlbiDsnqzsgqzsmqkg4oaSIO2MqOuwgOumrCDrrLTtmqjtmZRcbiAgICAvLyAgIHJlZnJlc2hfdG9rZW5faW52YWxpZGF0ZWQg4oaSIOyEnOuyhOy4oSByZXZva2VcbiAgICAvLyDsnIQgM+qwnOuKlCDrqqjrkZAg7JiB6rWsIOyLpO2MqC4g7J6s65Ox66GdIOyZuCDrs7Xqtawg67aI6rCALlxuICAgIGxldCBlcnJvckNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgZXJyb3JDb2RlID0gKEpTT04ucGFyc2UoYm9keSkgYXMgeyBlcnJvcj86IHN0cmluZyB9KS5lcnJvcjtcbiAgICB9IGNhdGNoIHt9XG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgYE9wZW5BSSByZWZyZXNoIEZBSUxFRCB0b2tlbj0ke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW5JZH0pIHN0YXR1cz0ke3Jlc3Auc3RhdHVzfSBgICtcbiAgICAgICAgYGNvZGU9JHtlcnJvckNvZGUgPz8gXCI/XCJ9IGJvZHk9JHtib2R5fWAsXG4gICAgKTtcbiAgICAvLyDsmIHqtawg7Iuk7Yyo64qUIGVycm9yQ29kZSDroZzrp4wg7YyQ7KCV7ZWc64ukIOKAlCBzdGF0dXMg66W8IO2VqOq7mCDsmpTqtaztlZjrqbQgcHJvdmlkZXIg6rCAXG4gICAgLy8g7IOB7YOc7L2U65Oc66W8IOuwlOq/gCDrlYwg7YyQ7KCV7J20IOyhsOyaqe2eiCDrqY7ripTri6QuXG4gICAgaWYgKGVycm9yQ29kZSAmJiBQRVJNQU5FTlRfRkFJTFVSRV9DT0RFUy5oYXMoZXJyb3JDb2RlKSkge1xuICAgICAgYXdhaXQgZGVhY3RpdmF0ZUF1dGhEZWFkVG9rZW4oXG4gICAgICAgIHsgaWQ6IHRva2VuSWQsIG5hbWU6IHRva2VuLm5hbWUsIHByb3ZpZGVyOiBcIm9wZW5haVwiIH0sXG4gICAgICAgIGNyZWRzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgYG9wZW5haToke2Vycm9yQ29kZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPcGVuQUkgcmVmcmVzaCBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICR7Ym9keX1gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoX3Rva2VuPzogc3RyaW5nO1xuICAgIGV4cGlyZXNfaW4/OiBudW1iZXI7XG4gICAgaWRfdG9rZW4/OiBzdHJpbmc7XG4gIH07XG5cbiAgY29uc3QgbmV3UmVmcmVzaFRva2VuID0gZGF0YS5yZWZyZXNoX3Rva2VuID8/IGNyZWRzLnJlZnJlc2hUb2tlbjtcbiAgY29uc3Qgcm90YXRlZCA9XG4gICAgZGF0YS5yZWZyZXNoX3Rva2VuICE9PSBudWxsICYmXG4gICAgZGF0YS5yZWZyZXNoX3Rva2VuICE9PSB1bmRlZmluZWQgJiZcbiAgICBkYXRhLnJlZnJlc2hfdG9rZW4gIT09IGNyZWRzLnJlZnJlc2hUb2tlbjtcbiAgaWYgKHJvdGF0ZWQpIHtcbiAgICBsb2dnZXIuaW5mbyhgcmVmcmVzaF90b2tlbiByb3RhdGVkIGZvciB0b2tlbiAke3Rva2VuLm5hbWV9YCk7XG4gIH1cblxuICBjb25zdCB1cGRhdGVkQ3JlZHM6IE9wZW5BSUNyZWRlbnRpYWxzID0ge1xuICAgIC4uLmNyZWRzLFxuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICByZWZyZXNoVG9rZW46IG5ld1JlZnJlc2hUb2tlbixcbiAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogZGF0YS5leHBpcmVzX2luXG4gICAgICA/IERhdGUubm93KCkgKyBkYXRhLmV4cGlyZXNfaW4gKiAxMDAwXG4gICAgICA6IGNyZWRzLmFjY2Vzc1Rva2VuRXhwaXJlc0F0LFxuICAgIC4uLihkYXRhLmlkX3Rva2VuID8geyBpZFRva2VuOiBkYXRhLmlkX3Rva2VuIH0gOiB7fSksXG4gIH07XG5cbiAgLy8g7ZqM7KCEKHJvdGF0ZWQp7J20IOydvOyWtOuCrOuKlOuNsCDsnbQgc2F2ZSDqsIAg7Iuk7Yyo7ZWY66m0LCBPcGVuQUkg7Kq9IOyYmyByZWZyZXNoX3Rva2VuIOydgCDsnbTrr7hcbiAgLy8g7Y+Q6riw65CcIOyDge2DnOyXkOyEnCBEQiDsl5DripQg7JibIO2GoO2BsOydtCDrgqjripTri6Qg4oaSIOuLpOydjCByZWZyZXNoIOqwgCByZWZyZXNoX3Rva2VuX3JldXNlZCDroZxcbiAgLy8g7JiB6rWsIOyCrOunnS4g7J20IOq1rOqwhCDsi6TtjKjripQg7Yag7YGwIOyCrOunneydmCDsp4HsoJEg7JuQ7J247J2066+A66GcIOuwmOuTnOyLnCDtgazqsowg64Ko6ri064ukLlxuICB0cnkge1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbklkLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWRDcmVkcyxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICBgT3BlbkFJIHJlZnJlc2g6IERCIHNhdmUgRkFJTEVEIGFmdGVyIHJvdGF0aW9uKHJvdGF0ZWQ9JHtyb3RhdGVkfSkgYCArXG4gICAgICAgIGB0b2tlbj0ke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW5JZH0pIOKAlCDsmJsgcmVmcmVzaF90b2tlbiDtj5DquLDrkKgsIERCIOuvuOuwmOyYgSDihpIg7Yag7YGwIOyCrOunnSDsnITtl5guIGVycj0ke1N0cmluZyhlKX1gLFxuICAgICk7XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGB0b2tlbiAke3Rva2VuLm5hbWV9IHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgKHJvdGF0ZWQ9JHtyb3RhdGVkfSlgKTtcblxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICBjaGF0Z3B0QWNjb3VudElkOiBjcmVkcy5hY2NvdW50SWQsXG4gICAgY2hhdGdwdFBsYW5UeXBlOiBjcmVkcy5wbGFuVHlwZSxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWNBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztBQUtwRCxNQUFNLDBDQUEwQixJQUFJLElBQUk7Q0FDdEM7Q0FDQTtDQUNBO0FBQ0YsQ0FBQztBQUdELE1BQU0sa0NBQWtCLElBQUksSUFBb0M7QUFDaEUsTUFBTSxrQ0FBa0IsSUFBSSxJQUFvQjtBQUNoRCxNQUFNLDBCQUEwQjtBQVFoQyxlQUFzQiwrQkFBK0IsU0FBeUM7Q0FDNUYsT0FBTyxLQUFLLCtCQUErQixRQUFRLFFBQVEsUUFBUSxJQUFJLEVBQUU7Q0FDekUsTUFBTSxXQUFXLGdCQUFnQixJQUFJLE9BQU87Q0FDNUMsSUFBSSxVQUFVO0VBQ1osT0FBTyxLQUFLLDJCQUEyQixTQUFTO0VBQ2hELE9BQU87Q0FDVDtDQUVBLE1BQU0sU0FBUyxnQkFBZ0IsSUFBSSxPQUFPLEtBQUs7Q0FDL0MsSUFBSSxLQUFLLElBQUksSUFBSSxTQUFTLHlCQUF5QjtFQUNqRCxPQUFPLEtBQUssOEJBQThCLFFBQVEsZ0NBQWdDO0VBQ2xGLE9BQU8saUJBQWlCLE9BQU87Q0FDakM7Q0FFQSxnQkFBZ0IsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDO0NBQ3ZDLE1BQU0s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
@@ -0,0 +1,65 @@
1
+ import { getLogger } from "@logtape/logtape";
2
+ //#region src/utils/slack-notify.ts
3
+ /**
4
+ * Slack 알림 (chat.postMessage).
5
+ *
6
+ * fail-open: env 미설정이면 조용히 no-op 이고, 전송 실패는 warn 로그로만 남긴다.
7
+ * 알림 경로가 토큰 라우팅이나 오류 전파를 지연·차단해서는 안 된다.
8
+ */
9
+ const logger = getLogger(["qgrid", "slack"]);
10
+ const SLACK_POST_MESSAGE_URL = "https://slack.com/api/chat.postMessage";
11
+ const SLACK_TIMEOUT_MS = 5e3;
12
+ /** 상태를 색으로 먼저 읽히게 하는 attachment 색상 바. */
13
+ const SLACK_COLOR = {
14
+ good: "#2eb886",
15
+ bad: "#e01e5a"
16
+ };
17
+ async function notifySlack(notification) {
18
+ const botToken = process.env.SLACK_BOT_TOKEN;
19
+ const channel = process.env.SLACK_CHANNEL_ID;
20
+ const { title, subject, context, color } = notification;
21
+ if (!botToken || !channel) {
22
+ logger.debug(`slack not configured, skipping notification: ${title} ${subject ?? ""}`);
23
+ return;
24
+ }
25
+ const blocks = [{
26
+ type: "section",
27
+ text: {
28
+ type: "mrkdwn",
29
+ text: subject ? `*${title}* \`${subject}\`` : `*${title}*`
30
+ }
31
+ }];
32
+ if (context) blocks.push({
33
+ type: "context",
34
+ elements: [{
35
+ type: "mrkdwn",
36
+ text: context
37
+ }]
38
+ });
39
+ try {
40
+ const res = await fetch(SLACK_POST_MESSAGE_URL, {
41
+ method: "POST",
42
+ headers: {
43
+ "Content-Type": "application/json; charset=utf-8",
44
+ Authorization: `Bearer ${botToken}`
45
+ },
46
+ body: JSON.stringify({
47
+ channel,
48
+ text: subject ? `${title} — ${subject}` : title,
49
+ attachments: [{
50
+ ...color ? { color } : {},
51
+ blocks
52
+ }]
53
+ }),
54
+ signal: AbortSignal.timeout(SLACK_TIMEOUT_MS)
55
+ });
56
+ const body = await res.json().catch(() => null);
57
+ if (!body?.ok) logger.warn(`slack notification rejected: ${body?.error ?? `http ${res.status}`}`);
58
+ } catch (e) {
59
+ logger.warn(`slack notification failed: ${e.message}`);
60
+ }
61
+ }
62
+ //#endregion
63
+ export { SLACK_COLOR, notifySlack };
64
+
65
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zbGFjay1ub3RpZnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTbGFjayDslYzrprwgKGNoYXQucG9zdE1lc3NhZ2UpLlxuICpcbiAqIGZhaWwtb3BlbjogZW52IOuvuOyEpOygleydtOuptCDsobDsmqntnoggbm8tb3Ag7J206rOgLCDsoITshqEg7Iuk7Yyo64qUIHdhcm4g66Gc6re466Gc66eMIOuCqOq4tOuLpC5cbiAqIOyVjOumvCDqsr3roZzqsIAg7Yag7YGwIOudvOyasO2MheydtOuCmCDsmKTrpZgg7KCE7YyM66W8IOyngOyXsMK37LCo64uo7ZW07ISc64qUIOyViCDrkJzri6QuXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInNsYWNrXCJdKTtcblxuY29uc3QgU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCA9IFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2NoYXQucG9zdE1lc3NhZ2VcIjtcbmNvbnN0IFNMQUNLX1RJTUVPVVRfTVMgPSA1XzAwMDtcblxuLyoqIOyDge2DnOulvCDsg4nsnLzroZwg66i87KCAIOydve2eiOqyjCDtlZjripQgYXR0YWNobWVudCDsg4nsg4Eg67CULiAqL1xuZXhwb3J0IGNvbnN0IFNMQUNLX0NPTE9SID0ge1xuICBnb29kOiBcIiMyZWI4ODZcIixcbiAgYmFkOiBcIiNlMDFlNWFcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNsYWNrTm90aWZpY2F0aW9uID0ge1xuICAvKiog7ZWcIOykhCDsoJzrqqkuIOustOyKqCDsnbzsnbQg7J287Ja064Ks64qU7KeA66eMIOuLtOuKlOuLpC4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIOygnOuqqSDsmIYg7L2U65OcIOyKpO2DgOydvOuhnCDrtpnripQg64yA7IOBIOyLneuzhOyekC4gKi9cbiAgc3ViamVjdD86IHN0cmluZztcbiAgLyoqIOygnOuqqSDslYTrnpgg7J6R7J2AIOq4gOyUqOuhnCDrgrTroKTqsIDripQg67aA6rCAIOygleuztCDigJQg7J297KeAIOyViuyVhOuPhCDrkJjripQg6rKD65OkLiAqL1xuICBjb250ZXh0Pzogc3RyaW5nO1xuICBjb2xvcj86ICh0eXBlb2YgU0xBQ0tfQ09MT1IpW2tleW9mIHR5cGVvZiBTTEFDS19DT0xPUl07XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm90aWZ5U2xhY2sobm90aWZpY2F0aW9uOiBTbGFja05vdGlmaWNhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBib3RUb2tlbiA9IHByb2Nlc3MuZW52LlNMQUNLX0JPVF9UT0tFTjtcbiAgY29uc3QgY2hhbm5lbCA9IHByb2Nlc3MuZW52LlNMQUNLX0NIQU5ORUxfSUQ7XG4gIGNvbnN0IHsgdGl0bGUsIHN1YmplY3QsIGNvbnRleHQsIGNvbG9yIH0gPSBub3RpZmljYXRpb247XG4gIGlmICghYm90VG9rZW4gfHwgIWNoYW5uZWwpIHtcbiAgICBsb2dnZXIuZGVidWcoYHNsYWNrIG5vdCBjb25maWd1cmVkLCBza2lwcGluZyBub3RpZmljYXRpb246ICR7dGl0bGV9ICR7c3ViamVjdCA/PyBcIlwifWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJsb2NrczogdW5rbm93bltdID0gW1xuICAgIHtcbiAgICAgIHR5cGU6IFwic2VjdGlvblwiLFxuICAgICAgdGV4dDogeyB0eXBlOiBcIm1ya2R3blwiLCB0ZXh0OiBzdWJqZWN0ID8gYCoke3RpdGxlfSogIFxcYCR7c3ViamVjdH1cXGBgIDogYCoke3RpdGxlfSpgIH0sXG4gICAgfSxcbiAgXTtcbiAgaWYgKGNvbnRleHQpIHtcbiAgICBibG9ja3MucHVzaCh7IHR5cGU6IFwiY29udGV4dFwiLCBlbGVtZW50czogW3sgdHlwZTogXCJtcmtkd25cIiwgdGV4dDogY29udGV4dCB9XSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtib3RUb2tlbn1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgLy8g7JWM66a8IOuvuOumrOuztOq4sMK37KCR6re87ISx7JqpIOuMgOyytCDthY3siqTtirguIGJsb2NrcyDrp4wg67O064K066m0IO2RuOyLnCDslYzrprzsnbQg67mI7Lm47Jy866GcIOucrOuLpC5cbiAgICAgICAgdGV4dDogc3ViamVjdCA/IGAke3RpdGxlfSDigJQgJHtzdWJqZWN0fWAgOiB0aXRsZSxcbiAgICAgICAgYXR0YWNobWVudHM6IFt7IC4uLihjb2xvciA/IHsgY29sb3IgfSA6IHt9KSwgYmxvY2tzIH1dLFxuICAgICAgfSksXG4gICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoU0xBQ0tfVElNRU9VVF9NUyksXG4gICAgfSk7XG5cbiAgICAvLyBib3Qg66+47LSI64yAKG5vdF9pbl9jaGFubmVsKcK37J6Y66q765CcIOyxhOuEkCDrk7Eg6rCA7J6lIO2dlO2VnCDsmKTshKTsoJXsnYAgSFRUUCAyMDAgKyBvazpmYWxzZSDroZwg7Jio64ukLlxuICAgIC8vIHN0YXR1cyDrp4wg67O066m0IOyhsOyaqe2eiCDshLHqs7Ug7LKY66as64+8IOyVjOumvOydtCDthrXsp7jroZwg7IKs65287KeE64ukLlxuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKSkgYXMgeyBvaz86IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0gfCBudWxsO1xuICAgIGlmICghYm9keT8ub2spIHtcbiAgICAgIGxvZ2dlci53YXJuKGBzbGFjayBub3RpZmljYXRpb24gcmVqZWN0ZWQ6ICR7Ym9keT8uZXJyb3IgPz8gYGh0dHAgJHtyZXMuc3RhdHVzfWB9YCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLndhcm4oYHNsYWNrIG5vdGlmaWNhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsT0FBTyxDQUFDO0FBRTNDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sbUJBQW1COztBQUd6QixNQUFhLGNBQWM7Q0FDekIsTUFBTTtDQUNOLEtBQUs7QUFDUDtBQVlBLGVBQXNCLFlBQVksY0FBZ0Q7Q0FDaEYsTUFBTSxXQUFXLFFBQVEsSUFBSTtDQUM3QixNQUFNLFVBQVUsUUFBUSxJQUFJO0NBQzVCLE1BQU0sRUFBRSxPQUFPLFNBQVMsU0FBUyxVQUFVO0NBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUztFQUN6QixPQUFPLE1BQU0sZ0RBQWdELE1BQU0sR0FBRyxXQUFXLElBQUk7RUFDckY7Q0FDRjtDQUVBLE1BQU0sU0FBb0IsQ0FDeEI7RUFDRSxNQUFNO0VBQ04sTUFBTTtHQUFFLE1BQU07R0FBVSxNQUFNLFVBQVUsSUFBSSxNQUFNLE9BQU8sUUFBUSxNQUFNLElBQUksTUFBTTtFQUFHO0NBQ3RGLENBQ0Y7Q0FDQSxJQUFJLFNBQ0YsT0FBTyxLQUFLO0VBQUUsTUFBTTtFQUFXLFVBQVUsQ0FBQztHQUFFLE1BQU07R0FBVSxNQUFNO0VBQVEsQ0FBQztDQUFFLENBQUM7Q0FHaEYsSUFBSTtFQUNGLE1BQU0sTUFBTSxNQUFNLE1BQU0sd0JBQXdCO0dBQzlDLFFBQVE7R0FDUixTQUFTO0lBQ1AsZ0JBQWdCO0lBQ2hCLGVBQWUsVUFBVTtHQUMzQjtHQUNBLE1BQU0sS0FBSyxVQUFVO0lBQ25CO0lBRUEsTUFBTSxVQUFVLEdBQUcsTUFBTSxLQUFLLFlBQVk7SUFDMUMsYUFBYSxDQUFDO0tBQUUsR0FBSSxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUM7S0FBSTtJQUFPLENBQUM7R0FDdkQsQ0FBQztHQUNELFFBQVEsWUFBWSxRQUFRLGdCQUFnQjtFQUM5QyxDQUFDO0VBSUQsTUFBTSxPQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxZQUFZLElBQUk7RUFDL0MsSUFBSSxDQUFDLE1BQU0sSUFDVCxPQUFPLEtBQUssZ0NBQWdDLE1BQU0sU0FBUyxRQUFRLElBQUksVUFBVTtDQUVyRixTQUFTLEdBQUc7RUFDVixPQUFPLEtBQUssOEJBQStCLEVBQVksU0FBUztDQUNsRTtBQUNGIn0=