breeze-client 2.1.6 → 2.1.7-mjs

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 (378) hide show
  1. package/LICENSE +1 -1
  2. package/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
  3. package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
  4. package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
  5. package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
  6. package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
  7. package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
  8. package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
  9. package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
  10. package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
  11. package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
  12. package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
  13. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +135 -0
  14. package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +49 -0
  15. package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
  16. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +135 -0
  17. package/esm2022/adapter-ajax-fetch/adapter-core.mjs +49 -0
  18. package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
  19. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +139 -0
  20. package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +49 -0
  21. package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
  22. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +107 -0
  23. package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
  24. package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
  25. package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
  26. package/esm2022/adapter-data-service-odata/adapter-core.mjs +49 -0
  27. package/{esm5/adapter-data-service-odata/adapter-data-service-odata.js → esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs} +138 -147
  28. package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
  29. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +100 -0
  30. package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
  31. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +269 -0
  32. package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
  33. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +241 -0
  34. package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
  35. package/esm2022/adapter-uri-builder-json/adapter-core.mjs +49 -0
  36. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +37 -0
  37. package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
  38. package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +49 -0
  39. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +191 -0
  40. package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
  41. package/esm2022/breeze-client.mjs +5 -0
  42. package/esm2022/index.mjs +2 -0
  43. package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
  44. package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
  45. package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
  46. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +421 -0
  47. package/esm2022/src/abstract-data-service-adapter.mjs +325 -0
  48. package/esm2022/src/array.mjs +4 -0
  49. package/esm2022/src/assert-param.mjs +330 -0
  50. package/esm2022/src/breeze.mjs +85 -0
  51. package/esm2022/src/complex-array.mjs +117 -0
  52. package/esm2022/src/config.mjs +232 -0
  53. package/esm2022/src/core.mjs +712 -0
  54. package/esm2022/src/csdl-metadata-parser.mjs +385 -0
  55. package/esm2022/src/data-service.mjs +239 -0
  56. package/esm2022/src/data-type.mjs +507 -0
  57. package/esm2022/src/default-property-interceptor.mjs +460 -0
  58. package/{esm2015/src/entity-action.js → esm2022/src/entity-action.mjs} +25 -25
  59. package/esm2022/src/entity-aspect.mjs +897 -0
  60. package/esm2022/src/entity-group.mjs +192 -0
  61. package/esm2022/src/entity-key.mjs +127 -0
  62. package/esm2022/src/entity-manager.mjs +2183 -0
  63. package/esm2022/src/entity-metadata.mjs +2242 -0
  64. package/esm2022/src/entity-query.mjs +1024 -0
  65. package/esm2022/src/entity-state.mjs +107 -0
  66. package/esm2022/src/enum.mjs +143 -0
  67. package/esm2022/src/event.mjs +264 -0
  68. package/esm2022/src/interface-registry.mjs +39 -0
  69. package/esm2022/src/key-generator.mjs +110 -0
  70. package/esm2022/src/local-query-comparison-options.mjs +75 -0
  71. package/esm2022/src/mapping-context.mjs +422 -0
  72. package/{esm5/src/naming-convention.js → esm2022/src/naming-convention.mjs} +35 -29
  73. package/esm2022/src/observable-array.mjs +183 -0
  74. package/esm2022/src/predicate.mjs +1259 -0
  75. package/esm2022/src/primitive-array.mjs +85 -0
  76. package/esm2022/src/query-options.mjs +160 -0
  77. package/esm2022/src/relation-array.mjs +173 -0
  78. package/esm2022/src/save-options.mjs +51 -0
  79. package/esm2022/src/unattached-children-map.mjs +56 -0
  80. package/{esm5/src/validate.js → esm2022/src/validate.mjs} +116 -110
  81. package/esm2022/src/validation-options.mjs +78 -0
  82. package/{fesm2015/breeze-client-adapter-ajax-angularjs.js → fesm2022/breeze-client-adapter-ajax-angularjs.mjs} +6 -1
  83. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
  84. package/{fesm2015/breeze-client-adapter-ajax-fetch.js → fesm2022/breeze-client-adapter-ajax-fetch.mjs} +9 -4
  85. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
  86. package/{fesm2015/breeze-client-adapter-ajax-httpclient.js → fesm2022/breeze-client-adapter-ajax-httpclient.mjs} +6 -4
  87. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
  88. package/{fesm2015/breeze-client-adapter-ajax-jquery.js → fesm2022/breeze-client-adapter-ajax-jquery.mjs} +6 -2
  89. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
  90. package/{fesm2015/breeze-client-adapter-ajax-post.js → fesm2022/breeze-client-adapter-ajax-post.mjs} +1 -1
  91. package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +1 -0
  92. package/{fesm2015/breeze-client-adapter-data-service-odata.js → fesm2022/breeze-client-adapter-data-service-odata.mjs} +68 -69
  93. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  94. package/{fesm2015/breeze-client-adapter-data-service-webapi.js → fesm2022/breeze-client-adapter-data-service-webapi.mjs} +30 -30
  95. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  96. package/{fesm2015/breeze-client-adapter-model-library-backing-store.js → fesm2022/breeze-client-adapter-model-library-backing-store.mjs} +14 -13
  97. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
  98. package/{fesm2015/breeze-client-adapter-model-library-ko.js → fesm2022/breeze-client-adapter-model-library-ko.mjs} +14 -13
  99. package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +1 -0
  100. package/{fesm2015/breeze-client-adapter-uri-builder-json.js → fesm2022/breeze-client-adapter-uri-builder-json.mjs} +9 -8
  101. package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
  102. package/{fesm2015/breeze-client-adapter-uri-builder-odata.js → fesm2022/breeze-client-adapter-uri-builder-odata.mjs} +86 -86
  103. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
  104. package/{fesm2015/breeze-client-mixin-get-entity-graph.js → fesm2022/breeze-client-mixin-get-entity-graph.mjs} +1 -1
  105. package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
  106. package/{fesm2015/breeze-client-mixin-save-queuing.js → fesm2022/breeze-client-mixin-save-queuing.mjs} +23 -2
  107. package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +1 -0
  108. package/{fesm2015/breeze-client.js → fesm2022/breeze-client.mjs} +2126 -1577
  109. package/fesm2022/breeze-client.mjs.map +1 -0
  110. package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
  111. package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
  112. package/package.json +93 -11
  113. package/src/abstract-data-service-adapter.d.ts +20 -0
  114. package/src/config.d.ts +1 -1
  115. package/src/core.d.ts +1 -1
  116. package/src/entity-aspect.d.ts +1 -1
  117. package/src/entity-metadata.d.ts +8 -6
  118. package/src/entity-query.d.ts +18 -4
  119. package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
  120. package/adapter-ajax-angularjs/package.json +0 -13
  121. package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
  122. package/adapter-ajax-fetch/package.json +0 -13
  123. package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
  124. package/adapter-ajax-httpclient/package.json +0 -13
  125. package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
  126. package/adapter-ajax-jquery/package.json +0 -13
  127. package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
  128. package/adapter-ajax-post/package.json +0 -13
  129. package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
  130. package/adapter-data-service-odata/package.json +0 -13
  131. package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
  132. package/adapter-data-service-webapi/package.json +0 -13
  133. package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
  134. package/adapter-model-library-backing-store/package.json +0 -13
  135. package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
  136. package/adapter-model-library-ko/package.json +0 -13
  137. package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
  138. package/adapter-uri-builder-json/package.json +0 -13
  139. package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
  140. package/adapter-uri-builder-odata/package.json +0 -13
  141. package/breeze-client.d.ts +0 -8
  142. package/breeze-client.metadata.json +0 -1
  143. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
  144. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
  145. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
  146. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
  147. package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
  148. package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
  149. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
  150. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
  151. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
  152. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
  153. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
  154. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
  155. package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
  156. package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
  157. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
  158. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
  159. package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
  160. package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
  161. package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
  162. package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
  163. package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -747
  164. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
  165. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
  166. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
  167. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -333
  168. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
  169. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
  170. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
  171. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
  172. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
  173. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
  174. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
  175. package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
  176. package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
  177. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
  178. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
  179. package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
  180. package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
  181. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
  182. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
  183. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
  184. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
  185. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
  186. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
  187. package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
  188. package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
  189. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
  190. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
  191. package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
  192. package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
  193. package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
  194. package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
  195. package/bundles/breeze-client.umd.js +0 -14181
  196. package/bundles/breeze-client.umd.js.map +0 -1
  197. package/bundles/breeze-client.umd.min.js +0 -16
  198. package/bundles/breeze-client.umd.min.js.map +0 -1
  199. package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
  200. package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
  201. package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  202. package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
  203. package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
  204. package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  205. package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
  206. package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
  207. package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  208. package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
  209. package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  210. package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
  211. package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  212. package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
  213. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -463
  214. package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  215. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -100
  216. package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  217. package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
  218. package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  219. package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
  220. package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  221. package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
  222. package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
  223. package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  224. package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
  225. package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
  226. package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  227. package/esm2015/breeze-client.js +0 -9
  228. package/esm2015/index.js +0 -2
  229. package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  230. package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  231. package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  232. package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
  233. package/esm2015/src/abstract-data-service-adapter.js +0 -296
  234. package/esm2015/src/array.js +0 -4
  235. package/esm2015/src/assert-param.js +0 -312
  236. package/esm2015/src/breeze.js +0 -85
  237. package/esm2015/src/complex-array.js +0 -119
  238. package/esm2015/src/config.js +0 -223
  239. package/esm2015/src/core.js +0 -714
  240. package/esm2015/src/csdl-metadata-parser.js +0 -385
  241. package/esm2015/src/data-service.js +0 -203
  242. package/esm2015/src/data-type.js +0 -503
  243. package/esm2015/src/default-property-interceptor.js +0 -460
  244. package/esm2015/src/entity-aspect.js +0 -804
  245. package/esm2015/src/entity-group.js +0 -187
  246. package/esm2015/src/entity-key.js +0 -116
  247. package/esm2015/src/entity-manager.js +0 -2094
  248. package/esm2015/src/entity-metadata.js +0 -2109
  249. package/esm2015/src/entity-query.js +0 -996
  250. package/esm2015/src/entity-state.js +0 -107
  251. package/esm2015/src/enum.js +0 -141
  252. package/esm2015/src/event.js +0 -256
  253. package/esm2015/src/interface-registry.js +0 -41
  254. package/esm2015/src/key-generator.js +0 -108
  255. package/esm2015/src/local-query-comparison-options.js +0 -65
  256. package/esm2015/src/mapping-context.js +0 -411
  257. package/esm2015/src/naming-convention.js +0 -88
  258. package/esm2015/src/observable-array.js +0 -185
  259. package/esm2015/src/predicate.js +0 -1242
  260. package/esm2015/src/primitive-array.js +0 -87
  261. package/esm2015/src/query-options.js +0 -152
  262. package/esm2015/src/relation-array.js +0 -175
  263. package/esm2015/src/save-options.js +0 -41
  264. package/esm2015/src/unattached-children-map.js +0 -58
  265. package/esm2015/src/validate.js +0 -991
  266. package/esm2015/src/validation-options.js +0 -64
  267. package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
  268. package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
  269. package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  270. package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
  271. package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
  272. package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  273. package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
  274. package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
  275. package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  276. package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
  277. package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  278. package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
  279. package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  280. package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
  281. package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  282. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -105
  283. package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  284. package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
  285. package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  286. package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
  287. package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  288. package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
  289. package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
  290. package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  291. package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
  292. package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
  293. package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  294. package/esm5/breeze-client.js +0 -9
  295. package/esm5/index.js +0 -2
  296. package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  297. package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  298. package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  299. package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
  300. package/esm5/src/abstract-data-service-adapter.js +0 -302
  301. package/esm5/src/array.js +0 -4
  302. package/esm5/src/assert-param.js +0 -317
  303. package/esm5/src/breeze.js +0 -85
  304. package/esm5/src/complex-array.js +0 -119
  305. package/esm5/src/config.js +0 -228
  306. package/esm5/src/core.js +0 -722
  307. package/esm5/src/csdl-metadata-parser.js +0 -385
  308. package/esm5/src/data-service.js +0 -207
  309. package/esm5/src/data-type.js +0 -510
  310. package/esm5/src/default-property-interceptor.js +0 -460
  311. package/esm5/src/entity-action.js +0 -52
  312. package/esm5/src/entity-aspect.js +0 -810
  313. package/esm5/src/entity-group.js +0 -189
  314. package/esm5/src/entity-key.js +0 -118
  315. package/esm5/src/entity-manager.js +0 -2112
  316. package/esm5/src/entity-metadata.js +0 -2144
  317. package/esm5/src/entity-query.js +0 -1023
  318. package/esm5/src/entity-state.js +0 -114
  319. package/esm5/src/enum.js +0 -144
  320. package/esm5/src/event.js +0 -259
  321. package/esm5/src/interface-registry.js +0 -43
  322. package/esm5/src/key-generator.js +0 -111
  323. package/esm5/src/local-query-comparison-options.js +0 -67
  324. package/esm5/src/mapping-context.js +0 -413
  325. package/esm5/src/observable-array.js +0 -201
  326. package/esm5/src/predicate.js +0 -1307
  327. package/esm5/src/primitive-array.js +0 -87
  328. package/esm5/src/query-options.js +0 -167
  329. package/esm5/src/relation-array.js +0 -175
  330. package/esm5/src/save-options.js +0 -43
  331. package/esm5/src/unattached-children-map.js +0 -60
  332. package/esm5/src/validation-options.js +0 -66
  333. package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  334. package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
  335. package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  336. package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
  337. package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
  338. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
  339. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
  340. package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  341. package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
  342. package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
  343. package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  344. package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
  345. package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
  346. package/fesm2015/breeze-client.js.map +0 -1
  347. package/fesm5/breeze-client-adapter-ajax-angularjs.js +0 -186
  348. package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  349. package/fesm5/breeze-client-adapter-ajax-fetch.js +0 -186
  350. package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
  351. package/fesm5/breeze-client-adapter-ajax-httpclient.js +0 -193
  352. package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  353. package/fesm5/breeze-client-adapter-ajax-jquery.js +0 -111
  354. package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
  355. package/fesm5/breeze-client-adapter-ajax-post.js +0 -86
  356. package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
  357. package/fesm5/breeze-client-adapter-data-service-odata.js +0 -523
  358. package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
  359. package/fesm5/breeze-client-adapter-data-service-webapi.js +0 -111
  360. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
  361. package/fesm5/breeze-client-adapter-model-library-backing-store.js +0 -276
  362. package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  363. package/fesm5/breeze-client-adapter-model-library-ko.js +0 -248
  364. package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
  365. package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
  366. package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
  367. package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
  368. package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  369. package/fesm5/breeze-client-mixin-get-entity-graph.js +0 -254
  370. package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
  371. package/fesm5/breeze-client-mixin-save-queuing.js +0 -356
  372. package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
  373. package/fesm5/breeze-client.js +0 -13903
  374. package/fesm5/breeze-client.js.map +0 -1
  375. package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
  376. package/mixin-get-entity-graph/package.json +0 -13
  377. package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
  378. package/mixin-save-queuing/package.json +0 -13
@@ -1,411 +0,0 @@
1
- import { core } from './core';
2
- import { DataType } from './data-type';
3
- import { EntityState } from './entity-state';
4
- import { EntityAction } from './entity-action';
5
- import { EntityType, DataProperty } from './entity-metadata';
6
- import { MergeStrategy } from './query-options';
7
- import { EntityQuery } from './entity-query';
8
- /**
9
- For use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation.
10
- @adapter (see [[IDataServiceAdapter]])
11
- @hidden
12
- */
13
- export class MappingContext {
14
- constructor(config) {
15
- this.rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
16
- core.extend(this, config, [
17
- "query", "entityManager", "dataService", "mergeOptions"
18
- ]);
19
- // calc'd props
20
- this.refMap = {};
21
- this.deferredFns = [];
22
- this.jsonResultsAdapter = this.dataService.jsonResultsAdapter;
23
- this.metadataStore = this.entityManager.metadataStore;
24
- this.rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
25
- }
26
- getUrl() {
27
- let query = this.query;
28
- if (!query) {
29
- throw new Error("query cannot be empty");
30
- }
31
- let uriString;
32
- if (typeof query === 'string') {
33
- uriString = query;
34
- }
35
- else if (query instanceof EntityQuery) {
36
- uriString = this.dataService.uriBuilder.buildUri(query, this.metadataStore);
37
- }
38
- else {
39
- throw new Error("unable to recognize query parameter as either a string or an EntityQuery");
40
- }
41
- return this.dataService.qualifyUrl(uriString);
42
- }
43
- visitAndMerge(nodes, nodeContext) {
44
- let query = this.query;
45
- let jra = this.jsonResultsAdapter;
46
- nodeContext = nodeContext || {};
47
- let that = this;
48
- let result = core.map(nodes, function (node) {
49
- if (query == null && node.entityAspect) {
50
- // don't bother merging a result from a save that was not returned from the server.
51
- if (node.entityAspect.entityState.isDeleted()) {
52
- that.entityManager.detachEntity(node);
53
- }
54
- else {
55
- node.entityAspect.acceptChanges();
56
- }
57
- return node;
58
- }
59
- let meta = jra.visitNode(node, that, nodeContext) || {};
60
- node = meta.node || node;
61
- if (query && nodeContext.nodeType === "root" && !meta.entityType) {
62
- meta.entityType = query instanceof EntityQuery && query._getToEntityType && query._getToEntityType(that.metadataStore);
63
- }
64
- return processMeta(that, node, meta);
65
- }, this.mergeOptions.includeDeleted);
66
- if (result.filter && !this.mergeOptions.includeDeleted) {
67
- // result may have deleted entities because related nodes were processed
68
- result = result.filter((x) => x && (!x.entityAspect || !x.entityAspect.entityState.isDeleted()));
69
- }
70
- return result;
71
- }
72
- processDeferred() {
73
- if (this.deferredFns.length > 0) {
74
- this.deferredFns.forEach((fn) => {
75
- fn();
76
- });
77
- }
78
- }
79
- }
80
- MappingContext.prototype._$typeName = "MappingContext";
81
- function processMeta(mc, node, meta, assignFn) {
82
- // == is deliberate here instead of ===
83
- if (meta.ignore || node == null) {
84
- return null;
85
- }
86
- else if (meta.nodeRefId) {
87
- let refValue = resolveEntityRef(mc, meta.nodeRefId);
88
- if (typeof refValue === "function" && assignFn != null) {
89
- mc.deferredFns.push(function () {
90
- assignFn(refValue);
91
- });
92
- return undefined; // deferred and will be set later;
93
- }
94
- return refValue;
95
- }
96
- else if (meta.entityType) {
97
- let entityType = meta.entityType;
98
- if (mc.mergeOptions.noTracking) {
99
- node = processNoMerge(mc, entityType, node);
100
- if (entityType.noTrackingFn) {
101
- node = entityType.noTrackingFn(node, entityType);
102
- }
103
- if (meta.nodeId) {
104
- mc.refMap[meta.nodeId] = node;
105
- }
106
- return node;
107
- }
108
- else {
109
- if (entityType.isComplexType) {
110
- // because we still need to do serverName to client name processing
111
- return processNoMerge(mc, entityType, node);
112
- }
113
- else {
114
- return mergeEntity(mc, node, meta);
115
- }
116
- }
117
- }
118
- else {
119
- if ((!meta.passThru) && typeof node === 'object' && !core.isDate(node)) {
120
- node = processAnonType(mc, node);
121
- }
122
- // updating the refMap for entities is handled by updateEntityRef for entities.
123
- if (meta.nodeId) {
124
- mc.refMap[meta.nodeId] = node;
125
- }
126
- return node;
127
- }
128
- }
129
- function processNoMerge(mc, stype, node) {
130
- let result = {};
131
- stype.dataProperties.forEach(function (dp) {
132
- if (dp.isComplexProperty) {
133
- result[dp.name] = core.map(node[dp.nameOnServer], (v) => {
134
- return processNoMerge(mc, dp.dataType, v);
135
- });
136
- }
137
- else {
138
- result[dp.name] = DataType.parseRawValue(node[dp.nameOnServer], dp.dataType);
139
- }
140
- });
141
- (stype instanceof EntityType) && stype.navigationProperties.forEach((np) => {
142
- let nodeContext = { nodeType: "navProp", navigationProperty: np };
143
- visitNode(node[np.nameOnServer], mc, nodeContext, result, np.name);
144
- });
145
- return result;
146
- }
147
- function processAnonType(mc, node) {
148
- // node is guaranteed to be an object by this point, i.e. not a scalar
149
- let keyFn = mc.metadataStore.namingConvention.serverPropertyNameToClient;
150
- let result = {};
151
- core.objectForEach(node, function (key, value) {
152
- let newKey = keyFn(key);
153
- let nodeContext = { nodeType: "anonProp", propertyName: newKey };
154
- visitNode(value, mc, nodeContext, result, newKey);
155
- });
156
- return result;
157
- }
158
- function visitNode(node, mc, nodeContext, result, key) {
159
- let jra = mc.jsonResultsAdapter;
160
- let meta = jra.visitNode(node, mc, nodeContext) || {};
161
- // allows visitNode to change the value;
162
- node = meta.node || node;
163
- if (meta.ignore)
164
- return;
165
- if (meta.passThru)
166
- return node;
167
- if (Array.isArray(node)) {
168
- nodeContext.nodeType = nodeContext.nodeType + "Item";
169
- result[key] = node.map(function (v, ix) {
170
- meta = jra.visitNode(v, mc, nodeContext) || {};
171
- v = meta.node || v;
172
- return processMeta(mc, v, meta, function (refValue) {
173
- result[key][ix] = refValue();
174
- });
175
- });
176
- }
177
- else {
178
- result[key] = processMeta(mc, node, meta, function (refValue) {
179
- result[key] = refValue();
180
- });
181
- }
182
- }
183
- function resolveEntityRef(mc, nodeRefId) {
184
- let entity = mc.refMap[nodeRefId];
185
- if (entity === undefined) {
186
- return function () {
187
- return mc.refMap[nodeRefId];
188
- };
189
- }
190
- else {
191
- return entity;
192
- }
193
- }
194
- function updateEntityRef(mc, targetEntity, node) {
195
- let nodeId = node._$meta.nodeId;
196
- if (!nodeId && node._$meta.extraMetadata) {
197
- // odata case. refMap isn't really used, but is returned as data.retrievedEntities, so we populated it anyway.
198
- nodeId = node._$meta.extraMetadata.uriKey;
199
- }
200
- if (nodeId != null) {
201
- mc.refMap[nodeId] = targetEntity;
202
- }
203
- }
204
- // can return null for a deleted entity if includeDeleted == false
205
- function mergeEntity(mc, node, meta) {
206
- node._$meta = meta;
207
- let em = mc.entityManager;
208
- let entityType = meta.entityType;
209
- if (typeof (entityType) === 'string') {
210
- entityType = mc.metadataStore._getStructuralType(entityType, false);
211
- }
212
- node.entityType = entityType;
213
- let mergeStrategy = mc.mergeOptions.mergeStrategy;
214
- let isSaving = mc.query == null;
215
- let entityKey = entityType.getEntityKeyFromRawEntity(node, mc.rawValueFn);
216
- let targetEntity = em.getEntityByKey(entityKey);
217
- if (targetEntity) {
218
- if (isSaving && targetEntity.entityAspect.entityState.isDeleted()) {
219
- em.detachEntity(targetEntity);
220
- return targetEntity;
221
- }
222
- let targetEntityState = targetEntity.entityAspect.entityState;
223
- if (mergeStrategy === MergeStrategy.Disallowed) {
224
- throw new Error("A MergeStrategy of 'Disallowed' prevents " + entityKey.toString() + " from being merged");
225
- }
226
- else if (mergeStrategy === MergeStrategy.SkipMerge) {
227
- updateEntityNoMerge(mc, targetEntity, node);
228
- }
229
- else {
230
- if (mergeStrategy === MergeStrategy.OverwriteChanges
231
- || targetEntityState.isUnchanged()) {
232
- updateEntity(mc, targetEntity, node);
233
- targetEntity.entityAspect.wasLoaded = true;
234
- if (meta.extraMetadata) {
235
- targetEntity.entityAspect.extraMetadata = meta.extraMetadata;
236
- }
237
- targetEntity.entityAspect.entityState = EntityState.Unchanged;
238
- clearOriginalValues(targetEntity);
239
- // propertyName not specified because multiple props EntityChangedEventArgs
240
- targetEntity.entityAspect.propertyChanged.publish({ entity: targetEntity, propertyName: null });
241
- let action = isSaving ? EntityAction.MergeOnSave : EntityAction.MergeOnQuery;
242
- em.entityChanged.publish({ entityAction: action, entity: targetEntity });
243
- // this is needed to handle an overwrite of a modified entity with an unchanged entity
244
- // which might in turn cause _hasChanges to change.
245
- if (!targetEntityState.isUnchanged()) {
246
- em._notifyStateChange(targetEntity, false);
247
- }
248
- }
249
- else {
250
- // process targetEntity (even if deleted) to ensure related nodes are handled
251
- updateEntityNoMerge(mc, targetEntity, node);
252
- if (targetEntityState === EntityState.Deleted && !mc.mergeOptions.includeDeleted) {
253
- return null;
254
- }
255
- }
256
- }
257
- }
258
- else {
259
- targetEntity = entityType._createInstanceCore();
260
- updateEntity(mc, targetEntity, node);
261
- if (meta.extraMetadata) {
262
- targetEntity.entityAspect.extraMetadata = meta.extraMetadata;
263
- }
264
- // em._attachEntityCore(targetEntity, EntityState.Unchanged, MergeStrategy.Disallowed);
265
- em._attachEntityCore(targetEntity, EntityState.Unchanged, mergeStrategy);
266
- targetEntity.entityAspect.wasLoaded = true;
267
- em.entityChanged.publish({ entityAction: EntityAction.AttachOnQuery, entity: targetEntity });
268
- }
269
- return targetEntity;
270
- }
271
- // copied from entityAspect
272
- function clearOriginalValues(target) {
273
- let aspect = target.entityAspect || target.complexAspect;
274
- aspect.originalValues = {};
275
- let stype = target.entityType || target.complexType;
276
- stype.complexProperties.forEach(function (cp) {
277
- let cos = target.getProperty(cp.name);
278
- if (cp.isScalar) {
279
- clearOriginalValues(cos);
280
- }
281
- else {
282
- cos._acceptChanges();
283
- cos.forEach(clearOriginalValues);
284
- }
285
- });
286
- }
287
- function updateEntityNoMerge(mc, targetEntity, node) {
288
- updateEntityRef(mc, targetEntity, node);
289
- // we still need to merge related entities even if top level entity wasn't modified.
290
- node.entityType.navigationProperties.forEach(function (np) {
291
- if (np.isScalar) {
292
- mergeRelatedEntityCore(mc, node, np);
293
- }
294
- else {
295
- mergeRelatedEntitiesCore(mc, node, np);
296
- }
297
- });
298
- }
299
- function updateEntity(mc, targetEntity, node) {
300
- updateEntityRef(mc, targetEntity, node);
301
- let entityType = targetEntity.entityType;
302
- entityType._updateTargetFromRaw(targetEntity, node, mc.rawValueFn);
303
- entityType.navigationProperties.forEach(function (np) {
304
- if (np.isScalar) {
305
- mergeRelatedEntity(mc, np, targetEntity, node);
306
- }
307
- else {
308
- mergeRelatedEntities(mc, np, targetEntity, node);
309
- }
310
- });
311
- }
312
- function mergeRelatedEntity(mc, navigationProperty, targetEntity, rawEntity) {
313
- let relatedEntity = mergeRelatedEntityCore(mc, rawEntity, navigationProperty);
314
- if (relatedEntity == null)
315
- return;
316
- if (typeof relatedEntity === 'function') {
317
- mc.deferredFns.push(function () {
318
- relatedEntity = relatedEntity();
319
- updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);
320
- });
321
- }
322
- else {
323
- updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);
324
- }
325
- }
326
- function mergeRelatedEntities(mc, navigationProperty, targetEntity, rawEntity) {
327
- let relatedEntities = mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty);
328
- if (relatedEntities == null)
329
- return;
330
- let inverseProperty = navigationProperty.inverse;
331
- if (!inverseProperty)
332
- return;
333
- let originalRelatedEntities = targetEntity.getProperty(navigationProperty.name);
334
- originalRelatedEntities.wasLoaded = true;
335
- relatedEntities.forEach(function (relatedEntity) {
336
- if (typeof relatedEntity === 'function') {
337
- mc.deferredFns.push(function () {
338
- relatedEntity = relatedEntity();
339
- updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty);
340
- });
341
- }
342
- else {
343
- updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty);
344
- }
345
- });
346
- }
347
- function mergeRelatedEntityCore(mc, rawEntity, navigationProperty) {
348
- let relatedRawEntity = rawEntity[navigationProperty.nameOnServer];
349
- if (!relatedRawEntity)
350
- return null;
351
- let relatedEntity = mc.visitAndMerge(relatedRawEntity, { nodeType: "navProp", navigationProperty: navigationProperty });
352
- return relatedEntity;
353
- }
354
- function mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty) {
355
- let relatedRawEntities = rawEntity[navigationProperty.nameOnServer];
356
- if (!relatedRawEntities)
357
- return null;
358
- // needed if what is returned is not an array and we expect one - this happens with __deferred in OData.
359
- if (!Array.isArray(relatedRawEntities)) {
360
- // return null;
361
- relatedRawEntities = relatedRawEntities.results; // OData v3 will look like this with an expand
362
- if (!relatedRawEntities) {
363
- return null;
364
- }
365
- }
366
- let relatedEntities = mc.visitAndMerge(relatedRawEntities, { nodeType: "navPropItem", navigationProperty: navigationProperty });
367
- return relatedEntities;
368
- }
369
- function updateRelatedEntity(relatedEntity, targetEntity, navigationProperty) {
370
- if (!relatedEntity)
371
- return;
372
- let propName = navigationProperty.name;
373
- let currentRelatedEntity = targetEntity.getProperty(propName);
374
- // check if the related entity is already hooked up
375
- if (currentRelatedEntity !== relatedEntity) {
376
- // if not hook up both directions.
377
- targetEntity.setProperty(propName, relatedEntity);
378
- let inverseProperty = navigationProperty.inverse;
379
- if (!inverseProperty)
380
- return;
381
- if (inverseProperty.isScalar) {
382
- relatedEntity.setProperty(inverseProperty.name, targetEntity);
383
- }
384
- else {
385
- let collection = relatedEntity.getProperty(inverseProperty.name);
386
- collection.push(targetEntity);
387
- }
388
- }
389
- }
390
- function updateRelatedEntityInCollection(mc, relatedEntity, relatedEntities, targetEntity, inverseProperty) {
391
- if (!relatedEntity)
392
- return;
393
- // don't update relatedCollection if preserveChanges & relatedEntity has an fkChange.
394
- if (relatedEntity.entityAspect.entityState === EntityState.Modified
395
- && mc.mergeOptions.mergeStrategy === MergeStrategy.PreserveChanges) {
396
- let origValues = relatedEntity.entityAspect.originalValues;
397
- let fkWasModified = inverseProperty.relatedDataProperties.some(function (dp) {
398
- return origValues[dp.name] != undefined;
399
- });
400
- if (fkWasModified)
401
- return;
402
- }
403
- // check if the related entity is already hooked up
404
- let thisEntity = relatedEntity.getProperty(inverseProperty.name);
405
- if (thisEntity !== targetEntity) {
406
- // if not - hook it up.
407
- relatedEntities.push(relatedEntity);
408
- relatedEntity.setProperty(inverseProperty.name, targetEntity);
409
- }
410
- }
411
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9tYXBwaW5nLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFHLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxXQUFXLEVBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFpQixVQUFVLEVBQWtCLFlBQVksRUFBc0IsTUFBTSxtQkFBbUIsQ0FBQztBQUVoSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBc0I3Qzs7OztFQUlFO0FBQ0YsTUFBTSxPQUFPLGNBQWM7SUFpQnpCLFlBQVksTUFBNEI7UUFieEMsZUFBVSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLHFDQUFxQztRQWVwRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsY0FBYztTQUN4RCxDQUFDLENBQUM7UUFFSCxlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFD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QWUsRUFBRTtRQUNwRSxJQUFJLFVBQVUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztRQUMzRCxJQUFJLGFBQWEsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN6RSxPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhO1lBQUUsT0FBTztLQUMzQjtJQUNELG1EQUFtRDtJQUNuRCxJQUFJLFVBQVUsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqRSxJQUFJLFVBQVUsS0FBSyxZQUFZLEVBQUU7UUFDL0IsdUJBQXVCO1FBQ3ZCLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQy9EO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTZXJ2aWNlQWRhcHRlciB9IGZyb20gJy4vaW50ZXJmYWNlLXJlZ2lzdHJ5JztcclxuaW1wb3J0IHsgY29yZSB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IERhdGFUeXBlICB9IGZyb20gJy4vZGF0YS10eXBlJztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2UsIEpzb25SZXN1bHRzQWRhcHRlciwgTm9kZUNvbnRleHQsIE5vZGVNZXRhIH0gZnJvbSAnLi9kYXRhLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlTdGF0ZSAgfSBmcm9tICcuL2VudGl0eS1zdGF0ZSc7XHJcbmltcG9ydCB7IEVudGl0eUFjdGlvbiB9IGZyb20gJy4vZW50aXR5LWFjdGlvbic7XHJcbmltcG9ydCB7IE1ldGFkYXRhU3RvcmUsIEVudGl0eVR5cGUsIFN0cnVjdHVyYWxUeXBlLCBEYXRhUHJvcGVydHksIE5hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gJy4vZW50aXR5LW1ldGFkYXRhJztcclxuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gJy4vZW50aXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBNZXJnZVN0cmF0ZWd5IH0gZnJvbSAnLi9xdWVyeS1vcHRpb25zJztcclxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSAnLi9lbnRpdHktYXNwZWN0JztcclxuaW1wb3J0IHsgRW50aXR5UXVlcnkgfSBmcm9tICcuL2VudGl0eS1xdWVyeSc7XHJcblxyXG5cclxuLyoqXHJcbkZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGludGVyZmFjZSBNZXJnZU9wdGlvbnMge1xyXG4gIG1lcmdlU3RyYXRlZ3k6IE1lcmdlU3RyYXRlZ3k7XHJcbiAgaW5jbHVkZURlbGV0ZWQ/OiBib29sZWFuO1xyXG4gIG5vVHJhY2tpbmc/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQGhpZGRlbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1hcHBpbmdDb250ZXh0Q29uZmlnIHtcclxuICBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XHJcbiAgcXVlcnk/OiBFbnRpdHlRdWVyeSB8IHN0cmluZztcclxuICBlbnRpdHlNYW5hZ2VyOiBFbnRpdHlNYW5hZ2VyO1xyXG4gIG1lcmdlT3B0aW9uczogTWVyZ2VPcHRpb25zO1xyXG59XHJcblxyXG4vKipcclxuRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gVGhlIGNsYXNzIGlzIGZvciB1c2UgaW4gYnVpbGRpbmcgYSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbi4gXHJcbkBhZGFwdGVyIChzZWUgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qL1xyXG5leHBvcnQgY2xhc3MgTWFwcGluZ0NvbnRleHQge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF8kdHlwZU5hbWU6IHN0cmluZzsgLy8gb24gcHJvdG90eXBlXHJcblxyXG4gIHJhd1ZhbHVlRm4gPSBEYXRhUHJvcGVydHkuZ2V0UmF3VmFsdWVGcm9tU2VydmVyOyAvLyB0aGluayBhYm91dCBwYXNzaW5nIHRoaXMgaW4gbGF0ZXIuXHJcblxyXG4gIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcclxuICBxdWVyeTogRW50aXR5UXVlcnkgfCBzdHJpbmc7XHJcbiAgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcjtcclxuICBtZXJnZU9wdGlvbnM6IE1lcmdlT3B0aW9ucztcclxuICBhZGFwdGVyOiBEYXRhU2VydmljZUFkYXB0ZXI7ICAvLyBhc3NpZ25lZCBpbiB0aGUgQWJzdHJhY3REYXRhU2VydmljZUFkYXB0ZXIuXHJcblxyXG4gIHJlZk1hcDogUmVjb3JkPHN0cmluZywgYW55PjsgLy8gVE9ET1xyXG4gIGRlZmVycmVkRm5zOiBGdW5jdGlvbltdOyAvLyBUT0RPXHJcbiAganNvblJlc3VsdHNBZGFwdGVyOiBKc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgbWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZTtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBNYXBwaW5nQ29udGV4dENvbmZpZykge1xyXG5cclxuICAgIGNvcmUuZXh0ZW5kKHRoaXMsIGNvbmZpZywgW1xyXG4gICAgICBcInF1ZXJ5XCIsIFwiZW50aXR5TWFuYWdlclwiLCBcImRhdGFTZXJ2aWNlXCIsIFwibWVyZ2VPcHRpb25zXCJcclxuICAgIF0pO1xyXG5cclxuICAgIC8vIGNhbGMnZCBwcm9wc1xyXG4gICAgdGhpcy5yZWZNYXAgPSB7fTtcclxuICAgIHRoaXMuZGVmZXJyZWRGbnMgPSBbXTtcclxuICAgIHRoaXMuanNvblJlc3VsdHNBZGFwdGVyID0gdGhpcy5kYXRhU2VydmljZS5qc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgICB0aGlzLm1ldGFkYXRhU3RvcmUgPSB0aGlzLmVudGl0eU1hbmFnZXIubWV0YWRhdGFTdG9yZTtcclxuICAgIHRoaXMucmF3VmFsdWVGbiA9IERhdGFQcm9wZXJ0eS5nZXRSYXdWYWx1ZUZyb21TZXJ2ZXI7IC8vIHRoaW5rIGFib3V0IHBhc3NpbmcgdGhpcyBpbiBsYXRlci5cclxuICB9XHJcblxyXG4gIGdldFVybCgpIHtcclxuICAgIGxldCBxdWVyeSA9IHRoaXMucXVlcnk7XHJcbiAgICBpZiAoIXF1ZXJ5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInF1ZXJ5IGNhbm5vdCBiZSBlbXB0eVwiKTtcclxuICAgIH1cclxuICAgIGxldCB1cmlTdHJpbmc6IHN0cmluZztcclxuICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHVyaVN0cmluZyA9IHF1ZXJ5O1xyXG4gICAgfSBlbHNlIGlmIChxdWVyeSBpbnN0YW5jZW9mIEVudGl0eVF1ZXJ5KSB7XHJcbiAgICAgIHVyaVN0cmluZyA9IHRoaXMuZGF0YVNlcnZpY2UudXJpQnVpbGRlciEuYnVpbGRVcmkocXVlcnksIHRoaXMubWV0YWRhdGFTdG9yZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gcmVjb2duaXplIHF1ZXJ5IHBhcmFtZXRlciBhcyBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gRW50aXR5UXVlcnlcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5xdWFsaWZ5VXJsKHVyaVN0cmluZyk7XHJcbiAgfVxyXG5cclxuICB2aXNpdEFuZE1lcmdlKG5vZGVzOiBhbnlbXSwgbm9kZUNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcclxuICAgIGxldCBqcmEgPSB0aGlzLmpzb25SZXN1bHRzQWRhcHRlcjtcclxuICAgIG5vZGVDb250ZXh0ID0gbm9kZUNvbnRleHQgfHwge307XHJcbiAgICBsZXQgdGhhdCA9IHRoaXM7XHJcbiAgICBsZXQgcmVzdWx0ID0gY29yZS5tYXAobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgIGlmIChxdWVyeSA9PSBudWxsICYmIG5vZGUuZW50aXR5QXNwZWN0KSB7XHJcbiAgICAgICAgLy8gZG9uJ3QgYm90aGVyIG1lcmdpbmcgYSByZXN1bHQgZnJvbSBhIHNhdmUgdGhhdCB3YXMgbm90IHJldHVybmVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAgICBpZiAobm9kZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgICAgIHRoYXQuZW50aXR5TWFuYWdlci5kZXRhY2hFbnRpdHkobm9kZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vZGUuZW50aXR5QXNwZWN0LmFjY2VwdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtZXRhID0ganJhLnZpc2l0Tm9kZShub2RlLCB0aGF0LCBub2RlQ29udGV4dCkgfHwge307XHJcbiAgICAgIG5vZGUgPSBtZXRhLm5vZGUgfHwgbm9kZTtcclxuICAgICAgaWYgKHF1ZXJ5ICYmIG5vZGVDb250ZXh0Lm5vZGVUeXBlID09PSBcInJvb3RcIiAmJiAhbWV0YS5lbnRpdHlUeXBlKSB7XHJcbiAgICAgICAgbWV0YS5lbnRpdHlUeXBlID0gcXVlcnkgaW5zdGFuY2VvZiBFbnRpdHlRdWVyeSAmJiAgcXVlcnkuX2dldFRvRW50aXR5VHlwZSAmJiBxdWVyeS5fZ2V0VG9FbnRpdHlUeXBlKHRoYXQubWV0YWRhdGFTdG9yZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByb2Nlc3NNZXRhKHRoYXQsIG5vZGUsIG1ldGEpO1xyXG4gICAgfSwgdGhpcy5tZXJnZU9wdGlvbnMuaW5jbHVkZURlbGV0ZWQpO1xyXG5cclxuICAgIGlmIChyZXN1bHQuZmlsdGVyICYmICF0aGlzLm1lcmdlT3B0aW9ucy5pbmNsdWRlRGVsZXRlZCkge1xyXG4gICAgICAvLyByZXN1bHQgbWF5IGhhdmUgZGVsZXRlZCBlbnRpdGllcyBiZWNhdXNlIHJlbGF0ZWQgbm9kZXMgd2VyZSBwcm9jZXNzZWRcclxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigoeDogYW55KSA9PiB4ICYmICgheC5lbnRpdHlBc3BlY3QgfHwgIXguZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NEZWZlcnJlZCgpIHtcclxuICAgIGlmICh0aGlzLmRlZmVycmVkRm5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kZWZlcnJlZEZucy5mb3JFYWNoKChmbikgPT4ge1xyXG4gICAgICAgIGZuKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5NYXBwaW5nQ29udGV4dC5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiTWFwcGluZ0NvbnRleHRcIjtcclxuXHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzTWV0YShtYzogTWFwcGluZ0NvbnRleHQsIG5vZGU6IGFueSwgbWV0YTogTm9kZU1ldGEsIGFzc2lnbkZuPzogKHZhbDogYW55KSA9PiB2b2lkKSB7XHJcbiAgLy8gPT0gaXMgZGVsaWJlcmF0ZSBoZXJlIGluc3RlYWQgb2YgPT09XHJcbiAgaWYgKG1ldGEuaWdub3JlIHx8IG5vZGUgPT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfSBlbHNlIGlmIChtZXRhLm5vZGVSZWZJZCkge1xyXG4gICAgbGV0IHJlZlZhbHVlID0gcmVzb2x2ZUVudGl0eVJlZihtYywgbWV0YS5ub2RlUmVmSWQpO1xyXG4gICAgaWYgKHR5cGVvZiByZWZWYWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIGFzc2lnbkZuICE9IG51bGwpIHtcclxuICAgICAgbWMuZGVmZXJyZWRGbnMucHVzaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgYXNzaWduRm4ocmVmVmFsdWUpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZGVmZXJyZWQgYW5kIHdpbGwgYmUgc2V0IGxhdGVyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlZlZhbHVlO1xyXG4gIH0gZWxzZSBpZiAobWV0YS5lbnRpdHlUeXBlKSB7XHJcbiAgICBsZXQgZW50aXR5VHlwZSA9IG1ldGEuZW50aXR5VHlwZTtcclxuICAgIGlmIChtYy5tZXJnZU9wdGlvbnMubm9UcmFja2luZykge1xyXG4gICAgICBub2RlID0gcHJvY2Vzc05vTWVyZ2UobWMsIGVudGl0eVR5cGUsIG5vZGUpO1xyXG4gICAgICBpZiAoZW50aXR5VHlwZS5ub1RyYWNraW5nRm4pIHtcclxuICAgICAgICBub2RlID0gZW50aXR5VHlwZS5ub1RyYWNraW5nRm4obm9kZSwgZW50aXR5VHlwZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1ldGEubm9kZUlkKSB7XHJcbiAgICAgICAgbWMucmVmTWFwW21ldGEubm9kZUlkXSA9IG5vZGU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZW50aXR5VHlwZS5pc0NvbXBsZXhUeXBlKSB7XHJcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRvIGRvIHNlcnZlck5hbWUgdG8gY2xpZW50IG5hbWUgcHJvY2Vzc2luZ1xyXG4gICAgICAgIHJldHVybiBwcm9jZXNzTm9NZXJnZShtYywgZW50aXR5VHlwZSwgbm9kZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG1lcmdlRW50aXR5KG1jLCBub2RlLCBtZXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcblxyXG4gICAgaWYgKCghbWV0YS5wYXNzVGhydSkgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmICEgY29yZS5pc0RhdGUobm9kZSkpIHtcclxuICAgICAgbm9kZSA9IHByb2Nlc3NBbm9uVHlwZShtYywgbm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRpbmcgdGhlIHJlZk1hcCBmb3IgZW50aXRpZXMgaXMgaGFuZGxlZCBieSB1cGRhdGVFbnRpdHlSZWYgZm9yIGVudGl0aWVzLlxyXG4gICAgaWYgKG1ldGEubm9kZUlkKSB7XHJcbiAgICAgIG1jLnJlZk1hcFttZXRhLm5vZGVJZF0gPSBub2RlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGU7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzTm9NZXJnZShtYzogTWFwcGluZ0NvbnRleHQsIHN0eXBlOiBTdHJ1Y3R1cmFsVHlwZSwgbm9kZTogYW55KSB7XHJcbiAgbGV0IHJlc3VsdCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT47XHJcblxyXG4gIHN0eXBlLmRhdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGRwKSB7XHJcbiAgICBpZiAoZHAuaXNDb21wbGV4UHJvcGVydHkpIHtcclxuICAgICAgcmVzdWx0W2RwLm5hbWVdID0gY29yZS5tYXAobm9kZVtkcC5uYW1lT25TZXJ2ZXJdLCAodjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NOb01lcmdlKG1jLCBkcC5kYXRhVHlwZSBhcyBhbnksIHYpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdFtkcC5uYW1lXSA9IERhdGFUeXBlLnBhcnNlUmF3VmFsdWUobm9kZVtkcC5uYW1lT25TZXJ2ZXJdLCBkcC5kYXRhVHlwZSBhcyBEYXRhVHlwZSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdHlwZSBpbnN0YW5jZW9mIEVudGl0eVR5cGUpICYmIHN0eXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goIChucCkgPT4ge1xyXG4gICAgbGV0IG5vZGVDb250ZXh0ID0geyBub2RlVHlwZTogXCJuYXZQcm9wXCIsIG5hdmlnYXRpb25Qcm9wZXJ0eTogbnAgfTtcclxuICAgIHZpc2l0Tm9kZShub2RlW25wLm5hbWVPblNlcnZlcl0sIG1jLCBub2RlQ29udGV4dCwgcmVzdWx0LCBucC5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc0Fub25UeXBlKG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZTogYW55KSB7XHJcbiAgLy8gbm9kZSBpcyBndWFyYW50ZWVkIHRvIGJlIGFuIG9iamVjdCBieSB0aGlzIHBvaW50LCBpLmUuIG5vdCBhIHNjYWxhclxyXG4gIGxldCBrZXlGbiA9IG1jLm1ldGFkYXRhU3RvcmUubmFtaW5nQ29udmVudGlvbi5zZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudDtcclxuICBsZXQgcmVzdWx0ID0ge307XHJcblxyXG4gIGNvcmUub2JqZWN0Rm9yRWFjaChub2RlLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgbGV0IG5ld0tleSA9IGtleUZuKGtleSk7XHJcbiAgICBsZXQgbm9kZUNvbnRleHQgPSB7IG5vZGVUeXBlOiBcImFub25Qcm9wXCIsIHByb3BlcnR5TmFtZTogbmV3S2V5IH07XHJcbiAgICB2aXNpdE5vZGUodmFsdWUsIG1jLCBub2RlQ29udGV4dCwgcmVzdWx0LCBuZXdLZXkpO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZpc2l0Tm9kZShub2RlOiBhbnksIG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZUNvbnRleHQ6IE5vZGVDb250ZXh0LCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleTogc3RyaW5nKSB7XHJcbiAgbGV0IGpyYSA9IG1jLmpzb25SZXN1bHRzQWRhcHRlcjtcclxuICBsZXQgbWV0YSA9IGpyYS52aXNpdE5vZGUobm9kZSwgbWMsIG5vZGVDb250ZXh0KSB8fCB7fTtcclxuICAvLyBhbGxvd3MgdmlzaXROb2RlIHRvIGNoYW5nZSB0aGUgdmFsdWU7XHJcbiAgbm9kZSA9IG1ldGEubm9kZSB8fCBub2RlO1xyXG5cclxuICBpZiAobWV0YS5pZ25vcmUpIHJldHVybjtcclxuICBpZiAobWV0YS5wYXNzVGhydSkgcmV0dXJuIG5vZGU7XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcclxuICAgIG5vZGVDb250ZXh0Lm5vZGVUeXBlID0gbm9kZUNvbnRleHQubm9kZVR5cGUgKyBcIkl0ZW1cIjtcclxuICAgIHJlc3VsdFtrZXldID0gbm9kZS5tYXAoZnVuY3Rpb24gKHYsIGl4KSB7XHJcbiAgICAgIG1ldGEgPSBqcmEudmlzaXROb2RlKHYsIG1jLCBub2RlQ29udGV4dCkgfHwge307XHJcbiAgICAgIHYgPSBtZXRhLm5vZGUgfHwgdjtcclxuICAgICAgcmV0dXJuIHByb2Nlc3NNZXRhKG1jLCB2LCBtZXRhLCBmdW5jdGlvbiAocmVmVmFsdWUpIHtcclxuICAgICAgICByZXN1bHRba2V5XVtpeF0gPSByZWZWYWx1ZSgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXN1bHRba2V5XSA9IHByb2Nlc3NNZXRhKG1jLCBub2RlLCBtZXRhLCBmdW5jdGlvbiAocmVmVmFsdWUpIHtcclxuICAgICAgcmVzdWx0W2tleV0gPSByZWZWYWx1ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlRW50aXR5UmVmKG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZVJlZklkOiBzdHJpbmcpIHtcclxuICBsZXQgZW50aXR5ID0gbWMucmVmTWFwW25vZGVSZWZJZF07XHJcbiAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gbWMucmVmTWFwW25vZGVSZWZJZF07XHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZW50aXR5O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlRW50aXR5UmVmKG1jOiBNYXBwaW5nQ29udGV4dCwgdGFyZ2V0RW50aXR5OiBhbnksIG5vZGU6IGFueSkge1xyXG4gIGxldCBub2RlSWQgPSBub2RlLl8kbWV0YS5ub2RlSWQ7XHJcbiAgaWYgKCFub2RlSWQgJiYgbm9kZS5fJG1ldGEuZXh0cmFNZXRhZGF0YSkge1xyXG4gICAgLy8gb2RhdGEgY2FzZS4gIHJlZk1hcCBpc24ndCByZWFsbHkgdXNlZCwgYnV0IGlzIHJldHVybmVkIGFzIGRhdGEucmV0cmlldmVkRW50aXRpZXMsIHNvIHdlIHBvcHVsYXRlZCBpdCBhbnl3YXkuXHJcbiAgICBub2RlSWQgPSBub2RlLl8kbWV0YS5leHRyYU1ldGFkYXRhLnVyaUtleTtcclxuICB9XHJcbiAgaWYgKG5vZGVJZCAhPSBudWxsKSB7XHJcbiAgICBtYy5yZWZNYXBbbm9kZUlkXSA9IHRhcmdldEVudGl0eTtcclxuICB9XHJcbn1cclxuXHJcbi8vIGNhbiByZXR1cm4gbnVsbCBmb3IgYSBkZWxldGVkIGVudGl0eSBpZiBpbmNsdWRlRGVsZXRlZCA9PSBmYWxzZVxyXG5mdW5jdGlvbiBtZXJnZUVudGl0eShtYzogTWFwcGluZ0NvbnRleHQsIG5vZGU6IGFueSwgbWV0YTogTm9kZU1ldGEpIHtcclxuICBub2RlLl8kbWV0YSA9IG1ldGE7XHJcbiAgbGV0IGVtID0gbWMuZW50aXR5TWFuYWdlcjtcclxuXHJcbiAgbGV0IGVudGl0eVR5cGUgPSBtZXRhLmVudGl0eVR5cGUgYXMgRW50aXR5VHlwZTtcclxuICBpZiAodHlwZW9mIChlbnRpdHlUeXBlKSA9PT0gJ3N0cmluZycpIHtcclxuICAgIGVudGl0eVR5cGUgPSBtYy5tZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShlbnRpdHlUeXBlLCBmYWxzZSkgYXMgRW50aXR5VHlwZTtcclxuICB9XHJcbiAgbm9kZS5lbnRpdHlUeXBlID0gZW50aXR5VHlwZTtcclxuXHJcbiAgbGV0IG1lcmdlU3RyYXRlZ3kgPSBtYy5tZXJnZU9wdGlvbnMubWVyZ2VTdHJhdGVneTtcclxuICBsZXQgaXNTYXZpbmcgPSBtYy5xdWVyeSA9PSBudWxsO1xyXG5cclxuICBsZXQgZW50aXR5S2V5ID0gZW50aXR5VHlwZS5nZXRFbnRpdHlLZXlGcm9tUmF3RW50aXR5KG5vZGUsIG1jLnJhd1ZhbHVlRm4pO1xyXG4gIGxldCB0YXJnZXRFbnRpdHkgPSBlbS5nZXRFbnRpdHlCeUtleShlbnRpdHlLZXkpO1xyXG4gIGlmICh0YXJnZXRFbnRpdHkpIHtcclxuICAgIGlmIChpc1NhdmluZyAmJiB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSB7XHJcbiAgICAgIGVtLmRldGFjaEVudGl0eSh0YXJnZXRFbnRpdHkpO1xyXG4gICAgICByZXR1cm4gdGFyZ2V0RW50aXR5O1xyXG4gICAgfVxyXG4gICAgbGV0IHRhcmdldEVudGl0eVN0YXRlID0gdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZTtcclxuICAgIGlmIChtZXJnZVN0cmF0ZWd5ID09PSBNZXJnZVN0cmF0ZWd5LkRpc2FsbG93ZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBNZXJnZVN0cmF0ZWd5IG9mICdEaXNhbGxvd2VkJyBwcmV2ZW50cyBcIiArIGVudGl0eUtleS50b1N0cmluZygpICsgXCIgZnJvbSBiZWluZyBtZXJnZWRcIik7XHJcbiAgICB9IGVsc2UgaWYgKG1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuU2tpcE1lcmdlKSB7XHJcbiAgICAgIHVwZGF0ZUVudGl0eU5vTWVyZ2UobWMsIHRhcmdldEVudGl0eSwgbm9kZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAobWVyZ2VTdHJhdGVneSA9PT0gTWVyZ2VTdHJhdGVneS5PdmVyd3JpdGVDaGFuZ2VzXHJcbiAgICAgICAgfHwgdGFyZ2V0RW50aXR5U3RhdGUuaXNVbmNoYW5nZWQoKSkge1xyXG4gICAgICAgIHVwZGF0ZUVudGl0eShtYywgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgICAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0Lndhc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKG1ldGEuZXh0cmFNZXRhZGF0YSkge1xyXG4gICAgICAgICAgdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5leHRyYU1ldGFkYXRhID0gbWV0YS5leHRyYU1ldGFkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlID0gRW50aXR5U3RhdGUuVW5jaGFuZ2VkO1xyXG4gICAgICAgIGNsZWFyT3JpZ2luYWxWYWx1ZXModGFyZ2V0RW50aXR5KTtcclxuICAgICAgICAvLyBwcm9wZXJ0eU5hbWUgbm90IHNwZWNpZmllZCBiZWNhdXNlIG11bHRpcGxlIHByb3BzIEVudGl0eUNoYW5nZWRFdmVudEFyZ3NcclxuICAgICAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LnByb3BlcnR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5OiB0YXJnZXRFbnRpdHksIHByb3BlcnR5TmFtZTogbnVsbCB9KTtcclxuICAgICAgICBsZXQgYWN0aW9uID0gaXNTYXZpbmcgPyBFbnRpdHlBY3Rpb24uTWVyZ2VPblNhdmUgOiBFbnRpdHlBY3Rpb24uTWVyZ2VPblF1ZXJ5O1xyXG4gICAgICAgIGVtLmVudGl0eUNoYW5nZWQucHVibGlzaCh7IGVudGl0eUFjdGlvbjogYWN0aW9uLCBlbnRpdHk6IHRhcmdldEVudGl0eSB9KTtcclxuICAgICAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgYW4gb3ZlcndyaXRlIG9mIGEgbW9kaWZpZWQgZW50aXR5IHdpdGggYW4gdW5jaGFuZ2VkIGVudGl0eVxyXG4gICAgICAgIC8vIHdoaWNoIG1pZ2h0IGluIHR1cm4gY2F1c2UgX2hhc0NoYW5nZXMgdG8gY2hhbmdlLlxyXG4gICAgICAgIGlmICghdGFyZ2V0RW50aXR5U3RhdGUuaXNVbmNoYW5nZWQoKSkge1xyXG4gICAgICAgICAgZW0uX25vdGlmeVN0YXRlQ2hhbmdlKHRhcmdldEVudGl0eSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBwcm9jZXNzIHRhcmdldEVudGl0eSAoZXZlbiBpZiBkZWxldGVkKSB0byBlbnN1cmUgcmVsYXRlZCBub2RlcyBhcmUgaGFuZGxlZFxyXG4gICAgICAgIHVwZGF0ZUVudGl0eU5vTWVyZ2UobWMsIHRhcmdldEVudGl0eSwgbm9kZSk7XHJcbiAgICAgICAgaWYgKHRhcmdldEVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5EZWxldGVkICYmICFtYy5tZXJnZU9wdGlvbnMuaW5jbHVkZURlbGV0ZWQpIHtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB0YXJnZXRFbnRpdHkgPSBlbnRpdHlUeXBlLl9jcmVhdGVJbnN0YW5jZUNvcmUoKSBhcyBFbnRpdHk7XHJcblxyXG4gICAgdXBkYXRlRW50aXR5KG1jLCB0YXJnZXRFbnRpdHksIG5vZGUpO1xyXG5cclxuICAgIGlmIChtZXRhLmV4dHJhTWV0YWRhdGEpIHtcclxuICAgICAgdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5leHRyYU1ldGFkYXRhID0gbWV0YS5leHRyYU1ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgLy8gZW0uX2F0dGFjaEVudGl0eUNvcmUodGFyZ2V0RW50aXR5LCBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQsIE1lcmdlU3RyYXRlZ3kuRGlzYWxsb3dlZCk7XHJcbiAgICBlbS5fYXR0YWNoRW50aXR5Q29yZSh0YXJnZXRFbnRpdHksIEVudGl0eVN0YXRlLlVuY2hhbmdlZCwgbWVyZ2VTdHJhdGVneSk7XHJcbiAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0Lndhc0xvYWRlZCA9IHRydWU7XHJcbiAgICBlbS5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5BdHRhY2hPblF1ZXJ5LCBlbnRpdHk6IHRhcmdldEVudGl0eSB9KTtcclxuICB9XHJcbiAgcmV0dXJuIHRhcmdldEVudGl0eTtcclxufVxyXG5cclxuLy8gY29waWVkIGZyb20gZW50aXR5QXNwZWN0XHJcbmZ1bmN0aW9uIGNsZWFyT3JpZ2luYWxWYWx1ZXModGFyZ2V0OiBhbnkpIHtcclxuICBsZXQgYXNwZWN0ID0gdGFyZ2V0LmVudGl0eUFzcGVjdCB8fCB0YXJnZXQuY29tcGxleEFzcGVjdDtcclxuICBhc3BlY3Qub3JpZ2luYWxWYWx1ZXMgPSB7fTtcclxuICBsZXQgc3R5cGUgPSB0YXJnZXQuZW50aXR5VHlwZSB8fCB0YXJnZXQuY29tcGxleFR5cGU7XHJcbiAgc3R5cGUuY29tcGxleFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoY3A6IGFueSkge1xyXG4gICAgbGV0IGNvcyA9IHRhcmdldC5nZXRQcm9wZXJ0eShjcC5uYW1lKTtcclxuICAgIGlmIChjcC5pc1NjYWxhcikge1xyXG4gICAgICBjbGVhck9yaWdpbmFsVmFsdWVzKGNvcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb3MuX2FjY2VwdENoYW5nZXMoKTtcclxuICAgICAgY29zLmZvckVhY2goY2xlYXJPcmlnaW5hbFZhbHVlcyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiB1cGRhdGVFbnRpdHlOb01lcmdlKG1jOiBNYXBwaW5nQ29udGV4dCwgdGFyZ2V0RW50aXR5OiBFbnRpdHksIG5vZGU6IGFueSkge1xyXG4gIHVwZGF0ZUVudGl0eVJlZihtYywgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAvLyB3ZSBzdGlsbCBuZWVkIHRvIG1lcmdlIHJlbGF0ZWQgZW50aXRpZXMgZXZlbiBpZiB0b3AgbGV2ZWwgZW50aXR5IHdhc24ndCBtb2RpZmllZC5cclxuICBub2RlLmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAobnA6IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gICAgaWYgKG5wLmlzU2NhbGFyKSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0eUNvcmUobWMsIG5vZGUsIG5wKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0aWVzQ29yZShtYywgbm9kZSwgbnApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVFbnRpdHkobWM6IE1hcHBpbmdDb250ZXh0LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgbm9kZTogYW55KSB7XHJcbiAgdXBkYXRlRW50aXR5UmVmKG1jLCB0YXJnZXRFbnRpdHksIG5vZGUpO1xyXG4gIGxldCBlbnRpdHlUeXBlID0gdGFyZ2V0RW50aXR5LmVudGl0eVR5cGU7XHJcbiAgZW50aXR5VHlwZS5fdXBkYXRlVGFyZ2V0RnJvbVJhdyh0YXJnZXRFbnRpdHksIG5vZGUsIG1jLnJhd1ZhbHVlRm4pO1xyXG5cclxuICBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKG5wKSB7XHJcbiAgICBpZiAobnAuaXNTY2FsYXIpIHtcclxuICAgICAgbWVyZ2VSZWxhdGVkRW50aXR5KG1jLCBucCwgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0aWVzKG1jLCBucCwgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWVyZ2VSZWxhdGVkRW50aXR5KG1jOiBNYXBwaW5nQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHksIHRhcmdldEVudGl0eTogRW50aXR5LCByYXdFbnRpdHk6IGFueSkge1xyXG5cclxuICBsZXQgcmVsYXRlZEVudGl0eSA9IG1lcmdlUmVsYXRlZEVudGl0eUNvcmUobWMsIHJhd0VudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5KTtcclxuICBpZiAocmVsYXRlZEVudGl0eSA9PSBudWxsKSByZXR1cm47XHJcbiAgaWYgKHR5cGVvZiByZWxhdGVkRW50aXR5ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBtYy5kZWZlcnJlZEZucy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmVsYXRlZEVudGl0eSA9IHJlbGF0ZWRFbnRpdHkoKTtcclxuICAgICAgdXBkYXRlUmVsYXRlZEVudGl0eShyZWxhdGVkRW50aXR5LCB0YXJnZXRFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgdXBkYXRlUmVsYXRlZEVudGl0eShyZWxhdGVkRW50aXR5LCB0YXJnZXRFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZVJlbGF0ZWRFbnRpdGllcyhtYzogTWFwcGluZ0NvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgcmF3RW50aXR5OiBhbnkpIHtcclxuICBsZXQgcmVsYXRlZEVudGl0aWVzID0gbWVyZ2VSZWxhdGVkRW50aXRpZXNDb3JlKG1jLCByYXdFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgaWYgKHJlbGF0ZWRFbnRpdGllcyA9PSBudWxsKSByZXR1cm47XHJcblxyXG4gIGxldCBpbnZlcnNlUHJvcGVydHkgPSBuYXZpZ2F0aW9uUHJvcGVydHkuaW52ZXJzZTtcclxuICBpZiAoIWludmVyc2VQcm9wZXJ0eSkgcmV0dXJuO1xyXG5cclxuICBsZXQgb3JpZ2luYWxSZWxhdGVkRW50aXRpZXMgPSB0YXJnZXRFbnRpdHkuZ2V0UHJvcGVydHkobmF2aWdhdGlvblByb3BlcnR5Lm5hbWUpO1xyXG4gIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLndhc0xvYWRlZCA9IHRydWU7XHJcblxyXG4gIHJlbGF0ZWRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGVkRW50aXR5OiBhbnkpIHtcclxuICAgIGlmICh0eXBlb2YgcmVsYXRlZEVudGl0eSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBtYy5kZWZlcnJlZEZucy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZWxhdGVkRW50aXR5ID0gcmVsYXRlZEVudGl0eSgpO1xyXG4gICAgICAgIHVwZGF0ZVJlbGF0ZWRFbnRpdHlJbkNvbGxlY3Rpb24obWMsIHJlbGF0ZWRFbnRpdHksIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLCB0YXJnZXRFbnRpdHksIGludmVyc2VQcm9wZXJ0eSBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVwZGF0ZVJlbGF0ZWRFbnRpdHlJbkNvbGxlY3Rpb24obWMsIHJlbGF0ZWRFbnRpdHksIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLCB0YXJnZXRFbnRpdHksIGludmVyc2VQcm9wZXJ0eSBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZVJlbGF0ZWRFbnRpdHlDb3JlKG1jOiBNYXBwaW5nQ29udGV4dCwgcmF3RW50aXR5OiBhbnksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgbGV0IHJlbGF0ZWRSYXdFbnRpdHkgPSByYXdFbnRpdHlbbmF2aWdhdGlvblByb3BlcnR5Lm5hbWVPblNlcnZlcl07XHJcbiAgaWYgKCFyZWxhdGVkUmF3RW50aXR5KSByZXR1cm4gbnVsbDtcclxuXHJcbiAgbGV0IHJlbGF0ZWRFbnRpdHkgPSBtYy52aXNpdEFuZE1lcmdlKHJlbGF0ZWRSYXdFbnRpdHksIHsgbm9kZVR5cGU6IFwibmF2UHJvcFwiLCBuYXZpZ2F0aW9uUHJvcGVydHk6IG5hdmlnYXRpb25Qcm9wZXJ0eSB9KTtcclxuICByZXR1cm4gcmVsYXRlZEVudGl0eTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWVyZ2VSZWxhdGVkRW50aXRpZXNDb3JlKG1jOiBNYXBwaW5nQ29udGV4dCwgcmF3RW50aXR5OiBhbnksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgbGV0IHJlbGF0ZWRSYXdFbnRpdGllcyA9IHJhd0VudGl0eVtuYXZpZ2F0aW9uUHJvcGVydHkubmFtZU9uU2VydmVyXTtcclxuICBpZiAoIXJlbGF0ZWRSYXdFbnRpdGllcykgcmV0dXJuIG51bGw7XHJcblxyXG4gIC8vIG5lZWRlZCBpZiB3aGF0IGlzIHJldHVybmVkIGlzIG5vdCBhbiBhcnJheSBhbmQgd2UgZXhwZWN0IG9uZSAtIHRoaXMgaGFwcGVucyB3aXRoIF9fZGVmZXJyZWQgaW4gT0RhdGEuXHJcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJlbGF0ZWRSYXdFbnRpdGllcykpIHtcclxuICAgIC8vIHJldHVybiBudWxsO1xyXG4gICAgcmVsYXRlZFJhd0VudGl0aWVzID0gcmVsYXRlZFJhd0VudGl0aWVzLnJlc3VsdHM7IC8vIE9EYXRhIHYzIHdpbGwgbG9vayBsaWtlIHRoaXMgd2l0aCBhbiBleHBhbmRcclxuICAgIGlmICghcmVsYXRlZFJhd0VudGl0aWVzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGV0IHJlbGF0ZWRFbnRpdGllcyA9IG1jLnZpc2l0QW5kTWVyZ2UocmVsYXRlZFJhd0VudGl0aWVzLCB7IG5vZGVUeXBlOiBcIm5hdlByb3BJdGVtXCIsIG5hdmlnYXRpb25Qcm9wZXJ0eTogbmF2aWdhdGlvblByb3BlcnR5IH0pO1xyXG4gIHJldHVybiByZWxhdGVkRW50aXRpZXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVJlbGF0ZWRFbnRpdHkocmVsYXRlZEVudGl0eTogRW50aXR5LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkpIHtcclxuICBpZiAoIXJlbGF0ZWRFbnRpdHkpIHJldHVybjtcclxuICBsZXQgcHJvcE5hbWUgPSBuYXZpZ2F0aW9uUHJvcGVydHkubmFtZTtcclxuICBsZXQgY3VycmVudFJlbGF0ZWRFbnRpdHkgPSB0YXJnZXRFbnRpdHkuZ2V0UHJvcGVydHkocHJvcE5hbWUpO1xyXG5cclxuICAvLyBjaGVjayBpZiB0aGUgcmVsYXRlZCBlbnRpdHkgaXMgYWxyZWFkeSBob29rZWQgdXBcclxuICBpZiAoY3VycmVudFJlbGF0ZWRFbnRpdHkgIT09IHJlbGF0ZWRFbnRpdHkpIHtcclxuICAgIC8vIGlmIG5vdCBob29rIHVwIGJvdGggZGlyZWN0aW9ucy5cclxuICAgIHRhcmdldEVudGl0eS5zZXRQcm9wZXJ0eShwcm9wTmFtZSwgcmVsYXRlZEVudGl0eSk7XHJcbiAgICBsZXQgaW52ZXJzZVByb3BlcnR5ID0gbmF2aWdhdGlvblByb3BlcnR5LmludmVyc2U7XHJcbiAgICBpZiAoIWludmVyc2VQcm9wZXJ0eSkgcmV0dXJuO1xyXG4gICAgaWYgKGludmVyc2VQcm9wZXJ0eS5pc1NjYWxhcikge1xyXG4gICAgICByZWxhdGVkRW50aXR5LnNldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lLCB0YXJnZXRFbnRpdHkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGNvbGxlY3Rpb24gPSByZWxhdGVkRW50aXR5LmdldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgY29sbGVjdGlvbi5wdXNoKHRhcmdldEVudGl0eSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlUmVsYXRlZEVudGl0eUluQ29sbGVjdGlvbihtYzogTWFwcGluZ0NvbnRleHQsIHJlbGF0ZWRFbnRpdHk6IEVudGl0eSB8IHVuZGVmaW5lZCxcclxuICAgIHJlbGF0ZWRFbnRpdGllczogRW50aXR5W10sIHRhcmdldEVudGl0eTogRW50aXR5LCBpbnZlcnNlUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gIGlmICghcmVsYXRlZEVudGl0eSkgcmV0dXJuO1xyXG5cclxuICAvLyBkb24ndCB1cGRhdGUgcmVsYXRlZENvbGxlY3Rpb24gaWYgcHJlc2VydmVDaGFuZ2VzICYgcmVsYXRlZEVudGl0eSBoYXMgYW4gZmtDaGFuZ2UuXHJcbiAgaWYgKHJlbGF0ZWRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5Nb2RpZmllZFxyXG4gICAgJiYgbWMubWVyZ2VPcHRpb25zLm1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuUHJlc2VydmVDaGFuZ2VzKSB7XHJcbiAgICBsZXQgb3JpZ1ZhbHVlcyA9IHJlbGF0ZWRFbnRpdHkuZW50aXR5QXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgbGV0IGZrV2FzTW9kaWZpZWQgPSBpbnZlcnNlUHJvcGVydHkucmVsYXRlZERhdGFQcm9wZXJ0aWVzLnNvbWUoZnVuY3Rpb24gKGRwKSB7XHJcbiAgICAgIHJldHVybiBvcmlnVmFsdWVzW2RwLm5hbWVdICE9IHVuZGVmaW5lZDtcclxuICAgIH0pO1xyXG4gICAgaWYgKGZrV2FzTW9kaWZpZWQpIHJldHVybjtcclxuICB9XHJcbiAgLy8gY2hlY2sgaWYgdGhlIHJlbGF0ZWQgZW50aXR5IGlzIGFscmVhZHkgaG9va2VkIHVwXHJcbiAgbGV0IHRoaXNFbnRpdHkgPSByZWxhdGVkRW50aXR5LmdldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lKTtcclxuXHJcbiAgaWYgKHRoaXNFbnRpdHkgIT09IHRhcmdldEVudGl0eSkge1xyXG4gICAgLy8gaWYgbm90IC0gaG9vayBpdCB1cC5cclxuICAgIHJlbGF0ZWRFbnRpdGllcy5wdXNoKHJlbGF0ZWRFbnRpdHkpO1xyXG4gICAgcmVsYXRlZEVudGl0eS5zZXRQcm9wZXJ0eShpbnZlcnNlUHJvcGVydHkubmFtZSwgdGFyZ2V0RW50aXR5KTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4iXX0=
@@ -1,88 +0,0 @@
1
- import { assertConfig } from './assert-param';
2
- import { core } from './core';
3
- import { config } from './config';
4
- /**
5
- A NamingConvention instance is used to specify the naming conventions under which a MetadataStore
6
- will translate property names between the server and the javascript client.
7
-
8
- The default NamingConvention does not perform any translation, it simply passes property names thru unchanged.
9
- @dynamic
10
- **/
11
- export class NamingConvention {
12
- /**
13
- NamingConvention constructor
14
- > // A naming convention that converts the first character of every property name to uppercase on the server
15
- > // and lowercase on the client.
16
- > var namingConv = new NamingConvention({
17
- > serverPropertyNameToClient: function(serverPropertyName) {
18
- > return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
19
- > },
20
- > clientPropertyNameToServer: function(clientPropertyName) {
21
- > return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
22
- > }
23
- > });
24
- > var ms = new MetadataStore({ namingConvention: namingConv });
25
- > var em = new EntityManager( { metadataStore: ms });
26
- **/
27
- constructor(ncConfig) {
28
- assertConfig(ncConfig || {})
29
- .whereParam("name").isOptional().isString()
30
- .whereParam("serverPropertyNameToClient").isFunction()
31
- .whereParam("clientPropertyNameToServer").isFunction()
32
- .applyAll(this);
33
- if (!this.name) {
34
- this.name = core.getUuid();
35
- }
36
- config._storeObject(this, "NamingConvention", this.name);
37
- }
38
- /**
39
- Sets the 'defaultInstance' by creating a copy of the current 'defaultInstance' and then applying all of the properties of the current instance.
40
- The current instance is returned unchanged.
41
- > var namingConv = new NamingConvention({
42
- > serverPropertyNameToClient: function(serverPropertyName) {
43
- > return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
44
- > },
45
- > clientPropertyNameToServer: function(clientPropertyName) {
46
- > return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
47
- > }
48
- > });
49
- > namingConv.setAsDefault();
50
- **/
51
- setAsDefault() {
52
- return core.setAsDefault(this, NamingConvention);
53
- }
54
- }
55
- /**
56
-
57
-
58
- /**
59
- A noop naming convention - This is the default unless another is specified.
60
- **/
61
- NamingConvention.none = new NamingConvention({
62
- name: "noChange",
63
- serverPropertyNameToClient: (serverPropertyName) => {
64
- return serverPropertyName;
65
- },
66
- clientPropertyNameToServer: (clientPropertyName) => {
67
- return clientPropertyName;
68
- }
69
- });
70
- /**
71
- The "camelCase" naming convention - This implementation only lowercases the first character of the server property name
72
- but leaves the rest of the property name intact. If a more complicated version is needed then one should be created via the ctor.
73
- **/
74
- NamingConvention.camelCase = new NamingConvention({
75
- name: "camelCase",
76
- serverPropertyNameToClient: (serverPropertyName) => {
77
- return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
78
- },
79
- clientPropertyNameToServer: (clientPropertyName) => {
80
- return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
81
- }
82
- });
83
- /**
84
- The default value whenever NamingConventions are not specified.
85
- **/
86
- NamingConvention.defaultInstance = new NamingConvention(NamingConvention.none);
87
- NamingConvention.prototype._$typeName = "NamingConvention";
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtaW5nLWNvbnZlbnRpb24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL25hbWluZy1jb252ZW50aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFjbEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQVUzQjs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILFlBQVksUUFBZ0M7UUFDMUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7YUFDdkIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRTthQUMxQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxVQUFVLEVBQUU7YUFDckQsVUFBVSxDQUFDLDRCQUE0QixDQUFDLENBQUMsVUFBVSxFQUFFO2FBQ3JELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzVCO1FBQ0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFxQ0Q7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNuRCxDQUFDOztBQWxERDs7Ozs7R0FLRztBQUNJLHFCQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztJQUNqQyxJQUFJLEVBQUUsVUFBVTtJQUNoQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7UUFDakQsT0FBTyxrQkFBa0IsQ0FBQztJQUM1QixDQUFDO0lBQ0QsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1FBQ2pELE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNJLDBCQUFTLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztJQUN0QyxJQUFJLEVBQUUsV0FBVztJQUNqQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7UUFDakQsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO1FBQ2pELE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0ksZ0NBQWUsR0FBRyxJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBcUJ2RSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0Q29uZmlnIH0gZnJvbSAnLi9hc3NlcnQtcGFyYW0nO1xyXG5pbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5cclxuLy8gVE9ETzogc3Ryb25nbHkgdHlwZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gbmFtaW5nIGNvbnZlbnRpb24gY29udmVydGVyIGZucy5cclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGluZm8gdG8gYmUgcGFzc2VkIHRvIHRoZSBbW05hbWluZ0NvbnZlbnRpb25dXSBjb25zdHJ1Y3RvciAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE5hbWluZ0NvbnZlbnRpb25Db25maWcge1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIE5hbWluZ0NvbnZlbnRpb24gKi9cclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIC8qKiBGdW5jdGlvbiB0aGF0IHRha2VzIGEgc2VydmVyIHByb3BlcnR5IG5hbWUgYWRkIGNvbnZlcnRzIGl0IGludG8gYSBjbGllbnQgc2lkZSBwcm9wZXJ0eSBuYW1lLiAgKi9cclxuICBzZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudD86IChubTogc3RyaW5nLCBjb250ZXh0PzogYW55KSA9PiBzdHJpbmc7XHJcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjbGllbnQgcHJvcGVydHkgbmFtZSBhZGQgY29udmVydHMgaXQgaW50byBhIHNlcnZlciBzaWRlIHByb3BlcnR5IG5hbWUuICovXHJcbiAgY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI/OiAobm06IHN0cmluZywgY29udGV4dD86IGFueSkgPT4gc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuQSBOYW1pbmdDb252ZW50aW9uIGluc3RhbmNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtaW5nIGNvbnZlbnRpb25zIHVuZGVyIHdoaWNoIGEgTWV0YWRhdGFTdG9yZVxyXG53aWxsIHRyYW5zbGF0ZSBwcm9wZXJ0eSBuYW1lcyBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIHRoZSBqYXZhc2NyaXB0IGNsaWVudC5cclxuXHJcblRoZSBkZWZhdWx0IE5hbWluZ0NvbnZlbnRpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgdHJhbnNsYXRpb24sIGl0IHNpbXBseSBwYXNzZXMgcHJvcGVydHkgbmFtZXMgdGhydSB1bmNoYW5nZWQuXHJcbkBkeW5hbWljXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgTmFtaW5nQ29udmVudGlvbiB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgXyR0eXBlTmFtZTogc3RyaW5nO1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIE5hbWluZ0NvbnZlbnRpb24uIF9fUmVhZCBPbmx5X18gKi9cclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBzZXJ2ZXIgcHJvcGVydHkgbmFtZSBhZGQgY29udmVydHMgaXQgaW50byBhIGNsaWVudCBzaWRlIHByb3BlcnR5IG5hbWUuICBfX1JlYWQgT25seV9fICovXHJcbiAgc2VydmVyUHJvcGVydHlOYW1lVG9DbGllbnQ6IChubTogc3RyaW5nLCBjb250ZXh0PzogYW55KSA9PiBzdHJpbmc7XHJcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjbGllbnQgcHJvcGVydHkgbmFtZSBhZGQgY29udmVydHMgaXQgaW50byBhIHNlcnZlciBzaWRlIHByb3BlcnR5IG5hbWUuIF9fUmVhZCBPbmx5X18gKi9cclxuICBjbGllbnRQcm9wZXJ0eU5hbWVUb1NlcnZlcjogKG5tOiBzdHJpbmcsIGNvbnRleHQ/OiBhbnkpID0+IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgTmFtaW5nQ29udmVudGlvbiBjb25zdHJ1Y3RvclxyXG4gID4gICAgICAvLyBBIG5hbWluZyBjb252ZW50aW9uIHRoYXQgY29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBldmVyeSBwcm9wZXJ0eSBuYW1lIHRvIHVwcGVyY2FzZSBvbiB0aGUgc2VydmVyXHJcbiAgPiAgICAgIC8vIGFuZCBsb3dlcmNhc2Ugb24gdGhlIGNsaWVudC5cclxuICA+ICAgICAgdmFyIG5hbWluZ0NvbnYgPSBuZXcgTmFtaW5nQ29udmVudGlvbih7XHJcbiAgPiAgICAgICAgICBzZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudDogZnVuY3Rpb24oc2VydmVyUHJvcGVydHlOYW1lKSB7XHJcbiAgPiAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlclByb3BlcnR5TmFtZS5zdWJzdHIoMCwgMSkudG9Mb3dlckNhc2UoKSArIHNlcnZlclByb3BlcnR5TmFtZS5zdWJzdHIoMSk7XHJcbiAgPiAgICAgICAgICB9LFxyXG4gID4gICAgICAgICAgY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI6IGZ1bmN0aW9uKGNsaWVudFByb3BlcnR5TmFtZSkge1xyXG4gID4gICAgICAgICAgICAgIHJldHVybiBjbGllbnRQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBjbGllbnRQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gID4gICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gID4gICAgICB9KTtcclxuICA+ICAgICAgdmFyIG1zID0gbmV3IE1ldGFkYXRhU3RvcmUoeyBuYW1pbmdDb252ZW50aW9uOiBuYW1pbmdDb252IH0pO1xyXG4gID4gICAgICB2YXIgZW0gPSBuZXcgRW50aXR5TWFuYWdlciggeyBtZXRhZGF0YVN0b3JlOiBtcyB9KTtcclxuICAqKi9cclxuICBjb25zdHJ1Y3RvcihuY0NvbmZpZzogTmFtaW5nQ29udmVudGlvbkNvbmZpZyApIHtcclxuICAgIGFzc2VydENvbmZpZyhuY0NvbmZpZyB8fCB7fSlcclxuICAgICAgICAud2hlcmVQYXJhbShcIm5hbWVcIikuaXNPcHRpb25hbCgpLmlzU3RyaW5nKClcclxuICAgICAgICAud2hlcmVQYXJhbShcInNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50XCIpLmlzRnVuY3Rpb24oKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwiY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXJcIikuaXNGdW5jdGlvbigpXHJcbiAgICAgICAgLmFwcGx5QWxsKHRoaXMpO1xyXG4gICAgaWYgKCF0aGlzLm5hbWUpIHtcclxuICAgICAgdGhpcy5uYW1lID0gY29yZS5nZXRVdWlkKCk7XHJcbiAgICB9XHJcbiAgICBjb25maWcuX3N0b3JlT2JqZWN0KHRoaXMsIFwiTmFtaW5nQ29udmVudGlvblwiLCB0aGlzLm5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcblxyXG5cclxuICAvKipcclxuICBBIG5vb3AgbmFtaW5nIGNvbnZlbnRpb24gLSBUaGlzIGlzIHRoZSBkZWZhdWx0IHVubGVzcyBhbm90aGVyIGlzIHNwZWNpZmllZC5cclxuICAqKi9cclxuICBzdGF0aWMgbm9uZSA9IG5ldyBOYW1pbmdDb252ZW50aW9uKHtcclxuICAgIG5hbWU6IFwibm9DaGFuZ2VcIixcclxuICAgIHNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50OiAoc2VydmVyUHJvcGVydHlOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZXJ2ZXJQcm9wZXJ0eU5hbWU7XHJcbiAgICB9LFxyXG4gICAgY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI6IChjbGllbnRQcm9wZXJ0eU5hbWUpID0+IHtcclxuICAgICAgcmV0dXJuIGNsaWVudFByb3BlcnR5TmFtZTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgLyoqXHJcbiAgVGhlIFwiY2FtZWxDYXNlXCIgbmFtaW5nIGNvbnZlbnRpb24gLSBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgbG93ZXJjYXNlcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZXJ2ZXIgcHJvcGVydHkgbmFtZVxyXG4gIGJ1dCBsZWF2ZXMgdGhlIHJlc3Qgb2YgdGhlIHByb3BlcnR5IG5hbWUgaW50YWN0LiAgSWYgYSBtb3JlIGNvbXBsaWNhdGVkIHZlcnNpb24gaXMgbmVlZGVkIHRoZW4gb25lIHNob3VsZCBiZSBjcmVhdGVkIHZpYSB0aGUgY3Rvci5cclxuICAqKi9cclxuICBzdGF0aWMgY2FtZWxDYXNlID0gbmV3IE5hbWluZ0NvbnZlbnRpb24oe1xyXG4gICAgbmFtZTogXCJjYW1lbENhc2VcIixcclxuICAgIHNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50OiAoc2VydmVyUHJvcGVydHlOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gICAgfSxcclxuICAgIGNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyOiAoY2xpZW50UHJvcGVydHlOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBjbGllbnRQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBjbGllbnRQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICAvKipcclxuICBUaGUgZGVmYXVsdCB2YWx1ZSB3aGVuZXZlciBOYW1pbmdDb252ZW50aW9ucyBhcmUgbm90IHNwZWNpZmllZC5cclxuICAqKi9cclxuICBzdGF0aWMgZGVmYXVsdEluc3RhbmNlID0gbmV3IE5hbWluZ0NvbnZlbnRpb24oTmFtaW5nQ29udmVudGlvbi5ub25lKTtcclxuXHJcbiAgLyoqXHJcbiAgU2V0cyB0aGUgJ2RlZmF1bHRJbnN0YW5jZScgYnkgY3JlYXRpbmcgYSBjb3B5IG9mIHRoZSBjdXJyZW50ICdkZWZhdWx0SW5zdGFuY2UnIGFuZCB0aGVuIGFwcGx5aW5nIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBpbnN0YW5jZS5cclxuICBUaGUgY3VycmVudCBpbnN0YW5jZSBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXHJcbiAgPiAgICAgIHZhciBuYW1pbmdDb252ID0gbmV3IE5hbWluZ0NvbnZlbnRpb24oe1xyXG4gID4gICAgICAgICAgc2VydmVyUHJvcGVydHlOYW1lVG9DbGllbnQ6IGZ1bmN0aW9uKHNlcnZlclByb3BlcnR5TmFtZSkge1xyXG4gID4gICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gID4gICAgICAgICAgfSxcclxuICA+ICAgICAgICAgIGNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyOiBmdW5jdGlvbihjbGllbnRQcm9wZXJ0eU5hbWUpIHtcclxuICA+ICAgICAgICAgICAgICByZXR1cm4gY2xpZW50UHJvcGVydHlOYW1lLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgY2xpZW50UHJvcGVydHlOYW1lLnN1YnN0cigxKTtcclxuICA+ICAgICAgICAgIH0gICAgICAgICAgICBcclxuICA+ICAgICAgfSk7XHJcbiAgPiAgICAgIG5hbWluZ0NvbnYuc2V0QXNEZWZhdWx0KCk7XHJcbiAgKiovXHJcbiAgc2V0QXNEZWZhdWx0KCkge1xyXG4gICAgcmV0dXJuIGNvcmUuc2V0QXNEZWZhdWx0KHRoaXMsIE5hbWluZ0NvbnZlbnRpb24pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbk5hbWluZ0NvbnZlbnRpb24ucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIk5hbWluZ0NvbnZlbnRpb25cIjtcclxuXHJcblxyXG5cclxuXHJcbiJdfQ==