@rapidmx/activesync 1.0.0-beta.0

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 (195) hide show
  1. package/LICENSE +382 -0
  2. package/README.md +57 -0
  3. package/dist/lib/BaseDeviceSyncStateRoute.js +90 -0
  4. package/dist/lib/BaseDeviceSyncStateRoute.js.map +1 -0
  5. package/dist/lib/BaseEasRoute.js +213 -0
  6. package/dist/lib/BaseEasRoute.js.map +1 -0
  7. package/dist/lib/CompactDateTime.js +43 -0
  8. package/dist/lib/CompactDateTime.js.map +1 -0
  9. package/dist/lib/EasCommandHandler.js +2 -0
  10. package/dist/lib/EasCommandHandler.js.map +1 -0
  11. package/dist/lib/EasSyncKeyUtils.js +119 -0
  12. package/dist/lib/EasSyncKeyUtils.js.map +1 -0
  13. package/dist/lib/adapters/CalendarSyncAdapter.js +255 -0
  14. package/dist/lib/adapters/CalendarSyncAdapter.js.map +1 -0
  15. package/dist/lib/adapters/ContactsSyncAdapter.js +164 -0
  16. package/dist/lib/adapters/ContactsSyncAdapter.js.map +1 -0
  17. package/dist/lib/adapters/EasCollectionSyncAdapter.js +2 -0
  18. package/dist/lib/adapters/EasCollectionSyncAdapter.js.map +1 -0
  19. package/dist/lib/adapters/EmailSyncAdapter.js +230 -0
  20. package/dist/lib/adapters/EmailSyncAdapter.js.map +1 -0
  21. package/dist/lib/adapters/TasksSyncAdapter.js +100 -0
  22. package/dist/lib/adapters/TasksSyncAdapter.js.map +1 -0
  23. package/dist/lib/codec/WbxmlCodePages.js +706 -0
  24. package/dist/lib/codec/WbxmlCodePages.js.map +1 -0
  25. package/dist/lib/codec/WbxmlDecoder.js +154 -0
  26. package/dist/lib/codec/WbxmlDecoder.js.map +1 -0
  27. package/dist/lib/codec/WbxmlElement.js +31 -0
  28. package/dist/lib/codec/WbxmlElement.js.map +1 -0
  29. package/dist/lib/codec/WbxmlEncoder.js +88 -0
  30. package/dist/lib/codec/WbxmlEncoder.js.map +1 -0
  31. package/dist/lib/commands/ComposeMailCommand.js +187 -0
  32. package/dist/lib/commands/ComposeMailCommand.js.map +1 -0
  33. package/dist/lib/commands/FolderSyncCommand.js +150 -0
  34. package/dist/lib/commands/FolderSyncCommand.js.map +1 -0
  35. package/dist/lib/commands/GetItemEstimateCommand.js +149 -0
  36. package/dist/lib/commands/GetItemEstimateCommand.js.map +1 -0
  37. package/dist/lib/commands/ItemOperationsCommand.js +337 -0
  38. package/dist/lib/commands/ItemOperationsCommand.js.map +1 -0
  39. package/dist/lib/commands/MeetingResponseCommand.js +120 -0
  40. package/dist/lib/commands/MeetingResponseCommand.js.map +1 -0
  41. package/dist/lib/commands/MoveItemsCommand.js +103 -0
  42. package/dist/lib/commands/MoveItemsCommand.js.map +1 -0
  43. package/dist/lib/commands/PingCommand.js +145 -0
  44. package/dist/lib/commands/PingCommand.js.map +1 -0
  45. package/dist/lib/commands/ProvisionCommand.js +164 -0
  46. package/dist/lib/commands/ProvisionCommand.js.map +1 -0
  47. package/dist/lib/commands/ResolveRecipientsCommand.js +124 -0
  48. package/dist/lib/commands/ResolveRecipientsCommand.js.map +1 -0
  49. package/dist/lib/commands/SearchCommand.js +137 -0
  50. package/dist/lib/commands/SearchCommand.js.map +1 -0
  51. package/dist/lib/commands/SendMailCommand.js +18 -0
  52. package/dist/lib/commands/SendMailCommand.js.map +1 -0
  53. package/dist/lib/commands/SettingsCommand.js +138 -0
  54. package/dist/lib/commands/SettingsCommand.js.map +1 -0
  55. package/dist/lib/commands/SmartForwardCommand.js +22 -0
  56. package/dist/lib/commands/SmartForwardCommand.js.map +1 -0
  57. package/dist/lib/commands/SmartReplyCommand.js +22 -0
  58. package/dist/lib/commands/SmartReplyCommand.js.map +1 -0
  59. package/dist/lib/commands/SyncCommand.js +406 -0
  60. package/dist/lib/commands/SyncCommand.js.map +1 -0
  61. package/dist/lib/commands/mongo/FolderSyncCommandMongo.js +16 -0
  62. package/dist/lib/commands/mongo/FolderSyncCommandMongo.js.map +1 -0
  63. package/dist/lib/commands/mongo/GetItemEstimateCommandMongo.js +21 -0
  64. package/dist/lib/commands/mongo/GetItemEstimateCommandMongo.js.map +1 -0
  65. package/dist/lib/commands/mongo/ItemOperationsCommandMongo.js +18 -0
  66. package/dist/lib/commands/mongo/ItemOperationsCommandMongo.js.map +1 -0
  67. package/dist/lib/commands/mongo/MeetingResponseCommandMongo.js +17 -0
  68. package/dist/lib/commands/mongo/MeetingResponseCommandMongo.js.map +1 -0
  69. package/dist/lib/commands/mongo/MoveItemsCommandMongo.js +17 -0
  70. package/dist/lib/commands/mongo/MoveItemsCommandMongo.js.map +1 -0
  71. package/dist/lib/commands/mongo/ResolveRecipientsCommandMongo.js +20 -0
  72. package/dist/lib/commands/mongo/ResolveRecipientsCommandMongo.js.map +1 -0
  73. package/dist/lib/commands/mongo/SearchCommandMongo.js +20 -0
  74. package/dist/lib/commands/mongo/SearchCommandMongo.js.map +1 -0
  75. package/dist/lib/commands/mongo/SendMailCommandMongo.js +17 -0
  76. package/dist/lib/commands/mongo/SendMailCommandMongo.js.map +1 -0
  77. package/dist/lib/commands/mongo/SettingsCommandMongo.js +16 -0
  78. package/dist/lib/commands/mongo/SettingsCommandMongo.js.map +1 -0
  79. package/dist/lib/commands/mongo/SmartForwardCommandMongo.js +17 -0
  80. package/dist/lib/commands/mongo/SmartForwardCommandMongo.js.map +1 -0
  81. package/dist/lib/commands/mongo/SmartReplyCommandMongo.js +17 -0
  82. package/dist/lib/commands/mongo/SmartReplyCommandMongo.js.map +1 -0
  83. package/dist/lib/commands/mongo/SyncCommandMongo.js +26 -0
  84. package/dist/lib/commands/mongo/SyncCommandMongo.js.map +1 -0
  85. package/dist/lib/commands/mongo/index.js +14 -0
  86. package/dist/lib/commands/mongo/index.js.map +1 -0
  87. package/dist/lib/commands/sql/FolderSyncCommandSQL.js +16 -0
  88. package/dist/lib/commands/sql/FolderSyncCommandSQL.js.map +1 -0
  89. package/dist/lib/commands/sql/GetItemEstimateCommandSQL.js +21 -0
  90. package/dist/lib/commands/sql/GetItemEstimateCommandSQL.js.map +1 -0
  91. package/dist/lib/commands/sql/ItemOperationsCommandSQL.js +18 -0
  92. package/dist/lib/commands/sql/ItemOperationsCommandSQL.js.map +1 -0
  93. package/dist/lib/commands/sql/MeetingResponseCommandSQL.js +17 -0
  94. package/dist/lib/commands/sql/MeetingResponseCommandSQL.js.map +1 -0
  95. package/dist/lib/commands/sql/MoveItemsCommandSQL.js +17 -0
  96. package/dist/lib/commands/sql/MoveItemsCommandSQL.js.map +1 -0
  97. package/dist/lib/commands/sql/ResolveRecipientsCommandSQL.js +20 -0
  98. package/dist/lib/commands/sql/ResolveRecipientsCommandSQL.js.map +1 -0
  99. package/dist/lib/commands/sql/SearchCommandSQL.js +20 -0
  100. package/dist/lib/commands/sql/SearchCommandSQL.js.map +1 -0
  101. package/dist/lib/commands/sql/SendMailCommandSQL.js +17 -0
  102. package/dist/lib/commands/sql/SendMailCommandSQL.js.map +1 -0
  103. package/dist/lib/commands/sql/SettingsCommandSQL.js +16 -0
  104. package/dist/lib/commands/sql/SettingsCommandSQL.js.map +1 -0
  105. package/dist/lib/commands/sql/SmartForwardCommandSQL.js +17 -0
  106. package/dist/lib/commands/sql/SmartForwardCommandSQL.js.map +1 -0
  107. package/dist/lib/commands/sql/SmartReplyCommandSQL.js +17 -0
  108. package/dist/lib/commands/sql/SmartReplyCommandSQL.js.map +1 -0
  109. package/dist/lib/commands/sql/SyncCommandSQL.js +26 -0
  110. package/dist/lib/commands/sql/SyncCommandSQL.js.map +1 -0
  111. package/dist/lib/commands/sql/index.js +14 -0
  112. package/dist/lib/commands/sql/index.js.map +1 -0
  113. package/dist/lib/index.js +56 -0
  114. package/dist/lib/index.js.map +1 -0
  115. package/dist/lib/mongo/DeviceSyncStateRouteMongo.js +16 -0
  116. package/dist/lib/mongo/DeviceSyncStateRouteMongo.js.map +1 -0
  117. package/dist/lib/mongo/EasRouteMongo.js +51 -0
  118. package/dist/lib/mongo/EasRouteMongo.js.map +1 -0
  119. package/dist/lib/mongo/index.js +8 -0
  120. package/dist/lib/mongo/index.js.map +1 -0
  121. package/dist/lib/mongo.js +6 -0
  122. package/dist/lib/mongo.js.map +1 -0
  123. package/dist/lib/sql/DeviceSyncStateRouteSQL.js +16 -0
  124. package/dist/lib/sql/DeviceSyncStateRouteSQL.js.map +1 -0
  125. package/dist/lib/sql/EasRouteSQL.js +50 -0
  126. package/dist/lib/sql/EasRouteSQL.js.map +1 -0
  127. package/dist/lib/sql/index.js +8 -0
  128. package/dist/lib/sql/index.js.map +1 -0
  129. package/dist/lib/sql.js +6 -0
  130. package/dist/lib/sql.js.map +1 -0
  131. package/dist/types/BaseDeviceSyncStateRoute.d.ts +34 -0
  132. package/dist/types/BaseEasRoute.d.ts +64 -0
  133. package/dist/types/CompactDateTime.d.ts +22 -0
  134. package/dist/types/EasCommandHandler.d.ts +59 -0
  135. package/dist/types/EasSyncKeyUtils.d.ts +89 -0
  136. package/dist/types/adapters/CalendarSyncAdapter.d.ts +52 -0
  137. package/dist/types/adapters/ContactsSyncAdapter.d.ts +33 -0
  138. package/dist/types/adapters/EasCollectionSyncAdapter.d.ts +52 -0
  139. package/dist/types/adapters/EmailSyncAdapter.d.ts +53 -0
  140. package/dist/types/adapters/TasksSyncAdapter.d.ts +32 -0
  141. package/dist/types/codec/WbxmlCodePages.d.ts +45 -0
  142. package/dist/types/codec/WbxmlDecoder.d.ts +33 -0
  143. package/dist/types/codec/WbxmlElement.d.ts +43 -0
  144. package/dist/types/codec/WbxmlEncoder.d.ts +20 -0
  145. package/dist/types/commands/ComposeMailCommand.d.ts +50 -0
  146. package/dist/types/commands/FolderSyncCommand.d.ts +25 -0
  147. package/dist/types/commands/GetItemEstimateCommand.d.ts +43 -0
  148. package/dist/types/commands/ItemOperationsCommand.d.ts +72 -0
  149. package/dist/types/commands/MeetingResponseCommand.d.ts +32 -0
  150. package/dist/types/commands/MoveItemsCommand.d.ts +29 -0
  151. package/dist/types/commands/PingCommand.d.ts +33 -0
  152. package/dist/types/commands/ProvisionCommand.d.ts +54 -0
  153. package/dist/types/commands/ResolveRecipientsCommand.d.ts +34 -0
  154. package/dist/types/commands/SearchCommand.d.ts +39 -0
  155. package/dist/types/commands/SendMailCommand.d.ts +10 -0
  156. package/dist/types/commands/SettingsCommand.d.ts +37 -0
  157. package/dist/types/commands/SmartForwardCommand.d.ts +17 -0
  158. package/dist/types/commands/SmartReplyCommand.d.ts +17 -0
  159. package/dist/types/commands/SyncCommand.d.ts +100 -0
  160. package/dist/types/commands/mongo/FolderSyncCommandMongo.d.ts +8 -0
  161. package/dist/types/commands/mongo/GetItemEstimateCommandMongo.d.ts +7 -0
  162. package/dist/types/commands/mongo/ItemOperationsCommandMongo.d.ts +9 -0
  163. package/dist/types/commands/mongo/MeetingResponseCommandMongo.d.ts +8 -0
  164. package/dist/types/commands/mongo/MoveItemsCommandMongo.d.ts +8 -0
  165. package/dist/types/commands/mongo/ResolveRecipientsCommandMongo.d.ts +8 -0
  166. package/dist/types/commands/mongo/SearchCommandMongo.d.ts +8 -0
  167. package/dist/types/commands/mongo/SendMailCommandMongo.d.ts +8 -0
  168. package/dist/types/commands/mongo/SettingsCommandMongo.d.ts +7 -0
  169. package/dist/types/commands/mongo/SmartForwardCommandMongo.d.ts +8 -0
  170. package/dist/types/commands/mongo/SmartReplyCommandMongo.d.ts +8 -0
  171. package/dist/types/commands/mongo/SyncCommandMongo.d.ts +8 -0
  172. package/dist/types/commands/mongo/index.d.ts +9 -0
  173. package/dist/types/commands/sql/FolderSyncCommandSQL.d.ts +8 -0
  174. package/dist/types/commands/sql/GetItemEstimateCommandSQL.d.ts +7 -0
  175. package/dist/types/commands/sql/ItemOperationsCommandSQL.d.ts +9 -0
  176. package/dist/types/commands/sql/MeetingResponseCommandSQL.d.ts +8 -0
  177. package/dist/types/commands/sql/MoveItemsCommandSQL.d.ts +8 -0
  178. package/dist/types/commands/sql/ResolveRecipientsCommandSQL.d.ts +8 -0
  179. package/dist/types/commands/sql/SearchCommandSQL.d.ts +8 -0
  180. package/dist/types/commands/sql/SendMailCommandSQL.d.ts +8 -0
  181. package/dist/types/commands/sql/SettingsCommandSQL.d.ts +7 -0
  182. package/dist/types/commands/sql/SmartForwardCommandSQL.d.ts +8 -0
  183. package/dist/types/commands/sql/SmartReplyCommandSQL.d.ts +8 -0
  184. package/dist/types/commands/sql/SyncCommandSQL.d.ts +8 -0
  185. package/dist/types/commands/sql/index.d.ts +9 -0
  186. package/dist/types/index.d.ts +51 -0
  187. package/dist/types/mongo/DeviceSyncStateRouteMongo.d.ts +8 -0
  188. package/dist/types/mongo/EasRouteMongo.d.ts +14 -0
  189. package/dist/types/mongo/index.d.ts +3 -0
  190. package/dist/types/mongo.d.ts +1 -0
  191. package/dist/types/sql/DeviceSyncStateRouteSQL.d.ts +8 -0
  192. package/dist/types/sql/EasRouteSQL.d.ts +13 -0
  193. package/dist/types/sql/index.d.ts +3 -0
  194. package/dist/types/sql.d.ts +1 -0
  195. package/package.json +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WbxmlCodePages.js","sourceRoot":"","sources":["../../../src/codec/WbxmlCodePages.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,CAAN,IAAY,aA2BX;AA3BD,WAAY,aAAa;IACrB,uDAAW,CAAA;IACX,yDAAY,CAAA;IACZ,mDAAS,CAAA;IACT,uEAAmB,CAAA;IACnB,yDAAY,CAAA;IACZ,iDAAQ,CAAA;IACR,iEAAgB,CAAA;IAChB,uEAAmB,CAAA;IACnB,uEAAmB,CAAA;IACnB,mDAAS,CAAA;IACT,4EAAsB,CAAA;IACtB,kEAAiB,CAAA;IACjB,4DAAc,CAAA;IACd,kDAAS,CAAA;IACT,4DAAc,CAAA;IACd,sDAAW,CAAA;IACX,gDAAQ,CAAA;IACR,gEAAgB,CAAA;IAChB,0DAAa,CAAA;IACb,wEAAoB,CAAA;IACpB,sEAAmB,CAAA;IACnB,gEAAgB,CAAA;IAChB,sDAAW,CAAA;IACX,oDAAU,CAAA;IACV,0EAAqB,CAAA;IACrB,kDAAS,CAAA;AACb,CAAC,EA3BW,aAAa,KAAb,aAAa,QA2BxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,YAAY,GAA+D;IAC7E,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;QACrB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS,EAAE,aAAa;QAC9B,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY,EAAE,WAAW;QAC/B,IAAI,EAAE,eAAe,EAAE,aAAa;QACpC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,YAAY,EAAE,aAAa;QACjC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,mBAAmB;KAC5B;IACD,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;QACtB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,MAAM,EAAE,iDAAiD;QAC/D,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,eAAe,EAAE,aAAa;QACpC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,cAAc;KACvB;IACD,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;QACnB,IAAI,EAAE,YAAY,EAAE,kDAAkD;QACtE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU,EAAE,kBAAkB;QACpC,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,yBAAyB;KAClC;IACD,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;QACtB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe,EAAE,aAAa;QACpC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY,EAAE,aAAa;QACjC,IAAI,EAAE,aAAa,EAAE,aAAa;QAClC,IAAI,EAAE,SAAS,EAAE,aAAa;QAC9B,IAAI,EAAE,SAAS,EAAE,aAAa;QAC9B,IAAI,EAAE,QAAQ,EAAE,aAAa;QAC7B,IAAI,EAAE,WAAW,EAAE,aAAa;QAChC,IAAI,EAAE,YAAY,EAAE,aAAa;QACjC,IAAI,EAAE,aAAa,EAAE,aAAa;QAClC,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE,WAAW;KACpB;IACD,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;QAClB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;KACnB;IACD,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;QAC1B,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,SAAS,EAAE,aAAa;QAC9B,wGAAwG;QACxG,yGAAyG;QACzG,oGAAoG;QACpG,wGAAwG;QACxG,2DAA2D;QAC3D,IAAI,EAAE,SAAS,EAAE,qCAAqC;QACtD,IAAI,EAAE,QAAQ,EAAE,aAAa;QAC7B,IAAI,EAAE,YAAY,EAAE,aAAa;QACjC,IAAI,EAAE,UAAU,EAAE,aAAa;QAC/B,IAAI,EAAE,UAAU,EAAE,aAAa;QAC/B,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;KACjB;IACD,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE;QAC7B,IAAI,EAAE,SAAS,EAAE,2BAA2B;QAC5C,IAAI,EAAE,QAAQ,EAAE,SAAS;QACzB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,UAAU,EAAE,aAAa;QAC/B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,cAAc,EAAE,aAAa;QACnC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS,EAAE,aAAa;KACjC;IACD,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE;QAC7B,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS,EAAE,aAAa;QAC9B,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,cAAc;KACvB;IACD,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE;QAC/B,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,aAAa;KACtB;IACD,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;QACnB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,eAAe,EAAE,aAAa;QACpC,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,gBAAgB;KACzB;IACD,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;QACvB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,KAAK;KACd;IACD,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,WAAW,EAAE,2BAA2B;QAC9C,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,SAAS,EAAE,aAAa;KACjC;IACD,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;QACvB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,oCAAoC;QAC1C,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,uBAAuB,EAAE,aAAa;QAC5C,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,6BAA6B;QACnC,IAAI,EAAE,iCAAiC;QACvC,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE,mCAAmC;QACzC,IAAI,EAAE,oCAAoC;QAC1C,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,8BAA8B;QACpC,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,gCAAgC;QACtC,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,+BAA+B;QACrC,IAAI,EAAE,6BAA6B;QACnC,IAAI,EAAE,iCAAiC;QACvC,IAAI,EAAE,0CAA0C;QAChD,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,gCAAgC;QACtC,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,uBAAuB;KAChC;IACD,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,aAAa;KACtB;IACD,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;KACf;IACD,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE;QACzB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,YAAY;KACrB;IACD,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;QACtB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,6BAA6B;KACtC;IACD,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;QAC5B,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,YAAY;KACrB;IACD,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE;QACzB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM,EAAE,WAAW;QACzB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;KAChB;IACD,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;QACpB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,MAAM;KACf;CACJ,CAAC;AAEF,MAAM,aAAa,GAA+D,MAAM,CAAC,WAAW,CAChG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC/C,MAAM,CAAC,IAAI,CAAC;IACZ,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CACvF,CAAC,CACL,CAAC;AAEF;;;wEAGwE;AACxE,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY;IACrD,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED;;;eAGe;AACf,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAW;IACpD,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,GAAG,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,154 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { tagNameForCode } from "./WbxmlCodePages.js";
6
+ // See WbxmlEncoder.ts for citations on these WBXML global tokens and the tag-byte flag bits.
7
+ const SWITCH_PAGE = 0x00;
8
+ const END = 0x01;
9
+ const STR_I = 0x03;
10
+ const OPAQUE = 0xc3;
11
+ const CONTENT_FLAG = 0x40;
12
+ const ATTR_FLAG = 0x80;
13
+ const TAG_CODE_MASK = 0x3f;
14
+ /** Caps `readTagElement`/`readContentUntilEnd`'s mutual recursion depth - unlike every length-prefixed field in
15
+ * this format, element nesting has no size-based bound at all, and costs as little as ~2 bytes of wire format
16
+ * per level (a content-flagged tag byte immediately followed by its own `END`), so an unbounded decoder lets a
17
+ * tiny crafted request drive the recursion deep enough to exhaust the call stack. No real EAS document (the
18
+ * deepest legitimate shape here is roughly `Sync > Collections > Collection > Commands > Add > ApplicationData
19
+ * > Body > ...`, well under 20 levels) comes anywhere close to this limit. */
20
+ const MAX_NESTING_DEPTH = 200;
21
+ /**
22
+ * Decodes a WBXML byte stream (an EAS request/response body) back into a `WbxmlElement` tree — the exact
23
+ * inverse of `WbxmlEncoder`. Reads the fixed EAS document header, skips its (always-empty, in real
24
+ * ActiveSync traffic) string table, then parses the single root element.
25
+ *
26
+ * The `publicid` header field is read via the same generic `mb_u_int32` reader used everywhere else, which is
27
+ * only a partial implementation of the full WBXML spec for that field (a raw leading `0x00` byte would
28
+ * signal "public identifier is a string-table reference" under the full spec, a form real ActiveSync traffic
29
+ * never uses) — safe here since every real EAS document sends the literal well-known value `1` ("unknown or
30
+ * missing"), which decodes identically either way.
31
+ *
32
+ * @author Jean-Philippe Steinmetz
33
+ */
34
+ export class WbxmlDecoder {
35
+ constructor() {
36
+ this.buf = Buffer.alloc(0);
37
+ this.pos = 0;
38
+ this.currentPage = 0;
39
+ this.depth = 0;
40
+ }
41
+ decode(data) {
42
+ this.buf = data;
43
+ this.pos = 0;
44
+ this.currentPage = 0;
45
+ this.depth = 0;
46
+ this.readByte(); // version - not validated; every ActiveSync client/server variant this library
47
+ // targets sends 0x03 (WBXML 1.3), but nothing here depends on that specific value.
48
+ this.readMbUint(); // publicid
49
+ this.readMbUint(); // charset
50
+ const stringTableLength = this.readMbUint();
51
+ this.pos += stringTableLength; // skip the (always empty, for ActiveSync) string table
52
+ // A leading SWITCH_PAGE before the root tag is legal (and common - e.g. a `Provision` document's
53
+ // root element lives on code page 14, not the page-0 `AirSync` default) and is not itself part of
54
+ // any element's content, so it's consumed here rather than inside `readTagElement()`.
55
+ while (this.pos < this.buf.length && this.buf[this.pos] === SWITCH_PAGE) {
56
+ this.pos++;
57
+ this.currentPage = this.readByte();
58
+ }
59
+ return this.readTagElement();
60
+ }
61
+ readByte() {
62
+ if (this.pos >= this.buf.length) {
63
+ throw new Error("WbxmlDecoder: unexpected end of buffer");
64
+ }
65
+ return this.buf[this.pos++];
66
+ }
67
+ /** Decodes a WBXML `mb_u_int32`: base-128 digits, most significant group first, every byte but the last
68
+ * carrying the 0x80 continuation bit. Mirrors `WbxmlEncoder.writeMbUint()`. */
69
+ readMbUint() {
70
+ let value = 0;
71
+ for (;;) {
72
+ const byte = this.readByte();
73
+ value = value * 128 + (byte & 0x7f);
74
+ if ((byte & 0x80) === 0) {
75
+ return value;
76
+ }
77
+ }
78
+ }
79
+ readCString() {
80
+ const start = this.pos;
81
+ while (this.pos < this.buf.length && this.buf[this.pos] !== 0x00) {
82
+ this.pos++;
83
+ }
84
+ if (this.pos >= this.buf.length) {
85
+ throw new Error("WbxmlDecoder: unterminated inline string (STR_I)");
86
+ }
87
+ const value = this.buf.toString("utf-8", start, this.pos);
88
+ this.pos++; // skip the null terminator
89
+ return value;
90
+ }
91
+ readTagElement() {
92
+ if (++this.depth > MAX_NESTING_DEPTH) {
93
+ throw new Error(`WbxmlDecoder: exceeded maximum nesting depth of ${MAX_NESTING_DEPTH}`);
94
+ }
95
+ try {
96
+ const byte = this.readByte();
97
+ if ((byte & ATTR_FLAG) !== 0) {
98
+ throw new Error("WbxmlDecoder: attributes are not supported (ActiveSync's WBXML profile never uses them)");
99
+ }
100
+ const page = this.currentPage;
101
+ const tag = tagNameForCode(page, byte & TAG_CODE_MASK);
102
+ if ((byte & CONTENT_FLAG) === 0) {
103
+ return { page, tag, children: [] };
104
+ }
105
+ const { children, text, opaque } = this.readContentUntilEnd();
106
+ return { page, tag, children, text, opaque };
107
+ }
108
+ finally {
109
+ this.depth--;
110
+ }
111
+ }
112
+ /** Reads a mixed sequence of child tag elements / an inline string / opaque binary content, up to (and
113
+ * consuming) the terminating `END` token — the body of one "has content" element. Also handles a
114
+ * `SWITCH_PAGE` appearing between sibling children, which applies to every subsequent sibling until
115
+ * either the next switch or the end of this content block (switching page is a standing instruction, not
116
+ * scoped to a single following tag). */
117
+ readContentUntilEnd() {
118
+ const children = [];
119
+ let text;
120
+ let opaque;
121
+ for (;;) {
122
+ if (this.pos >= this.buf.length) {
123
+ throw new Error("WbxmlDecoder: unexpected end of buffer while reading element content");
124
+ }
125
+ const token = this.buf[this.pos];
126
+ if (token === END) {
127
+ this.pos++;
128
+ break;
129
+ }
130
+ else if (token === SWITCH_PAGE) {
131
+ this.pos++;
132
+ this.currentPage = this.readByte();
133
+ }
134
+ else if (token === STR_I) {
135
+ this.pos++;
136
+ // Concatenates rather than overwrites: a defensive accommodation for an encoder that splits
137
+ // one logical text value across multiple consecutive STR_I tokens (legal per WBXML, though
138
+ // not something this library's own encoder ever does) rather than data loss on replay.
139
+ text = (text ?? "") + this.readCString();
140
+ }
141
+ else if (token === OPAQUE) {
142
+ this.pos++;
143
+ const length = this.readMbUint();
144
+ opaque = Buffer.from(this.buf.subarray(this.pos, this.pos + length));
145
+ this.pos += length;
146
+ }
147
+ else {
148
+ children.push(this.readTagElement());
149
+ }
150
+ }
151
+ return { children, text, opaque };
152
+ }
153
+ }
154
+ //# sourceMappingURL=WbxmlDecoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WbxmlDecoder.js","sourceRoot":"","sources":["../../../src/codec/WbxmlDecoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /** Constructs a structural element with nested children (e.g. `<Collection>...</Collection>`). */
6
+ export function element(page, tag, children = []) {
7
+ return { page, tag, children };
8
+ }
9
+ /** Constructs a leaf element carrying a single inline string value (e.g. `<SyncKey>1</SyncKey>`). */
10
+ export function textElement(page, tag, text) {
11
+ return { page, tag, children: [], text };
12
+ }
13
+ /** Constructs a leaf element carrying raw binary content (e.g. `<Data>...</Data>` in `ItemOperations`). */
14
+ export function opaqueElement(page, tag, opaque) {
15
+ return { page, tag, children: [], opaque };
16
+ }
17
+ /** Finds the first direct child of `parent` with the given tag name, or `undefined` if none exists. Does not
18
+ * search recursively — WBXML/EAS field lookups are always relative to a specific known parent element. */
19
+ export function findChild(parent, tag) {
20
+ return parent.children.find((child) => child.tag === tag);
21
+ }
22
+ /** Finds every direct child of `parent` with the given tag name (e.g. every `Collection` under
23
+ * `Collections`). */
24
+ export function findChildren(parent, tag) {
25
+ return parent.children.filter((child) => child.tag === tag);
26
+ }
27
+ /** Shorthand for `findChild(parent, tag)?.text`, the common case of reading a leaf field's string value. */
28
+ export function childText(parent, tag) {
29
+ return findChild(parent, tag)?.text;
30
+ }
31
+ //# sourceMappingURL=WbxmlElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WbxmlElement.js","sourceRoot":"","sources":["../../../src/codec/WbxmlElement.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAgC/E,kGAAkG;AAClG,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,GAAW,EAAE,WAA2B,EAAE;IAC5E,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,GAAW,EAAE,IAAY;IAC/D,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc;IACnE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AAC/C,CAAC;AAED;0GAC0G;AAC1G,MAAM,UAAU,SAAS,CAAC,MAAoB,EAAE,GAAW;IACvD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED;qBACqB;AACrB,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,GAAW;IAC1D,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,SAAS,CAAC,MAAoB,EAAE,GAAW;IACvD,OAAO,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC;AACxC,CAAC"}
@@ -0,0 +1,88 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { codeForTagName } from "./WbxmlCodePages.js";
6
+ // WBXML global tokens (MS-ASWBXML §1.6 "Standards Assignments" / [WBXML1.2]) that appear outside a code
7
+ // page's own tag-token space, and so are shared across every page.
8
+ const SWITCH_PAGE = 0x00;
9
+ const END = 0x01;
10
+ const STR_I = 0x03;
11
+ const OPAQUE = 0xc3;
12
+ /** Bit flags folded into a tag token byte alongside its 6-bit code (MS-ASWBXML §2.1.2.2 "Tag Format"). Only
13
+ * `CONTENT_FLAG` is ever set by this encoder - ActiveSync's WBXML profile never uses attributes. */
14
+ const CONTENT_FLAG = 0x40;
15
+ /**
16
+ * Encodes a `WbxmlElement` tree into a WBXML byte stream, per MS-ASWBXML's encoding algorithm. Emits the
17
+ * fixed EAS document header (`version=1.3, publicid=unknown, charset=UTF-8, empty string table`) followed by
18
+ * the token stream for the given root element, switching code pages only when the page actually changes from
19
+ * whatever was last active (starting from `AirSync`, page 0, the implicit default per spec).
20
+ *
21
+ * @author Jean-Philippe Steinmetz
22
+ */
23
+ export class WbxmlEncoder {
24
+ constructor() {
25
+ this.bytes = [];
26
+ this.currentPage = 0;
27
+ }
28
+ encode(root) {
29
+ // version=0x03 (WBXML 1.3, what real ActiveSync traffic uses despite MS-ASWBXML referencing 1.2),
30
+ // publicid=0x01 (mb_u_int32 value 1: "unknown or missing" - the only form ActiveSync ever sends),
31
+ // charset=0x6A (IANA MIBenum 106: UTF-8), string table length=0x00 (ActiveSync never uses one -
32
+ // inline STR_I tokens carry every string literal instead).
33
+ this.bytes = [0x03, 0x01, 0x6a, 0x00];
34
+ this.currentPage = 0;
35
+ this.writeElement(root);
36
+ return Buffer.from(this.bytes);
37
+ }
38
+ writeElement(el) {
39
+ if (el.page !== this.currentPage) {
40
+ this.bytes.push(SWITCH_PAGE, el.page);
41
+ this.currentPage = el.page;
42
+ }
43
+ const code = codeForTagName(el.page, el.tag);
44
+ const hasContent = el.children.length > 0 || el.text !== undefined || el.opaque !== undefined;
45
+ this.bytes.push(hasContent ? code | CONTENT_FLAG : code);
46
+ if (!hasContent) {
47
+ return;
48
+ }
49
+ if (el.text !== undefined) {
50
+ this.writeStrI(el.text);
51
+ }
52
+ else if (el.opaque !== undefined) {
53
+ this.writeOpaque(el.opaque);
54
+ }
55
+ else {
56
+ for (const child of el.children) {
57
+ this.writeElement(child);
58
+ }
59
+ }
60
+ this.bytes.push(END);
61
+ }
62
+ writeStrI(text) {
63
+ this.bytes.push(STR_I);
64
+ for (const byte of Buffer.from(text, "utf-8")) {
65
+ this.bytes.push(byte);
66
+ }
67
+ this.bytes.push(0x00);
68
+ }
69
+ writeOpaque(data) {
70
+ this.bytes.push(OPAQUE);
71
+ this.writeMbUint(data.length);
72
+ for (const byte of data) {
73
+ this.bytes.push(byte);
74
+ }
75
+ }
76
+ /** Encodes `value` as a WBXML multi-byte unsigned integer (`mb_u_int32`): base-128 digits, most
77
+ * significant group first, every byte but the last carrying the 0x80 continuation bit. */
78
+ writeMbUint(value) {
79
+ const groups = [value & 0x7f];
80
+ value = Math.floor(value / 128);
81
+ while (value > 0) {
82
+ groups.unshift((value & 0x7f) | 0x80);
83
+ value = Math.floor(value / 128);
84
+ }
85
+ this.bytes.push(...groups);
86
+ }
87
+ }
88
+ //# sourceMappingURL=WbxmlEncoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WbxmlEncoder.js","sourceRoot":"","sources":["../../../src/codec/WbxmlEncoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
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
+ ///////////////////////////////////////////////////////////////////////////////
11
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
12
+ // SPDX-License-Identifier: MPL-2.0
13
+ ///////////////////////////////////////////////////////////////////////////////
14
+ import * as crypto from "crypto";
15
+ import { simpleParser } from "mailparser";
16
+ import { ApiError, ObjectDecorators } from "@rapidrest/core";
17
+ import { ACLAction, ACLUtils, ApiErrorMessages, ApiErrors } from "@rapidrest/service-core";
18
+ import { ScanPipeline } from "@rapidmx/restapi/scan";
19
+ import { findOrCreateWellKnownFolder, FolderType, MessageImportance, RecipientType, RecoverableRepoUtils, scanAndRelay, } from "@rapidmx/restapi";
20
+ import { childText, findChild } from "../codec/WbxmlElement.js";
21
+ const { Init, Inject } = ObjectDecorators;
22
+ /** Flattens mailparser's `AddressObject | AddressObject[] | undefined` union (grouped addresses can nest an
23
+ * `AddressObject` per group) into a plain list of SMTP addresses, dropping any entry with no address (a
24
+ * pure-group header with no direct member). */
25
+ function addressesOf(value) {
26
+ const objects = Array.isArray(value) ? value : value ? [value] : [];
27
+ const addresses = [];
28
+ for (const obj of objects) {
29
+ for (const entry of obj.value) {
30
+ collectAddresses(entry, addresses);
31
+ }
32
+ }
33
+ return addresses;
34
+ }
35
+ function collectAddresses(entry, out) {
36
+ if (entry.address) {
37
+ out.push(entry.address);
38
+ }
39
+ for (const grouped of entry.group ?? []) {
40
+ collectAddresses(grouped, out);
41
+ }
42
+ }
43
+ /**
44
+ * Shared implementation for EAS `SendMail`, `SmartForward`, and `SmartReply` (MS-ASCMD `ComposeMail` namespace)
45
+ * — all three submit a client-composed raw MIME body directly (`<Mime>`, opaque WBXML content) rather than
46
+ * referencing a pre-existing draft `Message`, unlike the webmail REST API's `POST /messages/:id/send` (see
47
+ * `BaseMessageRoute.send()`, which this class's `scanAndRelay()` call shares its scan-then-relay core with via
48
+ * `MailSendUtils.ts`).
49
+ *
50
+ * **Pragmatic subset, deliberately not the full MS-ASCMD semantics**:
51
+ * - `SmartForward`/`SmartReply`'s `<Source>` (the message being forwarded/replied to) is used only to thread
52
+ * the outgoing message (`inReplyTo`/`references`) and to flip the original's `Answered`/`Forwarded` flag - the
53
+ * real spec has the *server* splice the original message's full content into the outgoing MIME so the client
54
+ * never has to download-then-reupload it; this pragmatic subset instead expects the client's own `<Mime>` to
55
+ * already be the complete outgoing message (which is what every mainstream client's own compose UI naturally
56
+ * produces once it has fetched the original for display), matching this library's "pragmatic subset, not full
57
+ * fidelity" precedent elsewhere (e.g. `FolderSyncCommand`'s SyncKey replay-protection gap).
58
+ * - `ReplaceMime`/`AccountId`/`InstanceId` are not read - single-account, non-recurring-meeting compose only.
59
+ * - Attachments present in the composed MIME are relayed correctly (`scanAndRelay()`'s `ScanPipeline` handles
60
+ * the full raw message) but are not additionally persisted as `Attachment` records on the saved Sent Items
61
+ * copy - `Message.hasAttachments` is still set correctly from the parsed MIME, just not each attachment's own
62
+ * row (deferred, matching `ItemOperationsCommand`'s own future `Fetch`-of-Sent-Items scope).
63
+ *
64
+ * `folderClass`/`messageClass` are supplied by the Mongo/SQL concrete subclasses, and `markOriginal()` by the
65
+ * `SmartForwardCommand`/`SmartReplyCommand` subclasses (a no-op here, since plain `SendMailCommand` never has a
66
+ * `<Source>` to act on).
67
+ *
68
+ * @author Jean-Philippe Steinmetz
69
+ */
70
+ export class ComposeMailCommand {
71
+ async init() {
72
+ this.folderRepo = await this._objectFactory.newInstance(RecoverableRepoUtils, {
73
+ name: this.folderClass.name,
74
+ args: [this.folderClass],
75
+ });
76
+ this.messageRepo = await this._objectFactory.newInstance(RecoverableRepoUtils, {
77
+ name: this.messageClass.name,
78
+ args: [this.messageClass],
79
+ });
80
+ }
81
+ /** Called once the outgoing message has been sent, only when the request carried a `<Source>` (i.e. this
82
+ * is a `SmartForward`/`SmartReply`, never a plain `SendMail`) - flips the referenced original message's own
83
+ * `Answered`/`Forwarded` flag. A no-op here; overridden by the two subclasses that need it. */
84
+ async markOriginal(_ctx, _original) {
85
+ // No-op by default (SendMailCommand never calls this - it never resolves a Source).
86
+ }
87
+ async handle(ctx) {
88
+ if (!this.folderRepo || !this.messageRepo || !this.blobStore || !this.mailTransport || !this.scanPipeline) {
89
+ throw new ApiError(ApiErrors.INTERNAL_ERROR, 500, ApiErrorMessages.INTERNAL_ERROR);
90
+ }
91
+ if (!ctx.request) {
92
+ throw new ApiError(ApiErrors.INVALID_REQUEST, 400, ApiErrorMessages.INVALID_REQUEST);
93
+ }
94
+ // Registered as "MIME" (all caps) in WbxmlCodePages' ComposeMail table, per the published MS-ASWBXML
95
+ // token name - not "Mime".
96
+ const mimeEl = findChild(ctx.request, "MIME");
97
+ const raw = mimeEl?.opaque ?? (mimeEl?.text !== undefined ? Buffer.from(mimeEl.text, "utf-8") : undefined);
98
+ if (!raw || raw.length === 0) {
99
+ throw new ApiError(ApiErrors.INVALID_REQUEST, 400, "A SendMail/SmartForward/SmartReply request must include a MIME body.");
100
+ }
101
+ // A `SmartForward`/`SmartReply` request identifies the message being acted on via `<Source><ItemId>` -
102
+ // the same `Message.uid` this library already exposes as `ServerId` in Sync/FolderSync responses, so
103
+ // no separate lookup table is needed. `SendMail` never carries a `<Source>` at all.
104
+ let original;
105
+ const sourceEl = findChild(ctx.request, "Source");
106
+ if (sourceEl) {
107
+ const itemId = childText(sourceEl, "ItemId");
108
+ if (!itemId) {
109
+ throw new ApiError(ApiErrors.INVALID_REQUEST, 400, "Source is missing its required ItemId.");
110
+ }
111
+ const found = await this.messageRepo.findOne(itemId, { ignoreACL: true });
112
+ if (!found) {
113
+ throw new ApiError(ApiErrors.NOT_FOUND, 404, ApiErrorMessages.NOT_FOUND);
114
+ }
115
+ if (!(await this.aclUtils.hasPermission(ctx.user, found.folderUid, ACLAction.READ))) {
116
+ throw new ApiError(ApiErrors.AUTH_PERMISSION_FAILURE, 403, ApiErrorMessages.AUTH_PERMISSION_FAILURE);
117
+ }
118
+ original = found;
119
+ }
120
+ const parsed = await simpleParser(raw);
121
+ const envelopeFrom = parsed.from?.value[0]?.address;
122
+ const envelopeTo = [...addressesOf(parsed.to), ...addressesOf(parsed.cc), ...addressesOf(parsed.bcc)];
123
+ if (!envelopeFrom || envelopeTo.length === 0) {
124
+ throw new ApiError(ApiErrors.INVALID_REQUEST, 400, "The composed Mime has no resolvable From/To address.");
125
+ }
126
+ const { sanitizedHtmlBlobKey } = await scanAndRelay(raw, envelopeFrom, envelopeTo, this.scanPipeline, this.mailTransport, this.blobStore);
127
+ if (findChild(ctx.request, "SaveInSentItems")) {
128
+ const bodyBlobKey = `bodies/${crypto.randomUUID()}`;
129
+ await this.blobStore.put(bodyBlobKey, raw, { contentType: "message/rfc822" });
130
+ const sentFolder = await findOrCreateWellKnownFolder(this.folderRepo, this.folderClass, ctx.mailboxUid, FolderType.SENT_ITEMS, ctx.user);
131
+ await this.messageRepo.create(new this.messageClass({
132
+ folderUid: sentFolder.uid,
133
+ mailboxUid: ctx.mailboxUid,
134
+ messageId: parsed.messageId ?? `${crypto.randomUUID()}@eas`,
135
+ subject: parsed.subject ?? "",
136
+ from: { address: envelopeFrom, type: RecipientType.TO },
137
+ recipients: buildRecipients(parsed),
138
+ sentDate: new Date(),
139
+ receivedDate: new Date(),
140
+ bodyBlobKey,
141
+ sanitizedHtmlBlobKey,
142
+ bodyPreview: (parsed.text ?? "").slice(0, 200),
143
+ flags: { read: true, flagged: false, answered: false, forwarded: false },
144
+ importance: MessageImportance.NORMAL,
145
+ inReplyTo: original?.messageId,
146
+ references: original ? [...original.references, original.messageId] : [],
147
+ hasAttachments: (parsed.attachments?.length ?? 0) > 0,
148
+ }), { ignoreACL: true, user: ctx.user });
149
+ }
150
+ if (original) {
151
+ await this.markOriginal(ctx, original);
152
+ }
153
+ // Per MS-ASCMD: a successful SendMail/SmartForward/SmartReply response is an empty HTTP 200 body, not
154
+ // a Status-coded WBXML document like FolderSync/Sync/Provision return.
155
+ return undefined;
156
+ }
157
+ }
158
+ __decorate([
159
+ Inject("BlobStore"),
160
+ __metadata("design:type", Object)
161
+ ], ComposeMailCommand.prototype, "blobStore", void 0);
162
+ __decorate([
163
+ Inject("MailTransport"),
164
+ __metadata("design:type", Object)
165
+ ], ComposeMailCommand.prototype, "mailTransport", void 0);
166
+ __decorate([
167
+ Inject(ScanPipeline),
168
+ __metadata("design:type", ScanPipeline)
169
+ ], ComposeMailCommand.prototype, "scanPipeline", void 0);
170
+ __decorate([
171
+ Inject(ACLUtils),
172
+ __metadata("design:type", ACLUtils)
173
+ ], ComposeMailCommand.prototype, "aclUtils", void 0);
174
+ __decorate([
175
+ Init,
176
+ __metadata("design:type", Function),
177
+ __metadata("design:paramtypes", []),
178
+ __metadata("design:returntype", Promise)
179
+ ], ComposeMailCommand.prototype, "init", null);
180
+ function buildRecipients(parsed) {
181
+ return [
182
+ ...addressesOf(parsed.to).map((address) => ({ address, type: RecipientType.TO })),
183
+ ...addressesOf(parsed.cc).map((address) => ({ address, type: RecipientType.CC })),
184
+ ...addressesOf(parsed.bcc).map((address) => ({ address, type: RecipientType.BCC })),
185
+ ];
186
+ }
187
+ //# sourceMappingURL=ComposeMailCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposeMailCommand.js","sourceRoot":"","sources":["../../../src/commands/ComposeMailCommand.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,YAAY,EAA0D,MAAM,YAAY,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAiB,MAAM,yBAAyB,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAEH,2BAA2B,EAC3B,UAAU,EAEV,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,YAAY,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAqB,MAAM,0BAA0B,CAAC;AAEnF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;AAE1C;;+CAE+C;AAC/C,SAAS,WAAW,CAAC,KAAkD;IACnE,MAAM,OAAO,GAAoB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC5B,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAmB,EAAE,GAAa;IACxD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACtC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAgB,kBAAkB;IAyBvB,AAAN,KAAK,CAAC,IAAI;QACb,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,cAAe,CAAC,WAAW,CAAC,oBAAoB,EAAE;YAC3E,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YAC3B,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,cAAe,CAAC,WAAW,CAAC,oBAAoB,EAAE;YAC5E,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;YAC5B,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC;SAC5B,CAAC,CAAC;IACP,CAAC;IAED;;mGAE+F;IACrF,KAAK,CAAC,YAAY,CAAC,IAAuB,EAAE,SAAoC;QACtF,oFAAoF;IACxF,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAsB;QACtC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxG,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,GAAG,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACzF,CAAC;QAED,qGAAqG;QACrG,2BAA2B;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAuB,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/H,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,sEAAsE,CAAC,CAAC;QAC/H,CAAC;QAED,uGAAuG;QACvG,qGAAqG;QACrG,oFAAoF;QACpF,IAAI,QAAkE,CAAC;QACvE,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,wCAAwC,CAAC,CAAC;YACjG,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAS,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACnF,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,uBAAuB,EAAE,GAAG,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;YACzG,CAAC;YACD,QAAQ,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,MAAM,MAAM,GAAe,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,YAAY,GAAuB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACxE,MAAM,UAAU,GAAa,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChH,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,sDAAsD,CAAC,CAAC;QAC/G,CAAC;QAED,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1I,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,UAAU,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;YACpD,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAE9E,MAAM,UAAU,GAAQ,MAAM,2BAA2B,CACrD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,WAAW,EAChB,GAAG,CAAC,UAAU,EACd,UAAU,CAAC,UAAU,EACrB,GAAG,CAAC,IAAI,CACX,CAAC;YAEF,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CACzB,IAAI,IAAI,CAAC,YAAY,CAAC;gBAClB,SAAS,EAAE,UAAU,CAAC,GAAG;gBACzB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM;gBAC3D,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;gBAC7B,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,EAAE;gBACvD,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC;gBACnC,QAAQ,EAAE,IAAI,IAAI,EAAE;gBACpB,YAAY,EAAE,IAAI,IAAI,EAAE;gBACxB,WAAW;gBACX,oBAAoB;gBACpB,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;gBACxE,UAAU,EAAE,iBAAiB,CAAC,MAAM;gBACpC,SAAS,EAAE,QAAQ,EAAE,SAAS;gBAC9B,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;gBACxE,cAAc,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;aACjD,CAAC,EACT,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACtC,CAAC;QACN,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAED,sGAAsG;QACtG,uEAAuE;QACvE,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ;AAtHW;IADP,MAAM,CAAC,WAAW,CAAC;;qDACU;AAGtB;IADP,MAAM,CAAC,eAAe,CAAC;;yDACI;AAGpB;IADP,MAAM,CAAC,YAAY,CAAC;8BACE,YAAY;wDAAC;AAG5B;IADP,MAAM,CAAC,QAAQ,CAAC;8BACE,QAAQ;oDAAC;AAGf;IADZ,IAAI;;;;8CAUJ;AAmGL,SAAS,eAAe,CAAC,MAAkB;IACvC,OAAO;QACH,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC;KACtF,CAAC;AACN,CAAC"}