@decaf-ts/integrations 0.3.5 → 0.3.7

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 (272) hide show
  1. package/dist/integrations.cjs +1608 -7
  2. package/dist/integrations.js +1841 -5
  3. package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +13 -5
  4. package/lib/cjs/graph/nodes/base.cjs +35 -0
  5. package/lib/cjs/graph/nodes/flow-control.cjs +31 -3
  6. package/lib/cjs/graph/nodes/index.cjs +3 -2
  7. package/lib/cjs/graph/types.cjs +2 -2
  8. package/lib/cjs/index.cjs +6 -5
  9. package/lib/cjs/namespaces/index.cjs +26 -0
  10. package/lib/cjs/namespaces/models/authorization-model.cjs +12 -0
  11. package/lib/cjs/namespaces/models/effective-permission.model.cjs +95 -0
  12. package/lib/cjs/namespaces/models/group-membership.model.cjs +66 -0
  13. package/lib/cjs/namespaces/models/group.model.cjs +74 -0
  14. package/lib/cjs/namespaces/models/index.cjs +39 -0
  15. package/lib/cjs/namespaces/models/inheritance-block.model.cjs +76 -0
  16. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +66 -0
  17. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +73 -0
  18. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +64 -0
  19. package/lib/cjs/namespaces/models/org-unit.model.cjs +102 -0
  20. package/lib/cjs/namespaces/models/permission.model.cjs +64 -0
  21. package/lib/cjs/namespaces/models/principal.model.cjs +77 -0
  22. package/lib/cjs/namespaces/models/protected-resource.model.cjs +99 -0
  23. package/lib/cjs/namespaces/models/resource-grant.model.cjs +88 -0
  24. package/lib/cjs/namespaces/models/role-assignment.model.cjs +98 -0
  25. package/lib/cjs/namespaces/models/role-permission.model.cjs +55 -0
  26. package/lib/cjs/namespaces/models/role.model.cjs +84 -0
  27. package/lib/cjs/namespaces/models/storage-binding.model.cjs +85 -0
  28. package/lib/cjs/namespaces/models/tenant-membership.model.cjs +67 -0
  29. package/lib/cjs/namespaces/models/tenant-profile.model.cjs +64 -0
  30. package/lib/cjs/namespaces/models/tenant.model.cjs +88 -0
  31. package/lib/cjs/namespaces/models/user.model.cjs +75 -0
  32. package/lib/cjs/namespaces/org-based-authorization-system.cjs +286 -0
  33. package/lib/cjs/namespaces/org-based-authorization-system.models.cjs +968 -0
  34. package/lib/cjs/namespaces/org-based-authorization-system.services.cjs +1046 -0
  35. package/lib/cjs/namespaces/services/authz.service.cjs +76 -0
  36. package/lib/cjs/namespaces/services/bootstrap.service.cjs +112 -0
  37. package/lib/cjs/namespaces/services/effective-permission.service.cjs +150 -0
  38. package/lib/cjs/namespaces/services/group-membership.service.cjs +42 -0
  39. package/lib/cjs/namespaces/services/group.service.cjs +30 -0
  40. package/lib/cjs/namespaces/services/index.cjs +42 -0
  41. package/lib/cjs/namespaces/services/inheritance-block.service.cjs +32 -0
  42. package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +55 -0
  43. package/lib/cjs/namespaces/services/org-unit-membership.service.cjs +34 -0
  44. package/lib/cjs/namespaces/services/org-unit-profile.service.cjs +23 -0
  45. package/lib/cjs/namespaces/services/org-unit.service.cjs +160 -0
  46. package/lib/cjs/namespaces/services/permission.service.cjs +29 -0
  47. package/lib/cjs/namespaces/services/principal.service.cjs +35 -0
  48. package/lib/cjs/namespaces/services/protected-resource.service.cjs +43 -0
  49. package/lib/cjs/namespaces/services/resource-grant.service.cjs +45 -0
  50. package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs +24 -0
  51. package/lib/cjs/namespaces/services/role-assignment.service.cjs +41 -0
  52. package/lib/cjs/namespaces/services/role-permission.service.cjs +51 -0
  53. package/lib/cjs/namespaces/services/role.service.cjs +45 -0
  54. package/lib/cjs/namespaces/services/storage-binding.service.cjs +39 -0
  55. package/lib/cjs/namespaces/services/system-management.service.cjs +102 -0
  56. package/lib/cjs/namespaces/services/tenant-membership.service.cjs +33 -0
  57. package/lib/cjs/namespaces/services/tenant-profile.service.cjs +28 -0
  58. package/lib/cjs/namespaces/services/tenant.service.cjs +36 -0
  59. package/lib/cjs/namespaces/services/user.service.cjs +32 -0
  60. package/lib/cjs/namespaces/types.cjs +67 -0
  61. package/lib/cjs/namespaces/utils.cjs +161 -0
  62. package/lib/cjs/nest/authService.cjs +5 -2
  63. package/lib/cjs/nest/graph/GraphExecutionController.cjs +153 -0
  64. package/lib/cjs/nest/graph/GraphExecutionModule.cjs +84 -0
  65. package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs +82 -0
  66. package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs +66 -0
  67. package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +35 -0
  68. package/lib/cjs/nest/graph/index.cjs +28 -0
  69. package/lib/cjs/nest/index.cjs +3 -2
  70. package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +12 -4
  71. package/lib/esm/graph/nodes/base.js +30 -0
  72. package/lib/esm/graph/nodes/flow-control.js +31 -3
  73. package/lib/esm/graph/nodes/index.js +2 -1
  74. package/lib/esm/graph/types.js +1 -1
  75. package/lib/esm/index.js +5 -4
  76. package/lib/esm/namespaces/index.js +9 -0
  77. package/lib/esm/namespaces/models/authorization-model.js +7 -0
  78. package/lib/esm/namespaces/models/effective-permission.model.js +86 -0
  79. package/lib/esm/namespaces/models/group-membership.model.js +57 -0
  80. package/lib/esm/namespaces/models/group.model.js +65 -0
  81. package/lib/esm/namespaces/models/index.js +22 -0
  82. package/lib/esm/namespaces/models/inheritance-block.model.js +67 -0
  83. package/lib/esm/namespaces/models/org-unit-closure.model.js +57 -0
  84. package/lib/esm/namespaces/models/org-unit-membership.model.js +64 -0
  85. package/lib/esm/namespaces/models/org-unit-profile.model.js +55 -0
  86. package/lib/esm/namespaces/models/org-unit.model.js +93 -0
  87. package/lib/esm/namespaces/models/permission.model.js +55 -0
  88. package/lib/esm/namespaces/models/principal.model.js +68 -0
  89. package/lib/esm/namespaces/models/protected-resource.model.js +90 -0
  90. package/lib/esm/namespaces/models/resource-grant.model.js +79 -0
  91. package/lib/esm/namespaces/models/role-assignment.model.js +89 -0
  92. package/lib/esm/namespaces/models/role-permission.model.js +46 -0
  93. package/lib/esm/namespaces/models/role.model.js +75 -0
  94. package/lib/esm/namespaces/models/storage-binding.model.js +76 -0
  95. package/lib/esm/namespaces/models/tenant-membership.model.js +58 -0
  96. package/lib/esm/namespaces/models/tenant-profile.model.js +55 -0
  97. package/lib/esm/namespaces/models/tenant.model.js +79 -0
  98. package/lib/esm/namespaces/models/user.model.js +66 -0
  99. package/lib/esm/namespaces/org-based-authorization-system.js +283 -0
  100. package/lib/esm/namespaces/org-based-authorization-system.models.js +958 -0
  101. package/lib/esm/namespaces/org-based-authorization-system.services.js +1014 -0
  102. package/lib/esm/namespaces/services/authz.service.js +71 -0
  103. package/lib/esm/namespaces/services/bootstrap.service.js +102 -0
  104. package/lib/esm/namespaces/services/effective-permission.service.js +140 -0
  105. package/lib/esm/namespaces/services/group-membership.service.js +37 -0
  106. package/lib/esm/namespaces/services/group.service.js +25 -0
  107. package/lib/esm/namespaces/services/index.js +25 -0
  108. package/lib/esm/namespaces/services/inheritance-block.service.js +27 -0
  109. package/lib/esm/namespaces/services/org-unit-closure.service.js +50 -0
  110. package/lib/esm/namespaces/services/org-unit-membership.service.js +29 -0
  111. package/lib/esm/namespaces/services/org-unit-profile.service.js +18 -0
  112. package/lib/esm/namespaces/services/org-unit.service.js +150 -0
  113. package/lib/esm/namespaces/services/permission.service.js +24 -0
  114. package/lib/esm/namespaces/services/principal.service.js +30 -0
  115. package/lib/esm/namespaces/services/protected-resource.service.js +38 -0
  116. package/lib/esm/namespaces/services/resource-grant.service.js +40 -0
  117. package/lib/esm/namespaces/services/resource-lifecycle.service.js +19 -0
  118. package/lib/esm/namespaces/services/role-assignment.service.js +36 -0
  119. package/lib/esm/namespaces/services/role-permission.service.js +46 -0
  120. package/lib/esm/namespaces/services/role.service.js +40 -0
  121. package/lib/esm/namespaces/services/storage-binding.service.js +34 -0
  122. package/lib/esm/namespaces/services/system-management.service.js +92 -0
  123. package/lib/esm/namespaces/services/tenant-membership.service.js +28 -0
  124. package/lib/esm/namespaces/services/tenant-profile.service.js +23 -0
  125. package/lib/esm/namespaces/services/tenant.service.js +31 -0
  126. package/lib/esm/namespaces/services/user.service.js +27 -0
  127. package/lib/esm/namespaces/types.js +71 -0
  128. package/lib/esm/namespaces/utils.js +143 -0
  129. package/lib/esm/nest/authService.js +4 -1
  130. package/lib/esm/nest/graph/GraphExecutionController.js +144 -0
  131. package/lib/esm/nest/graph/GraphExecutionModule.js +76 -0
  132. package/lib/esm/nest/graph/GraphExecutionResultModel.js +73 -0
  133. package/lib/esm/nest/graph/GraphExecutionResultRepository.js +60 -0
  134. package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +31 -0
  135. package/lib/esm/nest/graph/index.js +11 -0
  136. package/lib/esm/nest/index.js +2 -1
  137. package/lib/types/graph/nodes/base.d.cts +28 -0
  138. package/lib/types/graph/nodes/base.d.mts +28 -0
  139. package/lib/types/graph/nodes/flow-control.d.cts +9 -1
  140. package/lib/types/graph/nodes/flow-control.d.mts +9 -1
  141. package/lib/types/graph/nodes/index.d.cts +1 -0
  142. package/lib/types/graph/nodes/index.d.mts +1 -0
  143. package/lib/types/graph/types.d.cts +15 -1
  144. package/lib/types/graph/types.d.mts +15 -1
  145. package/lib/types/index.d.cts +3 -2
  146. package/lib/types/index.d.mts +3 -2
  147. package/lib/types/namespaces/index.d.cts +8 -0
  148. package/lib/types/namespaces/index.d.mts +8 -0
  149. package/lib/types/namespaces/models/authorization-model.d.cts +4 -0
  150. package/lib/types/namespaces/models/authorization-model.d.mts +4 -0
  151. package/lib/types/namespaces/models/effective-permission.model.d.cts +18 -0
  152. package/lib/types/namespaces/models/effective-permission.model.d.mts +18 -0
  153. package/lib/types/namespaces/models/group-membership.model.d.cts +13 -0
  154. package/lib/types/namespaces/models/group-membership.model.d.mts +13 -0
  155. package/lib/types/namespaces/models/group.model.d.cts +15 -0
  156. package/lib/types/namespaces/models/group.model.d.mts +15 -0
  157. package/lib/types/namespaces/models/index.d.cts +21 -0
  158. package/lib/types/namespaces/models/index.d.mts +21 -0
  159. package/lib/types/namespaces/models/inheritance-block.model.d.cts +15 -0
  160. package/lib/types/namespaces/models/inheritance-block.model.d.mts +15 -0
  161. package/lib/types/namespaces/models/org-unit-closure.model.d.cts +12 -0
  162. package/lib/types/namespaces/models/org-unit-closure.model.d.mts +12 -0
  163. package/lib/types/namespaces/models/org-unit-membership.model.d.cts +15 -0
  164. package/lib/types/namespaces/models/org-unit-membership.model.d.mts +15 -0
  165. package/lib/types/namespaces/models/org-unit-profile.model.d.cts +11 -0
  166. package/lib/types/namespaces/models/org-unit-profile.model.d.mts +11 -0
  167. package/lib/types/namespaces/models/org-unit.model.d.cts +23 -0
  168. package/lib/types/namespaces/models/org-unit.model.d.mts +23 -0
  169. package/lib/types/namespaces/models/permission.model.d.cts +11 -0
  170. package/lib/types/namespaces/models/permission.model.d.mts +11 -0
  171. package/lib/types/namespaces/models/principal.model.d.cts +16 -0
  172. package/lib/types/namespaces/models/principal.model.d.mts +16 -0
  173. package/lib/types/namespaces/models/protected-resource.model.d.cts +21 -0
  174. package/lib/types/namespaces/models/protected-resource.model.d.mts +21 -0
  175. package/lib/types/namespaces/models/resource-grant.model.d.cts +18 -0
  176. package/lib/types/namespaces/models/resource-grant.model.d.mts +18 -0
  177. package/lib/types/namespaces/models/role-assignment.model.d.cts +20 -0
  178. package/lib/types/namespaces/models/role-assignment.model.d.mts +20 -0
  179. package/lib/types/namespaces/models/role-permission.model.d.cts +10 -0
  180. package/lib/types/namespaces/models/role-permission.model.d.mts +10 -0
  181. package/lib/types/namespaces/models/role.model.d.cts +17 -0
  182. package/lib/types/namespaces/models/role.model.d.mts +17 -0
  183. package/lib/types/namespaces/models/storage-binding.model.d.cts +15 -0
  184. package/lib/types/namespaces/models/storage-binding.model.d.mts +15 -0
  185. package/lib/types/namespaces/models/tenant-membership.model.d.cts +13 -0
  186. package/lib/types/namespaces/models/tenant-membership.model.d.mts +13 -0
  187. package/lib/types/namespaces/models/tenant-profile.model.d.cts +11 -0
  188. package/lib/types/namespaces/models/tenant-profile.model.d.mts +11 -0
  189. package/lib/types/namespaces/models/tenant.model.d.cts +19 -0
  190. package/lib/types/namespaces/models/tenant.model.d.mts +19 -0
  191. package/lib/types/namespaces/models/user.model.d.cts +14 -0
  192. package/lib/types/namespaces/models/user.model.d.mts +14 -0
  193. package/lib/types/namespaces/org-based-authorization-system.d.cts +299 -0
  194. package/lib/types/namespaces/org-based-authorization-system.d.mts +299 -0
  195. package/lib/types/namespaces/org-based-authorization-system.models.d.cts +212 -0
  196. package/lib/types/namespaces/org-based-authorization-system.models.d.mts +212 -0
  197. package/lib/types/namespaces/org-based-authorization-system.services.d.cts +217 -0
  198. package/lib/types/namespaces/org-based-authorization-system.services.d.mts +217 -0
  199. package/lib/types/namespaces/services/authz.service.d.cts +10 -0
  200. package/lib/types/namespaces/services/authz.service.d.mts +10 -0
  201. package/lib/types/namespaces/services/bootstrap.service.d.cts +21 -0
  202. package/lib/types/namespaces/services/bootstrap.service.d.mts +21 -0
  203. package/lib/types/namespaces/services/effective-permission.service.d.cts +13 -0
  204. package/lib/types/namespaces/services/effective-permission.service.d.mts +13 -0
  205. package/lib/types/namespaces/services/group-membership.service.d.cts +10 -0
  206. package/lib/types/namespaces/services/group-membership.service.d.mts +10 -0
  207. package/lib/types/namespaces/services/group.service.d.cts +9 -0
  208. package/lib/types/namespaces/services/group.service.d.mts +9 -0
  209. package/lib/types/namespaces/services/index.d.cts +24 -0
  210. package/lib/types/namespaces/services/index.d.mts +24 -0
  211. package/lib/types/namespaces/services/inheritance-block.service.d.cts +10 -0
  212. package/lib/types/namespaces/services/inheritance-block.service.d.mts +10 -0
  213. package/lib/types/namespaces/services/org-unit-closure.service.d.cts +11 -0
  214. package/lib/types/namespaces/services/org-unit-closure.service.d.mts +11 -0
  215. package/lib/types/namespaces/services/org-unit-membership.service.d.cts +11 -0
  216. package/lib/types/namespaces/services/org-unit-membership.service.d.mts +11 -0
  217. package/lib/types/namespaces/services/org-unit-profile.service.d.cts +7 -0
  218. package/lib/types/namespaces/services/org-unit-profile.service.d.mts +7 -0
  219. package/lib/types/namespaces/services/org-unit.service.d.cts +18 -0
  220. package/lib/types/namespaces/services/org-unit.service.d.mts +18 -0
  221. package/lib/types/namespaces/services/permission.service.d.cts +10 -0
  222. package/lib/types/namespaces/services/permission.service.d.mts +10 -0
  223. package/lib/types/namespaces/services/principal.service.d.cts +11 -0
  224. package/lib/types/namespaces/services/principal.service.d.mts +11 -0
  225. package/lib/types/namespaces/services/protected-resource.service.d.cts +13 -0
  226. package/lib/types/namespaces/services/protected-resource.service.d.mts +13 -0
  227. package/lib/types/namespaces/services/resource-grant.service.d.cts +12 -0
  228. package/lib/types/namespaces/services/resource-grant.service.d.mts +12 -0
  229. package/lib/types/namespaces/services/resource-lifecycle.service.d.cts +10 -0
  230. package/lib/types/namespaces/services/resource-lifecycle.service.d.mts +10 -0
  231. package/lib/types/namespaces/services/role-assignment.service.d.cts +12 -0
  232. package/lib/types/namespaces/services/role-assignment.service.d.mts +12 -0
  233. package/lib/types/namespaces/services/role-permission.service.d.cts +12 -0
  234. package/lib/types/namespaces/services/role-permission.service.d.mts +12 -0
  235. package/lib/types/namespaces/services/role.service.d.cts +12 -0
  236. package/lib/types/namespaces/services/role.service.d.mts +12 -0
  237. package/lib/types/namespaces/services/storage-binding.service.d.cts +12 -0
  238. package/lib/types/namespaces/services/storage-binding.service.d.mts +12 -0
  239. package/lib/types/namespaces/services/system-management.service.d.cts +14 -0
  240. package/lib/types/namespaces/services/system-management.service.d.mts +14 -0
  241. package/lib/types/namespaces/services/tenant-membership.service.d.cts +11 -0
  242. package/lib/types/namespaces/services/tenant-membership.service.d.mts +11 -0
  243. package/lib/types/namespaces/services/tenant-profile.service.d.cts +8 -0
  244. package/lib/types/namespaces/services/tenant-profile.service.d.mts +8 -0
  245. package/lib/types/namespaces/services/tenant.service.d.cts +12 -0
  246. package/lib/types/namespaces/services/tenant.service.d.mts +12 -0
  247. package/lib/types/namespaces/services/user.service.d.cts +11 -0
  248. package/lib/types/namespaces/services/user.service.d.mts +11 -0
  249. package/lib/types/namespaces/types.d.cts +230 -0
  250. package/lib/types/namespaces/types.d.mts +230 -0
  251. package/lib/types/namespaces/utils.d.cts +68 -0
  252. package/lib/types/namespaces/utils.d.mts +68 -0
  253. package/lib/types/nest/authService.d.cts +1 -0
  254. package/lib/types/nest/authService.d.mts +1 -0
  255. package/lib/types/nest/graph/GraphExecutionController.d.cts +62 -0
  256. package/lib/types/nest/graph/GraphExecutionController.d.mts +62 -0
  257. package/lib/types/nest/graph/GraphExecutionModule.d.cts +39 -0
  258. package/lib/types/nest/graph/GraphExecutionModule.d.mts +39 -0
  259. package/lib/types/nest/graph/GraphExecutionResultModel.d.cts +46 -0
  260. package/lib/types/nest/graph/GraphExecutionResultModel.d.mts +46 -0
  261. package/lib/types/nest/graph/GraphExecutionResultRepository.d.cts +38 -0
  262. package/lib/types/nest/graph/GraphExecutionResultRepository.d.mts +38 -0
  263. package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.cts +17 -0
  264. package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.mts +17 -0
  265. package/lib/types/nest/graph/index.d.cts +10 -0
  266. package/lib/types/nest/graph/index.d.mts +10 -0
  267. package/lib/types/nest/index.d.cts +1 -0
  268. package/lib/types/nest/index.d.mts +1 -0
  269. package/package.json +16 -5
  270. package/sql/001_constraints.sql +11 -0
  271. package/sql/002_rls.sql +20 -0
  272. package/sql/003_indexes.sql +2 -0
@@ -0,0 +1,58 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { column, createdAt, manyToOne, pk, table, updatedAt, uuid } from "@decaf-ts/core";
11
+ import { model, option, required, type as typeOf } from "@decaf-ts/decorator-validation";
12
+ import { MembershipStatus, MembershipStatusOptions } from "./../types.js";
13
+ import { REL_CASCADE_DEPENDENT } from "./../utils.js";
14
+ import { AuthorizationModel } from "./authorization-model.js";
15
+ import { Tenant } from "./tenant.model";
16
+ import { User } from "./user.model";
17
+ let TenantMembership = class TenantMembership extends AuthorizationModel {
18
+ constructor(data) {
19
+ super(data);
20
+ }
21
+ };
22
+ __decorate([
23
+ pk({ type: String }),
24
+ uuid(),
25
+ __metadata("design:type", String)
26
+ ], TenantMembership.prototype, "id", void 0);
27
+ __decorate([
28
+ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_memberships_tenant"),
29
+ required(),
30
+ __metadata("design:type", Object)
31
+ ], TenantMembership.prototype, "tenant", void 0);
32
+ __decorate([
33
+ manyToOne(() => User, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_memberships_user"),
34
+ required(),
35
+ __metadata("design:type", Object)
36
+ ], TenantMembership.prototype, "user", void 0);
37
+ __decorate([
38
+ required(),
39
+ typeOf(String),
40
+ option(MembershipStatusOptions),
41
+ column(),
42
+ __metadata("design:type", String)
43
+ ], TenantMembership.prototype, "status", void 0);
44
+ __decorate([
45
+ createdAt(),
46
+ __metadata("design:type", Date)
47
+ ], TenantMembership.prototype, "createdAt", void 0);
48
+ __decorate([
49
+ updatedAt(),
50
+ __metadata("design:type", Date)
51
+ ], TenantMembership.prototype, "updatedAt", void 0);
52
+ TenantMembership = __decorate([
53
+ table("tenant_memberships"),
54
+ model(),
55
+ __metadata("design:paramtypes", [Object])
56
+ ], TenantMembership);
57
+ export { TenantMembership };
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LW1lbWJlcnNoaXAubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdGVuYW50LW1lbWJlcnNoaXAubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLHNCQUFpQjtBQUNyRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsc0JBQWlCO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQ0FBOEI7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJN0IsSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBaUIsU0FBUSxrQkFBa0I7SUFDdEQsWUFBWSxJQUFjO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLENBQUM7Q0FZRixDQUFBO0FBVitCO0lBQTdCLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUFFLElBQUksRUFBRTs7NENBQWE7QUFHMUM7SUFGQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsOEJBQThCLENBQUM7SUFDaEcsUUFBUSxFQUFFOztnREFDYztBQUd6QjtJQUZDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSw0QkFBNEIsQ0FBQztJQUM1RixRQUFRLEVBQUU7OzhDQUNVO0FBQ2tEO0lBQXRFLFFBQVEsRUFBRTtJQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFBRSxNQUFNLENBQUMsdUJBQXVCLENBQUM7SUFBRSxNQUFNLEVBQUU7O2dEQUEyQjtBQUNwRjtJQUFaLFNBQVMsRUFBRTs4QkFBYSxJQUFJO21EQUFDO0FBQ2pCO0lBQVosU0FBUyxFQUFFOzhCQUFhLElBQUk7bURBQUM7QUFkbkIsZ0JBQWdCO0lBRjVCLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztJQUMzQixLQUFLLEVBQUU7O0dBQ0ssZ0JBQWdCLENBZTVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMsIE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuL3VzZXIubW9kZWxcIjtcblxuQHRhYmxlKFwidGVuYW50X21lbWJlcnNoaXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFRlbmFudE1lbWJlcnNoaXAgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfdGVuYW50X21lbWJlcnNoaXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVXNlciwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9tZW1iZXJzaGlwc191c2VyXCIpXG4gIEByZXF1aXJlZCgpXG4gIHVzZXIhOiBVc2VyIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucykgQGNvbHVtbigpIHN0YXR1cyE6IE1lbWJlcnNoaXBTdGF0dXM7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiJdfQ==
@@ -0,0 +1,55 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { column, createdAt, manyToOne, pk, table, updatedAt, uuid } from "@decaf-ts/core";
11
+ import { model, required, type as typeOf } from "@decaf-ts/decorator-validation";
12
+ import { REL_CASCADE_DEPENDENT } from "./../utils.js";
13
+ import { AuthorizationModel } from "./authorization-model.js";
14
+ import { Tenant } from "./tenant.model";
15
+ let TenantProfile = class TenantProfile extends AuthorizationModel {
16
+ constructor(data) {
17
+ super(data);
18
+ }
19
+ };
20
+ __decorate([
21
+ pk({ type: String }),
22
+ uuid(),
23
+ __metadata("design:type", String)
24
+ ], TenantProfile.prototype, "id", void 0);
25
+ __decorate([
26
+ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_profiles_tenant"),
27
+ required(),
28
+ __metadata("design:type", Object)
29
+ ], TenantProfile.prototype, "tenant", void 0);
30
+ __decorate([
31
+ required(),
32
+ typeOf(String),
33
+ column(),
34
+ __metadata("design:type", String)
35
+ ], TenantProfile.prototype, "profileKey", void 0);
36
+ __decorate([
37
+ typeOf(Object),
38
+ column(),
39
+ __metadata("design:type", Object)
40
+ ], TenantProfile.prototype, "metadata", void 0);
41
+ __decorate([
42
+ createdAt(),
43
+ __metadata("design:type", Date)
44
+ ], TenantProfile.prototype, "createdAt", void 0);
45
+ __decorate([
46
+ updatedAt(),
47
+ __metadata("design:type", Date)
48
+ ], TenantProfile.prototype, "updatedAt", void 0);
49
+ TenantProfile = __decorate([
50
+ table("tenant_profiles"),
51
+ model(),
52
+ __metadata("design:paramtypes", [Object])
53
+ ], TenantProfile);
54
+ export { TenantProfile };
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LXByb2ZpbGUubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdGVuYW50LXByb2ZpbGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsc0JBQWlCO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQ0FBOEI7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSWpDLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWMsU0FBUSxrQkFBa0I7SUFDbkQsWUFBWSxJQUFjO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLENBQUM7Q0FVRixDQUFBO0FBUitCO0lBQTdCLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUFFLElBQUksRUFBRTs7eUNBQWE7QUFHMUM7SUFGQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsMkJBQTJCLENBQUM7SUFDN0YsUUFBUSxFQUFFOzs2Q0FDYztBQUNhO0lBQXJDLFFBQVEsRUFBRTtJQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFBRSxNQUFNLEVBQUU7O2lEQUFxQjtBQUNoQztJQUF6QixNQUFNLENBQUMsTUFBTSxDQUFDO0lBQUUsTUFBTSxFQUFFOzsrQ0FBb0M7QUFDaEQ7SUFBWixTQUFTLEVBQUU7OEJBQWEsSUFBSTtnREFBQztBQUNqQjtJQUFaLFNBQVMsRUFBRTs4QkFBYSxJQUFJO2dEQUFDO0FBWm5CLGFBQWE7SUFGekIsS0FBSyxDQUFDLGlCQUFpQixDQUFDO0lBQ3hCLEtBQUssRUFBRTs7R0FDSyxhQUFhLENBYXpCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJ0ZW5hbnRfcHJvZmlsZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVGVuYW50UHJvZmlsZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma190ZW5hbnRfcHJvZmlsZXNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwcm9maWxlS2V5ITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiJdfQ==
@@ -0,0 +1,79 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { column, createdAt, oneToMany, pk, table, unique, updatedAt, uuid } from "@decaf-ts/core";
11
+ import { model, option, required, type as typeOf } from "@decaf-ts/decorator-validation";
12
+ import { IsolationTier, IsolationTierOptions } from "./../types.js";
13
+ import { REL_RESTRICT } from "./../utils.js";
14
+ import { AuthorizationModel } from "./authorization-model.js";
15
+ import { OrgUnit } from "./org-unit.model";
16
+ import { TenantMembership } from "./tenant-membership.model";
17
+ import { Principal } from "./principal.model";
18
+ import { StorageBinding } from "./storage-binding.model";
19
+ let Tenant = class Tenant extends AuthorizationModel {
20
+ constructor(data) {
21
+ super(data);
22
+ }
23
+ };
24
+ __decorate([
25
+ pk({ type: String }),
26
+ uuid(),
27
+ __metadata("design:type", String)
28
+ ], Tenant.prototype, "id", void 0);
29
+ __decorate([
30
+ unique(),
31
+ required(),
32
+ typeOf(String),
33
+ column(),
34
+ __metadata("design:type", String)
35
+ ], Tenant.prototype, "slug", void 0);
36
+ __decorate([
37
+ required(),
38
+ typeOf(String),
39
+ column(),
40
+ __metadata("design:type", String)
41
+ ], Tenant.prototype, "name", void 0);
42
+ __decorate([
43
+ required(),
44
+ typeOf(String),
45
+ option(IsolationTierOptions),
46
+ column(),
47
+ __metadata("design:type", String)
48
+ ], Tenant.prototype, "isolationTier", void 0);
49
+ __decorate([
50
+ oneToMany(() => OrgUnit, REL_RESTRICT, false),
51
+ __metadata("design:type", Array)
52
+ ], Tenant.prototype, "orgUnits", void 0);
53
+ __decorate([
54
+ oneToMany(() => TenantMembership, REL_RESTRICT, false),
55
+ __metadata("design:type", Array)
56
+ ], Tenant.prototype, "memberships", void 0);
57
+ __decorate([
58
+ oneToMany(() => Principal, REL_RESTRICT, false),
59
+ __metadata("design:type", Array)
60
+ ], Tenant.prototype, "principals", void 0);
61
+ __decorate([
62
+ oneToMany(() => StorageBinding, REL_RESTRICT, false),
63
+ __metadata("design:type", Array)
64
+ ], Tenant.prototype, "storageBindings", void 0);
65
+ __decorate([
66
+ createdAt(),
67
+ __metadata("design:type", Date)
68
+ ], Tenant.prototype, "createdAt", void 0);
69
+ __decorate([
70
+ updatedAt(),
71
+ __metadata("design:type", Date)
72
+ ], Tenant.prototype, "updatedAt", void 0);
73
+ Tenant = __decorate([
74
+ table("tenants"),
75
+ model(),
76
+ __metadata("design:paramtypes", [Object])
77
+ ], Tenant);
78
+ export { Tenant };
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBYSxTQUFTLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxzQkFBaUI7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBaUI7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlDQUE4QjtBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUlsRCxJQUFNLE1BQU0sR0FBWixNQUFNLE1BQU8sU0FBUSxrQkFBa0I7SUFDNUMsWUFBWSxJQUFjO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLENBQUM7Q0FZRixDQUFBO0FBVitCO0lBQTdCLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUFFLElBQUksRUFBRTs7a0NBQWE7QUFDTTtJQUEvQyxNQUFNLEVBQUU7SUFBRSxRQUFRLEVBQUU7SUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQUUsTUFBTSxFQUFFOztvQ0FBZTtBQUN4QjtJQUFyQyxRQUFRLEVBQUU7SUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQUUsTUFBTSxFQUFFOztvQ0FBZTtBQUNnQjtJQUFuRSxRQUFRLEVBQUU7SUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQUUsTUFBTSxDQUFDLG9CQUFvQixDQUFDO0lBQUUsTUFBTSxFQUFFOzs2Q0FBK0I7QUFDbkQ7SUFBOUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDOzt3Q0FBaUM7QUFDdkI7SUFBdkQsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7OzJDQUE2QztBQUNuRDtJQUFoRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7OzBDQUFxQztBQUMvQjtJQUFyRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7OytDQUErQztBQUN2RjtJQUFaLFNBQVMsRUFBRTs4QkFBYSxJQUFJO3lDQUFDO0FBQ2pCO0lBQVosU0FBUyxFQUFFOzhCQUFhLElBQUk7eUNBQUM7QUFkbkIsTUFBTTtJQUZsQixLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ2hCLEtBQUssRUFBRTs7R0FDSyxNQUFNLENBZWxCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVuaXF1ZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJc29sYXRpb25UaWVyLCBJc29sYXRpb25UaWVyT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXAgfSBmcm9tIFwiLi90ZW5hbnQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBTdG9yYWdlQmluZGluZyB9IGZyb20gXCIuL3N0b3JhZ2UtYmluZGluZy5tb2RlbFwiO1xuXG5AdGFibGUoXCJ0ZW5hbnRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFRlbmFudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQHVuaXF1ZSgpIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2x1ZyE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihJc29sYXRpb25UaWVyT3B0aW9ucykgQGNvbHVtbigpIGlzb2xhdGlvblRpZXIhOiBJc29sYXRpb25UaWVyO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG9yZ1VuaXRzPzogT3JnVW5pdFtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gVGVuYW50TWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgbWVtYmVyc2hpcHM/OiBUZW5hbnRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBQcmluY2lwYWwsIFJFTF9SRVNUUklDVCwgZmFsc2UpIHByaW5jaXBhbHM/OiBQcmluY2lwYWxbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFN0b3JhZ2VCaW5kaW5nLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBzdG9yYWdlQmluZGluZ3M/OiBTdG9yYWdlQmluZGluZ1tdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiJdfQ==
@@ -0,0 +1,66 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { column, createdAt, oneToMany, pk, table, unique, updatedAt, uuid, } from "@decaf-ts/core";
11
+ import { model, required, type } from "@decaf-ts/decorator-validation";
12
+ import { REL_RESTRICT } from "./../utils.js";
13
+ import { AuthorizationModel } from "./authorization-model.js";
14
+ import { TenantMembership } from "./tenant-membership.model";
15
+ import { OrgUnitMembership } from "./org-unit-membership.model";
16
+ let User = class User extends AuthorizationModel {
17
+ constructor(data) {
18
+ super(data);
19
+ }
20
+ };
21
+ __decorate([
22
+ pk({ type: String }),
23
+ uuid(),
24
+ __metadata("design:type", String)
25
+ ], User.prototype, "id", void 0);
26
+ __decorate([
27
+ unique(),
28
+ type(String),
29
+ column(),
30
+ __metadata("design:type", String)
31
+ ], User.prototype, "email", void 0);
32
+ __decorate([
33
+ unique(),
34
+ type(String),
35
+ column(),
36
+ __metadata("design:type", String)
37
+ ], User.prototype, "phone", void 0);
38
+ __decorate([
39
+ required(),
40
+ type(String),
41
+ column(),
42
+ __metadata("design:type", String)
43
+ ], User.prototype, "displayName", void 0);
44
+ __decorate([
45
+ oneToMany(() => TenantMembership, REL_RESTRICT, false),
46
+ __metadata("design:type", Array)
47
+ ], User.prototype, "tenantMemberships", void 0);
48
+ __decorate([
49
+ oneToMany(() => OrgUnitMembership, REL_RESTRICT, false),
50
+ __metadata("design:type", Array)
51
+ ], User.prototype, "orgUnitMemberships", void 0);
52
+ __decorate([
53
+ createdAt(),
54
+ __metadata("design:type", Date)
55
+ ], User.prototype, "createdAt", void 0);
56
+ __decorate([
57
+ updatedAt(),
58
+ __metadata("design:type", Date)
59
+ ], User.prototype, "updatedAt", void 0);
60
+ User = __decorate([
61
+ table("users"),
62
+ model(),
63
+ __metadata("design:paramtypes", [Object])
64
+ ], User);
65
+ export { User };
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy91c2VyLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxFQUFFLEVBQ0YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsSUFBSSxHQUNMLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBaUI7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlDQUE4QjtBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUl6RCxJQUFNLElBQUksR0FBVixNQUFNLElBQUssU0FBUSxrQkFBa0I7SUFnQzFDLFlBQVksSUFBYztRQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZCxDQUFDO0NBQ0YsQ0FBQTtBQWhDQztJQUZDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNwQixJQUFJLEVBQUU7O2dDQUNLO0FBS1o7SUFIQyxNQUFNLEVBQUU7SUFDUixJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ1osTUFBTSxFQUFFOzttQ0FDTTtBQUtmO0lBSEMsTUFBTSxFQUFFO0lBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNaLE1BQU0sRUFBRTs7bUNBQ007QUFLZjtJQUhDLFFBQVEsRUFBRTtJQUNWLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDWixNQUFNLEVBQUU7O3lDQUNZO0FBR3JCO0lBREMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7OytDQUNMO0FBR2xEO0lBREMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7O2dEQUNKO0FBR3BEO0lBREMsU0FBUyxFQUFFOzhCQUNBLElBQUk7dUNBQUM7QUFHakI7SUFEQyxTQUFTLEVBQUU7OEJBQ0EsSUFBSTt1Q0FBQztBQTlCTixJQUFJO0lBRmhCLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDZCxLQUFLLEVBQUU7O0dBQ0ssSUFBSSxDQW1DaEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuQHRhYmxlKFwidXNlcnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVXNlciBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICBAdXVpZCgpXG4gIGlkITogc3RyaW5nO1xuXG4gIEB1bmlxdWUoKVxuICBAdHlwZShTdHJpbmcpXG4gIEBjb2x1bW4oKVxuICBlbWFpbD86IHN0cmluZztcblxuICBAdW5pcXVlKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgcGhvbmU/OiBzdHJpbmc7XG5cbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgZGlzcGxheU5hbWUhOiBzdHJpbmc7XG5cbiAgQG9uZVRvTWFueSgoKSA9PiBUZW5hbnRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKVxuICB0ZW5hbnRNZW1iZXJzaGlwcz86IFRlbmFudE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuXG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpXG4gIG9yZ1VuaXRNZW1iZXJzaGlwcz86IE9yZ1VuaXRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcblxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,283 @@
1
+ import { AuthorizationError, Cascade, ModelService, transactional } from "@decaf-ts/core";
2
+ export var IsolationTier;
3
+ (function (IsolationTier) {
4
+ IsolationTier["Pooled"] = "pooled";
5
+ IsolationTier["Bridge"] = "bridge";
6
+ IsolationTier["Silo"] = "silo";
7
+ })(IsolationTier || (IsolationTier = {}));
8
+ export var MembershipStatus;
9
+ (function (MembershipStatus) {
10
+ MembershipStatus["Invited"] = "invited";
11
+ MembershipStatus["Active"] = "active";
12
+ MembershipStatus["Suspended"] = "suspended";
13
+ MembershipStatus["Removed"] = "removed";
14
+ })(MembershipStatus || (MembershipStatus = {}));
15
+ export var PrincipalKind;
16
+ (function (PrincipalKind) {
17
+ PrincipalKind["User"] = "user";
18
+ PrincipalKind["Group"] = "group";
19
+ PrincipalKind["ServiceAccount"] = "service_account";
20
+ PrincipalKind["Agent"] = "agent";
21
+ PrincipalKind["ApiKey"] = "api_key";
22
+ })(PrincipalKind || (PrincipalKind = {}));
23
+ export var ScopeKind;
24
+ (function (ScopeKind) {
25
+ ScopeKind["Tenant"] = "tenant";
26
+ ScopeKind["OrgUnit"] = "org_unit";
27
+ ScopeKind["Resource"] = "resource";
28
+ })(ScopeKind || (ScopeKind = {}));
29
+ export var PermissionCategory;
30
+ (function (PermissionCategory) {
31
+ PermissionCategory["Admin"] = "admin";
32
+ PermissionCategory["ContentRead"] = "content_read";
33
+ PermissionCategory["ContentWrite"] = "content_write";
34
+ PermissionCategory["Memory"] = "memory";
35
+ PermissionCategory["Graph"] = "graph";
36
+ PermissionCategory["Vector"] = "vector";
37
+ PermissionCategory["Export"] = "export";
38
+ PermissionCategory["Billing"] = "billing";
39
+ PermissionCategory["Audit"] = "audit";
40
+ PermissionCategory["Security"] = "security";
41
+ PermissionCategory["Data"] = "data";
42
+ PermissionCategory["Automation"] = "automation";
43
+ })(PermissionCategory || (PermissionCategory = {}));
44
+ export var ResourceVisibility;
45
+ (function (ResourceVisibility) {
46
+ ResourceVisibility["Private"] = "private";
47
+ ResourceVisibility["ResourceAcl"] = "resource_acl";
48
+ ResourceVisibility["OrgUnit"] = "org_unit";
49
+ ResourceVisibility["OrgSubtree"] = "org_subtree";
50
+ ResourceVisibility["Tenant"] = "tenant";
51
+ })(ResourceVisibility || (ResourceVisibility = {}));
52
+ export var StorageKind;
53
+ (function (StorageKind) {
54
+ StorageKind["Postgres"] = "postgres";
55
+ StorageKind["Arango"] = "arango";
56
+ StorageKind["Qdrant"] = "qdrant";
57
+ StorageKind["ObjectStorage"] = "object_storage";
58
+ })(StorageKind || (StorageKind = {}));
59
+ export var StorageBindingKind;
60
+ (function (StorageBindingKind) {
61
+ StorageBindingKind["Shared"] = "shared";
62
+ StorageBindingKind["Dedicated"] = "dedicated";
63
+ })(StorageBindingKind || (StorageBindingKind = {}));
64
+ export const IsolationTierOptions = Object.values(IsolationTier);
65
+ export const MembershipStatusOptions = Object.values(MembershipStatus);
66
+ export const PrincipalKindOptions = Object.values(PrincipalKind);
67
+ export const ScopeKindOptions = Object.values(ScopeKind);
68
+ export const PermissionCategoryOptions = Object.values(PermissionCategory);
69
+ export const ResourceVisibilityOptions = Object.values(ResourceVisibility);
70
+ export const StorageKindOptions = Object.values(StorageKind);
71
+ export const StorageBindingKindOptions = Object.values(StorageBindingKind);
72
+ export const REL_RESTRICT = {
73
+ update: Cascade.NONE,
74
+ delete: Cascade.NONE,
75
+ nullable: false,
76
+ };
77
+ export const REL_NULLIFY = {
78
+ update: Cascade.NONE,
79
+ delete: Cascade.NONE,
80
+ nullable: true,
81
+ };
82
+ export const REL_CASCADE_DEPENDENT = {
83
+ update: Cascade.CASCADE,
84
+ delete: Cascade.CASCADE,
85
+ nullable: false,
86
+ };
87
+ export const REL_CASCADE_INSERT_UPDATE = {
88
+ update: Cascade.CASCADE,
89
+ delete: Cascade.NONE,
90
+ nullable: false,
91
+ };
92
+ function isTimeValid(at, startsAt, expiresAt) {
93
+ const instant = at ?? new Date();
94
+ if (startsAt && instant < startsAt)
95
+ return false;
96
+ if (expiresAt && instant > expiresAt)
97
+ return false;
98
+ return true;
99
+ }
100
+ function scopeKey(scopeKind, scopeId) {
101
+ return `${scopeKind}:${scopeId}`;
102
+ }
103
+ function toArray(value) {
104
+ return value ?? [];
105
+ }
106
+ export function buildArangoContext(options) {
107
+ return {
108
+ tenantId: options.tenantId,
109
+ principalId: options.principalId,
110
+ permissionKey: options.permissionKey,
111
+ allowedOrgUnitIds: [...options.allowedOrgUnitIds],
112
+ allowedResourceIds: [...options.allowedResourceIds],
113
+ };
114
+ }
115
+ export function buildQdrantFilter(options) {
116
+ return {
117
+ must: [
118
+ {
119
+ key: "tenant_id",
120
+ match: { value: options.tenantId },
121
+ },
122
+ {
123
+ should: [
124
+ { key: "org_unit_id", match: { any: options.allowedOrgUnitIds } },
125
+ {
126
+ key: "protected_resource_id",
127
+ match: { any: options.allowedResourceIds },
128
+ },
129
+ { key: "owner_principal_id", match: { value: options.principalId } },
130
+ ],
131
+ },
132
+ ],
133
+ };
134
+ }
135
+ export function buildAccessContext(options) {
136
+ const permissionsByScope = {};
137
+ const allowedOrgUnitIdsByPermission = {};
138
+ for (const permission of options.permissions) {
139
+ const key = scopeKey(permission.scopeKind, permission.scopeId);
140
+ permissionsByScope[key] = permissionsByScope[key] ?? [];
141
+ permissionsByScope[key].push(permission.permissionKey);
142
+ if (permission.scopeKind === ScopeKind.OrgUnit) {
143
+ allowedOrgUnitIdsByPermission[permission.permissionKey] =
144
+ allowedOrgUnitIdsByPermission[permission.permissionKey] ?? [];
145
+ allowedOrgUnitIdsByPermission[permission.permissionKey].push(permission.scopeId);
146
+ }
147
+ }
148
+ return {
149
+ tenantId: options.tenantId,
150
+ principalId: options.principalId,
151
+ permissionsByScope,
152
+ allowedOrgUnitIdsByPermission,
153
+ resourceGrants: options.grants.map((grant) => ({
154
+ resourceId: grant.resourceId,
155
+ permissionKey: grant.permissionKey,
156
+ })),
157
+ };
158
+ }
159
+ export class BaseModelService extends ModelService {
160
+ constructor(clazz) {
161
+ super(clazz);
162
+ }
163
+ newModel(clazz, data) {
164
+ return Object.assign(new clazz(), data);
165
+ }
166
+ async createOne(data, ...args) {
167
+ return this.repo.create(Object.assign({}, data), ...args);
168
+ }
169
+ async getById(id, ...args) {
170
+ return this.repo.read(id, ...args);
171
+ }
172
+ async updateOne(id, patch, ...args) {
173
+ const existing = await this.repo.read(id, ...args);
174
+ return this.repo.update(Object.assign(existing, patch), ...args);
175
+ }
176
+ async deleteById(id, ...args) {
177
+ await this.repo.delete(id, ...args);
178
+ }
179
+ async findOneBy(key, value, ...args) {
180
+ return this.repo.findOneBy(key, value, ...args);
181
+ }
182
+ async findManyBy(key, value, ...args) {
183
+ return this.repo.select().where({ [key]: value }).execute(...args);
184
+ }
185
+ async listAll(...args) {
186
+ return this.repo.select().execute(...args);
187
+ }
188
+ }
189
+ export function id() {
190
+ return crypto.randomUUID();
191
+ }
192
+ export function relationId(value) {
193
+ return typeof value === "string" ? value : value.id;
194
+ }
195
+ export class AuthzService {
196
+ constructor(dataSources = {}) {
197
+ this.dataSources = dataSources;
198
+ }
199
+ async canAccess(input, ...args) {
200
+ const at = input.at ?? new Date();
201
+ if (input.scopeKind && input.scopeId) {
202
+ const permissions = await this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, input.scopeKind, input.scopeId);
203
+ return toArray(permissions).some((permission) => permission.permissionKey === input.permissionKey &&
204
+ isTimeValid(at, permission.startsAt, permission.expiresAt));
205
+ }
206
+ if (!input.resourceProtectedId)
207
+ return false;
208
+ const resource = await this.dataSources.loadResource?.(input.tenantId, input.resourceProtectedId);
209
+ if (!resource)
210
+ return false;
211
+ if (resource.tenantId !== input.tenantId)
212
+ return false;
213
+ if (resource.ownerPrincipalId === input.principalId)
214
+ return true;
215
+ const grants = toArray(await this.dataSources.listResourceGrants?.(input.tenantId, input.resourceProtectedId)).filter((grant) => grant.principalId === input.principalId &&
216
+ grant.permissionKey === input.permissionKey &&
217
+ isTimeValid(at, grant.startsAt, grant.expiresAt));
218
+ if (grants.length > 0)
219
+ return true;
220
+ const visibility = resource.visibility;
221
+ if (visibility === ResourceVisibility.Private ||
222
+ visibility === ResourceVisibility.ResourceAcl) {
223
+ return false;
224
+ }
225
+ if (visibility === ResourceVisibility.OrgUnit ||
226
+ visibility === ResourceVisibility.OrgSubtree) {
227
+ const effectivePermissions = toArray(await this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, ScopeKind.OrgUnit, resource.orgUnitId));
228
+ return effectivePermissions.some((permission) => permission.permissionKey === input.permissionKey &&
229
+ isTimeValid(at, permission.startsAt, permission.expiresAt));
230
+ }
231
+ if (visibility === ResourceVisibility.Tenant) {
232
+ const effectivePermissions = toArray(await this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, ScopeKind.Tenant, input.tenantId));
233
+ return effectivePermissions.some((permission) => permission.permissionKey === input.permissionKey &&
234
+ isTimeValid(at, permission.startsAt, permission.expiresAt));
235
+ }
236
+ return false;
237
+ }
238
+ async requireAccess(input, ...args) {
239
+ if (!(await this.canAccess(input, ...args))) {
240
+ throw new AuthorizationError(`Access denied for ${input.permissionKey} on ${input.resourceProtectedId ?? scopeKey(input.scopeKind ?? ScopeKind.Resource, input.scopeId ?? "")}`);
241
+ }
242
+ }
243
+ async buildAccessContext(tenantId, principalId, ...args) {
244
+ const permissions = toArray(await this.dataSources.listEffectivePermissions?.(tenantId, principalId));
245
+ const grants = toArray(await this.dataSources.listPrincipalGrants?.(tenantId, principalId));
246
+ return buildAccessContext({
247
+ tenantId,
248
+ principalId,
249
+ permissions,
250
+ grants,
251
+ });
252
+ }
253
+ async buildArangoContext(tenantId, principalId, permissionKey, ...args) {
254
+ const access = await this.buildAccessContext(tenantId, principalId, ...args);
255
+ const allowedOrgUnitIds = access.allowedOrgUnitIdsByPermission[permissionKey] ?? [];
256
+ const allowedResourceIds = access.resourceGrants
257
+ .filter((grant) => grant.permissionKey === permissionKey)
258
+ .map((grant) => grant.resourceId);
259
+ return buildArangoContext({
260
+ tenantId,
261
+ principalId,
262
+ permissionKey,
263
+ allowedOrgUnitIds,
264
+ allowedResourceIds,
265
+ });
266
+ }
267
+ async buildQdrantFilter(tenantId, principalId, permissionKey, ...args) {
268
+ const access = await this.buildAccessContext(tenantId, principalId, ...args);
269
+ const allowedOrgUnitIds = access.allowedOrgUnitIdsByPermission[permissionKey] ?? [];
270
+ const allowedResourceIds = access.resourceGrants
271
+ .filter((grant) => grant.permissionKey === permissionKey)
272
+ .map((grant) => grant.resourceId);
273
+ return buildQdrantFilter({
274
+ tenantId,
275
+ principalId,
276
+ permissionKey,
277
+ allowedOrgUnitIds,
278
+ allowedResourceIds,
279
+ });
280
+ }
281
+ }
282
+ export { transactional };
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWJhc2VkLWF1dGhvcml6YXRpb24tc3lzdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZXMvb3JnLWJhc2VkLWF1dGhvcml6YXRpb24tc3lzdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFjLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3RHLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsa0NBQWlCLENBQUE7SUFDakIsa0NBQWlCLENBQUE7SUFDakIsOEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFKVyxhQUFhLEtBQWIsYUFBYSxRQUl4QjtBQUVELE1BQU0sQ0FBTixJQUFZLGdCQUtYO0FBTEQsV0FBWSxnQkFBZ0I7SUFDMUIsdUNBQW1CLENBQUE7SUFDbkIscUNBQWlCLENBQUE7SUFDakIsMkNBQXVCLENBQUE7SUFDdkIsdUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUxXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFLM0I7QUFFRCxNQUFNLENBQU4sSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLDhCQUFhLENBQUE7SUFDYixnQ0FBZSxDQUFBO0lBQ2YsbURBQWtDLENBQUE7SUFDbEMsZ0NBQWUsQ0FBQTtJQUNmLG1DQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFOVyxhQUFhLEtBQWIsYUFBYSxRQU14QjtBQUVELE1BQU0sQ0FBTixJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDbkIsOEJBQWlCLENBQUE7SUFDakIsaUNBQW9CLENBQUE7SUFDcEIsa0NBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUpXLFNBQVMsS0FBVCxTQUFTLFFBSXBCO0FBRUQsTUFBTSxDQUFOLElBQVksa0JBYVg7QUFiRCxXQUFZLGtCQUFrQjtJQUM1QixxQ0FBZSxDQUFBO0lBQ2Ysa0RBQTRCLENBQUE7SUFD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S0FBSyxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUM7YUFDeEQsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsT0FBTyxpQkFBaUIsQ0FBQztZQUN2QixRQUFRO1lBQ1IsV0FBVztZQUNYLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsa0JBQWtCO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciwgQ2FzY2FkZSwgTW9kZWxTZXJ2aWNlLCBSZXBvc2l0b3J5LCB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IGVudW0gSXNvbGF0aW9uVGllciB7XG4gIFBvb2xlZCA9IFwicG9vbGVkXCIsXG4gIEJyaWRnZSA9IFwiYnJpZGdlXCIsXG4gIFNpbG8gPSBcInNpbG9cIixcbn1cblxuZXhwb3J0IGVudW0gTWVtYmVyc2hpcFN0YXR1cyB7XG4gIEludml0ZWQgPSBcImludml0ZWRcIixcbiAgQWN0aXZlID0gXCJhY3RpdmVcIixcbiAgU3VzcGVuZGVkID0gXCJzdXNwZW5kZWRcIixcbiAgUmVtb3ZlZCA9IFwicmVtb3ZlZFwiLFxufVxuXG5leHBvcnQgZW51bSBQcmluY2lwYWxLaW5kIHtcbiAgVXNlciA9IFwidXNlclwiLFxuICBHcm91cCA9IFwiZ3JvdXBcIixcbiAgU2VydmljZUFjY291bnQgPSBcInNlcnZpY2VfYWNjb3VudFwiLFxuICBBZ2VudCA9IFwiYWdlbnRcIixcbiAgQXBpS2V5ID0gXCJhcGlfa2V5XCIsXG59XG5cbmV4cG9ydCBlbnVtIFNjb3BlS2luZCB7XG4gIFRlbmFudCA9IFwidGVuYW50XCIsXG4gIE9yZ1VuaXQgPSBcIm9yZ191bml0XCIsXG4gIFJlc291cmNlID0gXCJyZXNvdXJjZVwiLFxufVxuXG5leHBvcnQgZW51bSBQZXJtaXNzaW9uQ2F0ZWdvcnkge1xuICBBZG1pbiA9IFwiYWRtaW5cIixcbiAgQ29udGVudFJlYWQgPSBcImNvbnRlbnRfcmVhZFwiLFxuICBDb250ZW50V3JpdGUgPSBcImNvbnRlbnRfd3JpdGVcIixcbiAgTWVtb3J5ID0gXCJtZW1vcnlcIixcbiAgR3JhcGggPSBcImdyYXBoXCIsXG4gIFZlY3RvciA9IFwidmVjdG9yXCIsXG4gIEV4cG9ydCA9IFwiZXhwb3J0XCIsXG4gIEJpbGxpbmcgPSBcImJpbGxpbmdcIixcbiAgQXVkaXQgPSBcImF1ZGl0XCIsXG4gIFNlY3VyaXR5ID0gXCJzZWN1cml0eVwiLFxuICBEYXRhID0gXCJkYXRhXCIsXG4gIEF1dG9tYXRpb24gPSBcImF1dG9tYXRpb25cIixcbn1cblxuZXhwb3J0IGVudW0gUmVzb3VyY2VWaXNpYmlsaXR5IHtcbiAgUHJpdmF0ZSA9IFwicHJpdmF0ZVwiLFxuICBSZXNvdXJjZUFjbCA9IFwicmVzb3VyY2VfYWNsXCIsXG4gIE9yZ1VuaXQgPSBcIm9yZ191bml0XCIsXG4gIE9yZ1N1YnRyZWUgPSBcIm9yZ19zdWJ0cmVlXCIsXG4gIFRlbmFudCA9IFwidGVuYW50XCIsXG59XG5cbmV4cG9ydCBlbnVtIFN0b3JhZ2VLaW5kIHtcbiAgUG9zdGdyZXMgPSBcInBvc3RncmVzXCIsXG4gIEFyYW5nbyA9IFwiYXJhbmdvXCIsXG4gIFFkcmFudCA9IFwicWRyYW50XCIsXG4gIE9iamVjdFN0b3JhZ2UgPSBcIm9iamVjdF9zdG9yYWdlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFN0b3JhZ2VCaW5kaW5nS2luZCB7XG4gIFNoYXJlZCA9IFwic2hhcmVkXCIsXG4gIERlZGljYXRlZCA9IFwiZGVkaWNhdGVkXCIsXG59XG5cbmV4cG9ydCBjb25zdCBJc29sYXRpb25UaWVyT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoSXNvbGF0aW9uVGllcik7XG5leHBvcnQgY29uc3QgTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMgPSBPYmplY3QudmFsdWVzKE1lbWJlcnNoaXBTdGF0dXMpO1xuZXhwb3J0IGNvbnN0IFByaW5jaXBhbEtpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhQcmluY2lwYWxLaW5kKTtcbmV4cG9ydCBjb25zdCBTY29wZUtpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTY29wZUtpbmQpO1xuZXhwb3J0IGNvbnN0IFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFBlcm1pc3Npb25DYXRlZ29yeSk7XG5leHBvcnQgY29uc3QgUmVzb3VyY2VWaXNpYmlsaXR5T3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoUmVzb3VyY2VWaXNpYmlsaXR5KTtcbmV4cG9ydCBjb25zdCBTdG9yYWdlS2luZE9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFN0b3JhZ2VLaW5kKTtcbmV4cG9ydCBjb25zdCBTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTdG9yYWdlQmluZGluZ0tpbmQpO1xuXG5leHBvcnQgY29uc3QgUkVMX1JFU1RSSUNUID0ge1xuICB1cGRhdGU6IENhc2NhZGUuTk9ORSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG4gIG51bGxhYmxlOiBmYWxzZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRUxfTlVMTElGWSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLk5PTkUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxuICBudWxsYWJsZTogdHJ1ZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9DQVNDQURFX0lOU0VSVF9VUERBVEUgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVHhBcmdzID0gYW55W107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVGVuYW50SW5wdXQge1xuICBzbHVnOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNvbGF0aW9uVGllcj86IElzb2xhdGlvblRpZXI7XG4gIHByb2ZpbGVLZXk/OiBzdHJpbmc7XG4gIHByb2ZpbGVNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVVzZXJJbnB1dCB7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwaG9uZT86IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcmdVbml0SW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwYXJlbnRPcmdVbml0SWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZUtleT86IHN0cmluZztcbiAgcHJvZmlsZU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUm9sZUlucHV0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NpZ25Sb2xlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICByb2xlSWQ6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgaW5oZXJpdERvd24/OiBib29sZWFuO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG4gIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBvcmdVbml0SWQ6IHN0cmluZztcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlc291cmNlSWQ6IHN0cmluZztcbiAgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBvd25lclByaW5jaXBhbElkPzogc3RyaW5nO1xuICBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFudFJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbkFjY2Vzc0lucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICByZXNvdXJjZVByb3RlY3RlZElkPzogc3RyaW5nO1xuICBzY29wZUtpbmQ/OiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ/OiBzdHJpbmc7XG4gIGF0PzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbnNCeVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIHJlc291cmNlR3JhbnRzOiBBcnJheTx7IHJlc291cmNlSWQ6IHN0cmluZzsgcGVybWlzc2lvbktleTogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyYW5nb0F1dGhDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUWRyYW50QXV0aEZpbHRlciB7XG4gIG11c3Q6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgbXVzdF9ub3Q/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RvcmFnZUJpbmRpbmdJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZDtcbiAgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZDtcbiAgYmluZGluZ0tleTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUGVybWlzc2lvbiB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBSb2xlIHtcbiAga2V5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXlzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBPcmdVbml0IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm9maWxlS2V5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjaGlsZHJlbj86IEJvb3RzdHJhcE9yZ1VuaXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBUZW1wbGF0ZSB7XG4gIHRlbmFudDogQ3JlYXRlVGVuYW50SW5wdXQ7XG4gIHJvb3RPcmdVbml0OiBCb290c3RyYXBPcmdVbml0O1xuICBwZXJtaXNzaW9uczogQm9vdHN0cmFwUGVybWlzc2lvbltdO1xuICByb2xlczogQm9vdHN0cmFwUm9sZVtdO1xuICBvd25lclVzZXI6IENyZWF0ZVVzZXJJbnB1dDtcbiAgb3duZXJSb2xlS2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIG9yZ1VuaXRJZDogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gIG93bmVyUHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG4gIHNlbnNpdGl2aXR5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50U25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgc291cmNlS2luZDogc3RyaW5nO1xuICBzb3VyY2VJZDogc3RyaW5nO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aHpEYXRhU291cmNlcyB7XG4gIGxvYWRSZXNvdXJjZT86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8UmVzb3VyY2VTbmFwc2hvdCB8IHVuZGVmaW5lZD47XG4gIGxpc3RSZXNvdXJjZUdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8R3JhbnRTbmFwc2hvdFtdPjtcbiAgbGlzdFByaW5jaXBhbEdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nKSA9PiBQcm9taXNlPEdyYW50U25hcHNob3RbXT47XG4gIGxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucz86IChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbiAgbGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/OiAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbn1cblxuZnVuY3Rpb24gaXNUaW1lVmFsaWQoXG4gIGF0OiBEYXRlIHwgdW5kZWZpbmVkLFxuICBzdGFydHNBdD86IERhdGUsXG4gIGV4cGlyZXNBdD86IERhdGVcbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0YW50ID0gYXQgPz8gbmV3IERhdGUoKTtcbiAgaWYgKHN0YXJ0c0F0ICYmIGluc3RhbnQgPCBzdGFydHNBdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZXhwaXJlc0F0ICYmIGluc3RhbnQgPiBleHBpcmVzQXQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHNjb3BlS2V5KHNjb3BlS2luZDogU2NvcGVLaW5kLCBzY29wZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2NvcGVLaW5kfToke3Njb3BlSWR9YDtcbn1cblxuZnVuY3Rpb24gdG9BcnJheTxUPih2YWx1ZTogVFtdIHwgdW5kZWZpbmVkKTogVFtdIHtcbiAgcmV0dXJuIHZhbHVlID8/IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcmFuZ29Db250ZXh0KG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogQXJhbmdvQXV0aENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgIHByaW5jaXBhbElkOiBvcHRpb25zLnByaW5jaXBhbElkLFxuICAgIHBlcm1pc3Npb25LZXk6IG9wdGlvbnMucGVybWlzc2lvbktleSxcbiAgICBhbGxvd2VkT3JnVW5pdElkczogWy4uLm9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHNdLFxuICAgIGFsbG93ZWRSZXNvdXJjZUlkczogWy4uLm9wdGlvbnMuYWxsb3dlZFJlc291cmNlSWRzXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUWRyYW50RmlsdGVyKG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogUWRyYW50QXV0aEZpbHRlciB7XG4gIHJldHVybiB7XG4gICAgbXVzdDogW1xuICAgICAge1xuICAgICAgICBrZXk6IFwidGVuYW50X2lkXCIsXG4gICAgICAgIG1hdGNoOiB7IHZhbHVlOiBvcHRpb25zLnRlbmFudElkIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICB7IGtleTogXCJvcmdfdW5pdF9pZFwiLCBtYXRjaDogeyBhbnk6IG9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHMgfSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogXCJwcm90ZWN0ZWRfcmVzb3VyY2VfaWRcIixcbiAgICAgICAgICAgIG1hdGNoOiB7IGFueTogb3B0aW9ucy5hbGxvd2VkUmVzb3VyY2VJZHMgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsga2V5OiBcIm93bmVyX3ByaW5jaXBhbF9pZFwiLCBtYXRjaDogeyB2YWx1ZTogb3B0aW9ucy5wcmluY2lwYWxJZCB9IH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFjY2Vzc0NvbnRleHQob3B0aW9uczoge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W107XG4gIGdyYW50czogR3JhbnRTbmFwc2hvdFtdO1xufSk6IEFjY2Vzc0NvbnRleHQge1xuICBjb25zdCBwZXJtaXNzaW9uc0J5U2NvcGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBjb25zdCBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIG9wdGlvbnMucGVybWlzc2lvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBzY29wZUtleShwZXJtaXNzaW9uLnNjb3BlS2luZCwgcGVybWlzc2lvbi5zY29wZUlkKTtcbiAgICBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XSA9IHBlcm1pc3Npb25zQnlTY29wZVtrZXldID8/IFtdO1xuICAgIHBlcm1pc3Npb25zQnlTY29wZVtrZXldLnB1c2gocGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5KTtcbiAgICBpZiAocGVybWlzc2lvbi5zY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0KSB7XG4gICAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXldID1cbiAgICAgICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb24ucGVybWlzc2lvbktleV0ucHVzaChcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUlkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWQsXG4gICAgcHJpbmNpcGFsSWQ6IG9wdGlvbnMucHJpbmNpcGFsSWQsXG4gICAgcGVybWlzc2lvbnNCeVNjb3BlLFxuICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uLFxuICAgIHJlc291cmNlR3JhbnRzOiBvcHRpb25zLmdyYW50cy5tYXAoKGdyYW50KSA9PiAoe1xuICAgICAgcmVzb3VyY2VJZDogZ3JhbnQucmVzb3VyY2VJZCxcbiAgICAgIHBlcm1pc3Npb25LZXk6IGdyYW50LnBlcm1pc3Npb25LZXksXG4gICAgfSkpLFxuICB9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsU2VydmljZTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4gJiB7IGlkOiBzdHJpbmcgfT4gZXh0ZW5kcyBNb2RlbFNlcnZpY2U8XG4gIE0sXG4gIFJlcG9zaXRvcnk8TSwgYW55PlxuPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF6ejogbmV3ICgpID0+IE0pIHtcbiAgICBzdXBlcihjbGF6eik7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3TW9kZWw8VD4oY2xheno6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IGNsYXp6KCkgYXMgb2JqZWN0LCBkYXRhIGFzIG9iamVjdCkgYXMgVDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9uZShkYXRhOiBQYXJ0aWFsPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG8uY3JlYXRlKE9iamVjdC5hc3NpZ24oe30gYXMgTSwgZGF0YSBhcyBvYmplY3QpLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5SWQoaWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnJlYWQoaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlT25lKGlkOiBzdHJpbmcsIHBhdGNoOiBQYXJ0aWFsPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQoaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLnJlcG8udXBkYXRlKE9iamVjdC5hc3NpZ24oZXhpc3RpbmcsIHBhdGNoKSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBkZWxldGVCeUlkKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZXBvLmRlbGV0ZShpZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kT25lQnk8SyBleHRlbmRzIGtleW9mIE0gJiBzdHJpbmc+KFxuICAgIGtleTogSyxcbiAgICB2YWx1ZTogTVtLXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmZpbmRPbmVCeShrZXksIHZhbHVlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRNYW55Qnk8SyBleHRlbmRzIGtleW9mIE0gJiBzdHJpbmc+KFxuICAgIGtleTogSyxcbiAgICB2YWx1ZTogTVtLXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG8uc2VsZWN0KCkud2hlcmUoeyBba2V5XTogdmFsdWUgfSBhcyBhbnkpLmV4ZWN1dGUoLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0QWxsKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnNlbGVjdCgpLmV4ZWN1dGUoLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkKCk6IHN0cmluZyB7XG4gIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpb25JZCh2YWx1ZTogc3RyaW5nIHwgeyBpZDogc3RyaW5nIH0pOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS5pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGh6U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZXM6IEF1dGh6RGF0YVNvdXJjZXM7XG5cbiAgY29uc3RydWN0b3IoZGF0YVNvdXJjZXM6IEF1dGh6RGF0YVNvdXJjZXMgPSB7fSkge1xuICAgIHRoaXMuZGF0YVNvdXJjZXMgPSBkYXRhU291cmNlcztcbiAgfVxuXG4gIGFzeW5jIGNhbkFjY2VzcyhpbnB1dDogQ2FuQWNjZXNzSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYXQgPSBpbnB1dC5hdCA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKGlucHV0LnNjb3BlS2luZCAmJiBpbnB1dC5zY29wZUlkKSB7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgaW5wdXQudGVuYW50SWQsXG4gICAgICAgIGlucHV0LnNjb3BlS2luZCxcbiAgICAgICAgaW5wdXQuc2NvcGVJZFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0b0FycmF5KHBlcm1pc3Npb25zKS5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgICBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxvYWRSZXNvdXJjZT8uKFxuICAgICAgaW5wdXQudGVuYW50SWQsXG4gICAgICBpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkXG4gICAgKTtcbiAgICBpZiAoIXJlc291cmNlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJlc291cmNlLnRlbmFudElkICE9PSBpbnB1dC50ZW5hbnRJZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHJlc291cmNlLm93bmVyUHJpbmNpcGFsSWQgPT09IGlucHV0LnByaW5jaXBhbElkKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGdyYW50cyA9IHRvQXJyYXkoXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RSZXNvdXJjZUdyYW50cz8uKFxuICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgaW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZFxuICAgICAgKVxuICAgICkuZmlsdGVyKFxuICAgICAgKGdyYW50KSA9PlxuICAgICAgICBncmFudC5wcmluY2lwYWxJZCA9PT0gaW5wdXQucHJpbmNpcGFsSWQgJiZcbiAgICAgICAgZ3JhbnQucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICBpc1RpbWVWYWxpZChhdCwgZ3JhbnQuc3RhcnRzQXQsIGdyYW50LmV4cGlyZXNBdClcbiAgICApO1xuICAgIGlmIChncmFudHMubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCB2aXNpYmlsaXR5ID0gcmVzb3VyY2UudmlzaWJpbGl0eTtcbiAgICBpZiAoXG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuUHJpdmF0ZSB8fFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5LlJlc291cmNlQWNsXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5Lk9yZ1VuaXQgfHxcbiAgICAgIHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5PcmdTdWJ0cmVlXG4gICAgKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVQZXJtaXNzaW9ucyA9IHRvQXJyYXkoXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgICBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgICByZXNvdXJjZS5vcmdVbml0SWRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBlZmZlY3RpdmVQZXJtaXNzaW9ucy5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgICBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuVGVuYW50KSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVQZXJtaXNzaW9ucyA9IHRvQXJyYXkoXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgICBTY29wZUtpbmQuVGVuYW50LFxuICAgICAgICAgIGlucHV0LnRlbmFudElkXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm4gZWZmZWN0aXZlUGVybWlzc2lvbnMuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgICAgcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgICAgaXNUaW1lVmFsaWQoYXQsIHBlcm1pc3Npb24uc3RhcnRzQXQsIHBlcm1pc3Npb24uZXhwaXJlc0F0KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZXF1aXJlQWNjZXNzKGlucHV0OiBDYW5BY2Nlc3NJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmNhbkFjY2VzcyhpbnB1dCwgLi4uYXJncykpKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICBgQWNjZXNzIGRlbmllZCBmb3IgJHtpbnB1dC5wZXJtaXNzaW9uS2V5fSBvbiAke2lucHV0LnJlc291cmNlUHJvdGVjdGVkSWQgPz8gc2NvcGVLZXkoaW5wdXQuc2NvcGVLaW5kID8/IFNjb3BlS2luZC5SZXNvdXJjZSwgaW5wdXQuc2NvcGVJZCA/PyBcIlwiKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQWNjZXNzQ29udGV4dChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxBY2Nlc3NDb250ZXh0PiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0b0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnM/Lih0ZW5hbnRJZCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgICBjb25zdCBncmFudHMgPSB0b0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0UHJpbmNpcGFsR3JhbnRzPy4odGVuYW50SWQsIHByaW5jaXBhbElkKVxuICAgICk7XG4gICAgcmV0dXJuIGJ1aWxkQWNjZXNzQ29udGV4dCh7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbnMsXG4gICAgICBncmFudHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZEFyYW5nb0NvbnRleHQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEFyYW5nb0F1dGhDb250ZXh0PiB7XG4gICAgY29uc3QgYWNjZXNzID0gYXdhaXQgdGhpcy5idWlsZEFjY2Vzc0NvbnRleHQodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9IGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHNcbiAgICAgIC5maWx0ZXIoKGdyYW50KSA9PiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5KVxuICAgICAgLm1hcCgoZ3JhbnQpID0+IGdyYW50LnJlc291cmNlSWQpO1xuICAgIHJldHVybiBidWlsZEFyYW5nb0NvbnRleHQoe1xuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIHBlcm1pc3Npb25LZXksXG4gICAgICBhbGxvd2VkT3JnVW5pdElkcyxcbiAgICAgIGFsbG93ZWRSZXNvdXJjZUlkcyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUWRyYW50RmlsdGVyKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxRZHJhbnRBdXRoRmlsdGVyPiB7XG4gICAgY29uc3QgYWNjZXNzID0gYXdhaXQgdGhpcy5idWlsZEFjY2Vzc0NvbnRleHQodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9IGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHNcbiAgICAgIC5maWx0ZXIoKGdyYW50KSA9PiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5KVxuICAgICAgLm1hcCgoZ3JhbnQpID0+IGdyYW50LnJlc291cmNlSWQpO1xuICAgIHJldHVybiBidWlsZFFkcmFudEZpbHRlcih7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbktleSxcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzLFxuICAgICAgYWxsb3dlZFJlc291cmNlSWRzLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IHRyYW5zYWN0aW9uYWwgfTtcbiJdfQ==