@fin.cx/einvoice 5.0.2

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 (171) hide show
  1. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts/00_commitinfo_data.js +9 -0
  3. package/dist_ts/classes.decoder.d.ts +40 -0
  4. package/dist_ts/classes.decoder.js +320 -0
  5. package/dist_ts/classes.encoder.d.ts +51 -0
  6. package/dist_ts/classes.encoder.js +293 -0
  7. package/dist_ts/classes.xinvoice.d.ts +136 -0
  8. package/dist_ts/classes.xinvoice.js +352 -0
  9. package/dist_ts/einvoice.d.ts +217 -0
  10. package/dist_ts/einvoice.js +505 -0
  11. package/dist_ts/errors.d.ts +121 -0
  12. package/dist_ts/errors.js +241 -0
  13. package/dist_ts/formats/base/base.decoder.d.ts +32 -0
  14. package/dist_ts/formats/base/base.decoder.js +52 -0
  15. package/dist_ts/formats/base/base.encoder.d.ts +13 -0
  16. package/dist_ts/formats/base/base.encoder.js +7 -0
  17. package/dist_ts/formats/base/base.validator.d.ts +44 -0
  18. package/dist_ts/formats/base/base.validator.js +39 -0
  19. package/dist_ts/formats/base.decoder.d.ts +19 -0
  20. package/dist_ts/formats/base.decoder.js +130 -0
  21. package/dist_ts/formats/base.validator.d.ts +44 -0
  22. package/dist_ts/formats/base.validator.js +39 -0
  23. package/dist_ts/formats/cii/cii.decoder.d.ts +61 -0
  24. package/dist_ts/formats/cii/cii.decoder.js +111 -0
  25. package/dist_ts/formats/cii/cii.encoder.d.ts +43 -0
  26. package/dist_ts/formats/cii/cii.encoder.js +48 -0
  27. package/dist_ts/formats/cii/cii.types.d.ts +31 -0
  28. package/dist_ts/formats/cii/cii.types.js +40 -0
  29. package/dist_ts/formats/cii/cii.validator.d.ts +56 -0
  30. package/dist_ts/formats/cii/cii.validator.js +146 -0
  31. package/dist_ts/formats/cii/facturx/facturx.decoder.d.ts +43 -0
  32. package/dist_ts/formats/cii/facturx/facturx.decoder.js +207 -0
  33. package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +82 -0
  34. package/dist_ts/formats/cii/facturx/facturx.encoder.js +400 -0
  35. package/dist_ts/formats/cii/facturx/facturx.types.d.ts +10 -0
  36. package/dist_ts/formats/cii/facturx/facturx.types.js +15 -0
  37. package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +32 -0
  38. package/dist_ts/formats/cii/facturx/facturx.validator.js +138 -0
  39. package/dist_ts/formats/cii/zugferd/zugferd.decoder.d.ts +43 -0
  40. package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +218 -0
  41. package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +97 -0
  42. package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +550 -0
  43. package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +10 -0
  44. package/dist_ts/formats/cii/zugferd/zugferd.types.js +15 -0
  45. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +49 -0
  46. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +229 -0
  47. package/dist_ts/formats/cii/zugferd/zugferd.validator.d.ts +16 -0
  48. package/dist_ts/formats/cii/zugferd/zugferd.validator.js +29 -0
  49. package/dist_ts/formats/decoder.factory.d.ts +15 -0
  50. package/dist_ts/formats/decoder.factory.js +46 -0
  51. package/dist_ts/formats/factories/decoder.factory.d.ts +13 -0
  52. package/dist_ts/formats/factories/decoder.factory.js +56 -0
  53. package/dist_ts/formats/factories/encoder.factory.d.ts +14 -0
  54. package/dist_ts/formats/factories/encoder.factory.js +40 -0
  55. package/dist_ts/formats/factories/validator.factory.d.ts +12 -0
  56. package/dist_ts/formats/factories/validator.factory.js +110 -0
  57. package/dist_ts/formats/factorx.decoder.d.ts +18 -0
  58. package/dist_ts/formats/factorx.decoder.js +178 -0
  59. package/dist_ts/formats/factorx.encoder.d.ts +51 -0
  60. package/dist_ts/formats/factorx.encoder.js +293 -0
  61. package/dist_ts/formats/facturx.decoder.d.ts +18 -0
  62. package/dist_ts/formats/facturx.decoder.js +210 -0
  63. package/dist_ts/formats/facturx.encoder.d.ts +51 -0
  64. package/dist_ts/formats/facturx.encoder.js +293 -0
  65. package/dist_ts/formats/facturx.validator.d.ts +67 -0
  66. package/dist_ts/formats/facturx.validator.js +266 -0
  67. package/dist_ts/formats/pdf/extractors/associated.extractor.d.ts +14 -0
  68. package/dist_ts/formats/pdf/extractors/associated.extractor.js +68 -0
  69. package/dist_ts/formats/pdf/extractors/base.extractor.d.ts +92 -0
  70. package/dist_ts/formats/pdf/extractors/base.extractor.js +319 -0
  71. package/dist_ts/formats/pdf/extractors/index.d.ts +4 -0
  72. package/dist_ts/formats/pdf/extractors/index.js +5 -0
  73. package/dist_ts/formats/pdf/extractors/standard.extractor.d.ts +13 -0
  74. package/dist_ts/formats/pdf/extractors/standard.extractor.js +74 -0
  75. package/dist_ts/formats/pdf/extractors/text.extractor.d.ts +45 -0
  76. package/dist_ts/formats/pdf/extractors/text.extractor.js +151 -0
  77. package/dist_ts/formats/pdf/pdf.embedder.d.ts +69 -0
  78. package/dist_ts/formats/pdf/pdf.embedder.js +183 -0
  79. package/dist_ts/formats/pdf/pdf.extractor.d.ts +49 -0
  80. package/dist_ts/formats/pdf/pdf.extractor.js +98 -0
  81. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +40 -0
  82. package/dist_ts/formats/pdf/robust-pdf.extractor.js +324 -0
  83. package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +18 -0
  84. package/dist_ts/formats/ubl/en16931.ubl.validator.js +169 -0
  85. package/dist_ts/formats/ubl/generic/ubl.encoder.d.ts +151 -0
  86. package/dist_ts/formats/ubl/generic/ubl.encoder.js +892 -0
  87. package/dist_ts/formats/ubl/ubl.decoder.d.ts +61 -0
  88. package/dist_ts/formats/ubl/ubl.decoder.js +95 -0
  89. package/dist_ts/formats/ubl/ubl.encoder.d.ts +38 -0
  90. package/dist_ts/formats/ubl/ubl.encoder.js +46 -0
  91. package/dist_ts/formats/ubl/ubl.types.d.ts +16 -0
  92. package/dist_ts/formats/ubl/ubl.types.js +21 -0
  93. package/dist_ts/formats/ubl/ubl.validator.d.ts +50 -0
  94. package/dist_ts/formats/ubl/ubl.validator.js +112 -0
  95. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.d.ts +34 -0
  96. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +424 -0
  97. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +75 -0
  98. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +555 -0
  99. package/dist_ts/formats/ubl/xrechnung.validator.d.ts +15 -0
  100. package/dist_ts/formats/ubl/xrechnung.validator.js +107 -0
  101. package/dist_ts/formats/ubl.validator.d.ts +82 -0
  102. package/dist_ts/formats/ubl.validator.js +306 -0
  103. package/dist_ts/formats/utils/format.detector.d.ts +62 -0
  104. package/dist_ts/formats/utils/format.detector.js +249 -0
  105. package/dist_ts/formats/validation/en16931.validator.d.ts +23 -0
  106. package/dist_ts/formats/validation/en16931.validator.js +119 -0
  107. package/dist_ts/formats/validator.factory.d.ts +18 -0
  108. package/dist_ts/formats/validator.factory.js +78 -0
  109. package/dist_ts/formats/xinvoice.decoder.d.ts +28 -0
  110. package/dist_ts/formats/xinvoice.decoder.js +332 -0
  111. package/dist_ts/formats/xinvoice.encoder.d.ts +19 -0
  112. package/dist_ts/formats/xinvoice.encoder.js +282 -0
  113. package/dist_ts/index.d.ts +51 -0
  114. package/dist_ts/index.js +90 -0
  115. package/dist_ts/interfaces/common.d.ts +79 -0
  116. package/dist_ts/interfaces/common.js +24 -0
  117. package/dist_ts/interfaces.d.ts +87 -0
  118. package/dist_ts/interfaces.js +23 -0
  119. package/dist_ts/plugins.d.ts +14 -0
  120. package/dist_ts/plugins.js +31 -0
  121. package/npmextra.json +35 -0
  122. package/package.json +71 -0
  123. package/readme.hints.md +1107 -0
  124. package/readme.howtofixtests.md +38 -0
  125. package/readme.literature.md +1 -0
  126. package/readme.md +998 -0
  127. package/readme.plan.md +481 -0
  128. package/ts/00_commitinfo_data.ts +8 -0
  129. package/ts/einvoice.ts +603 -0
  130. package/ts/errors.ts +341 -0
  131. package/ts/formats/base/base.decoder.ts +68 -0
  132. package/ts/formats/base/base.encoder.ts +14 -0
  133. package/ts/formats/base/base.validator.ts +64 -0
  134. package/ts/formats/cii/cii.decoder.ts +139 -0
  135. package/ts/formats/cii/cii.encoder.ts +64 -0
  136. package/ts/formats/cii/cii.types.ts +44 -0
  137. package/ts/formats/cii/cii.validator.ts +171 -0
  138. package/ts/formats/cii/facturx/facturx.decoder.ts +243 -0
  139. package/ts/formats/cii/facturx/facturx.encoder.ts +483 -0
  140. package/ts/formats/cii/facturx/facturx.types.ts +18 -0
  141. package/ts/formats/cii/facturx/facturx.validator.ts +180 -0
  142. package/ts/formats/cii/zugferd/zugferd.decoder.ts +256 -0
  143. package/ts/formats/cii/zugferd/zugferd.encoder.ts +661 -0
  144. package/ts/formats/cii/zugferd/zugferd.types.ts +18 -0
  145. package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +267 -0
  146. package/ts/formats/cii/zugferd/zugferd.validator.ts +31 -0
  147. package/ts/formats/factories/decoder.factory.ts +62 -0
  148. package/ts/formats/factories/encoder.factory.ts +47 -0
  149. package/ts/formats/factories/validator.factory.ts +134 -0
  150. package/ts/formats/pdf/extractors/associated.extractor.ts +78 -0
  151. package/ts/formats/pdf/extractors/base.extractor.ts +355 -0
  152. package/ts/formats/pdf/extractors/index.ts +4 -0
  153. package/ts/formats/pdf/extractors/standard.extractor.ts +86 -0
  154. package/ts/formats/pdf/extractors/text.extractor.ts +162 -0
  155. package/ts/formats/pdf/pdf.embedder.ts +242 -0
  156. package/ts/formats/pdf/pdf.extractor.ts +141 -0
  157. package/ts/formats/ubl/en16931.ubl.validator.ts +216 -0
  158. package/ts/formats/ubl/generic/ubl.encoder.ts +1041 -0
  159. package/ts/formats/ubl/ubl.decoder.ts +121 -0
  160. package/ts/formats/ubl/ubl.encoder.ts +63 -0
  161. package/ts/formats/ubl/ubl.types.ts +22 -0
  162. package/ts/formats/ubl/ubl.validator.ts +133 -0
  163. package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +471 -0
  164. package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +619 -0
  165. package/ts/formats/ubl/xrechnung.validator.ts +185 -0
  166. package/ts/formats/utils/format.detector.ts +306 -0
  167. package/ts/formats/validation/en16931.validator.ts +135 -0
  168. package/ts/index.ts +164 -0
  169. package/ts/interfaces/common.ts +90 -0
  170. package/ts/interfaces.ts +98 -0
  171. package/ts/plugins.ts +61 -0
@@ -0,0 +1,555 @@
1
+ import { UBLEncoder } from '../generic/ubl.encoder.js';
2
+ import { DOMParser, XMLSerializer } from '../../../plugins.js';
3
+ /**
4
+ * Encoder for XRechnung (UBL) format
5
+ * Extends the generic UBL encoder with XRechnung-specific customizations
6
+ */
7
+ export class XRechnungEncoder extends UBLEncoder {
8
+ /**
9
+ * Encodes a credit note into XRechnung XML
10
+ * @param creditNote Credit note to encode
11
+ * @returns XRechnung XML string
12
+ */
13
+ async encodeCreditNote(creditNote) {
14
+ // First get the base UBL XML
15
+ const baseXml = await super.encodeCreditNote(creditNote);
16
+ // Parse and modify for XRechnung
17
+ const doc = new DOMParser().parseFromString(baseXml, 'application/xml');
18
+ this.applyXRechnungCustomizations(doc, creditNote);
19
+ // Serialize back to string
20
+ return new XMLSerializer().serializeToString(doc);
21
+ }
22
+ /**
23
+ * Encodes a debit note (invoice) into XRechnung XML
24
+ * @param debitNote Debit note to encode
25
+ * @returns XRechnung XML string
26
+ */
27
+ async encodeDebitNote(debitNote) {
28
+ // First get the base UBL XML
29
+ const baseXml = await super.encodeDebitNote(debitNote);
30
+ // Parse and modify for XRechnung
31
+ const doc = new DOMParser().parseFromString(baseXml, 'application/xml');
32
+ this.applyXRechnungCustomizations(doc, debitNote);
33
+ // Serialize back to string
34
+ return new XMLSerializer().serializeToString(doc);
35
+ }
36
+ /**
37
+ * Applies XRechnung-specific customizations to the document
38
+ * @param doc XML document
39
+ * @param invoice Invoice data
40
+ */
41
+ applyXRechnungCustomizations(doc, invoice) {
42
+ const root = doc.documentElement;
43
+ // Extract metadata if available
44
+ const metadata = invoice.metadata?.extensions;
45
+ // Update Customization ID to XRechnung 2.0
46
+ const customizationId = root.getElementsByTagName('cbc:CustomizationID')[0];
47
+ if (customizationId) {
48
+ customizationId.textContent = 'urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.0';
49
+ }
50
+ // Add or update Buyer Reference (required for XRechnung)
51
+ let buyerRef = root.getElementsByTagName('cbc:BuyerReference')[0];
52
+ const buyerReferenceValue = invoice.buyerReference || metadata?.businessReferences?.buyerReference || invoice.id;
53
+ if (!buyerRef) {
54
+ // Find where to insert it (after DocumentCurrencyCode)
55
+ const currencyCode = root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
56
+ if (currencyCode) {
57
+ buyerRef = doc.createElement('cbc:BuyerReference');
58
+ buyerRef.textContent = buyerReferenceValue;
59
+ currencyCode.parentNode.insertBefore(buyerRef, currencyCode.nextSibling);
60
+ }
61
+ }
62
+ else if (!buyerRef.textContent || buyerRef.textContent.trim() === '') {
63
+ buyerRef.textContent = buyerReferenceValue;
64
+ }
65
+ // Update payment terms to German
66
+ const paymentTermsNotes = root.getElementsByTagName('cac:PaymentTerms');
67
+ if (paymentTermsNotes.length > 0) {
68
+ const noteElement = paymentTermsNotes[0].getElementsByTagName('cbc:Note')[0];
69
+ if (noteElement && noteElement.textContent) {
70
+ noteElement.textContent = `Zahlung innerhalb von ${invoice.dueInDays || 30} Tagen`;
71
+ }
72
+ }
73
+ // Add electronic address for parties if available
74
+ this.addElectronicAddressToParty(doc, 'cac:AccountingSupplierParty', invoice.from);
75
+ this.addElectronicAddressToParty(doc, 'cac:AccountingCustomerParty', invoice.to);
76
+ // Ensure payment reference is set
77
+ const paymentMeans = root.getElementsByTagName('cac:PaymentMeans')[0];
78
+ if (paymentMeans) {
79
+ let paymentId = paymentMeans.getElementsByTagName('cbc:PaymentID')[0];
80
+ if (!paymentId) {
81
+ paymentId = doc.createElement('cbc:PaymentID');
82
+ paymentId.textContent = invoice.id;
83
+ paymentMeans.appendChild(paymentId);
84
+ }
85
+ }
86
+ // Add country code handling for German addresses
87
+ this.fixGermanCountryCodes(doc);
88
+ // Preserve business references from metadata
89
+ this.addBusinessReferences(doc, metadata?.businessReferences);
90
+ // Preserve payment information from metadata
91
+ this.enhancePaymentInformation(doc, metadata?.paymentInformation);
92
+ // Preserve date information from metadata
93
+ this.addDateInformation(doc, metadata?.dateInformation);
94
+ // Enhance party information with contact details
95
+ this.enhancePartyInformation(doc, invoice);
96
+ // Enhance line items with metadata
97
+ this.enhanceLineItems(doc, invoice);
98
+ }
99
+ /**
100
+ * Adds electronic address to party if not already present
101
+ * @param doc XML document
102
+ * @param partyType Party type selector
103
+ * @param party Party data
104
+ */
105
+ addElectronicAddressToParty(doc, partyType, party) {
106
+ const partyContainer = doc.getElementsByTagName(partyType)[0];
107
+ if (!partyContainer)
108
+ return;
109
+ const partyElement = partyContainer.getElementsByTagName('cac:Party')[0];
110
+ if (!partyElement)
111
+ return;
112
+ // Check if electronic address already exists
113
+ const existingEndpoint = partyElement.getElementsByTagName('cbc:EndpointID')[0];
114
+ if (!existingEndpoint && party.electronicAddress) {
115
+ // Add electronic address at the beginning of party element
116
+ const endpointNode = doc.createElement('cbc:EndpointID');
117
+ endpointNode.setAttribute('schemeID', party.electronicAddress.scheme || '0204');
118
+ endpointNode.textContent = party.electronicAddress.value;
119
+ // Insert as first child of party element
120
+ if (partyElement.firstChild) {
121
+ partyElement.insertBefore(endpointNode, partyElement.firstChild);
122
+ }
123
+ else {
124
+ partyElement.appendChild(endpointNode);
125
+ }
126
+ }
127
+ // Add GLN (Global Location Number) if available
128
+ if (party.gln && !existingEndpoint) {
129
+ const endpointNode = doc.createElement('cbc:EndpointID');
130
+ endpointNode.setAttribute('schemeID', '0088'); // GLN scheme ID
131
+ endpointNode.textContent = party.gln;
132
+ // Insert as first child of party element
133
+ if (partyElement.firstChild) {
134
+ partyElement.insertBefore(endpointNode, partyElement.firstChild);
135
+ }
136
+ else {
137
+ partyElement.appendChild(endpointNode);
138
+ }
139
+ }
140
+ // Add PartyIdentification for additional identifiers
141
+ if (party.additionalIdentifiers) {
142
+ for (const identifier of party.additionalIdentifiers) {
143
+ const partyId = doc.createElement('cac:PartyIdentification');
144
+ const id = doc.createElement('cbc:ID');
145
+ if (identifier.scheme) {
146
+ id.setAttribute('schemeID', identifier.scheme);
147
+ }
148
+ id.textContent = identifier.value;
149
+ partyId.appendChild(id);
150
+ // Insert after EndpointID or at beginning
151
+ const endpoint = partyElement.getElementsByTagName('cbc:EndpointID')[0];
152
+ if (endpoint && endpoint.nextSibling) {
153
+ partyElement.insertBefore(partyId, endpoint.nextSibling);
154
+ }
155
+ else if (partyElement.firstChild) {
156
+ partyElement.insertBefore(partyId, partyElement.firstChild);
157
+ }
158
+ else {
159
+ partyElement.appendChild(partyId);
160
+ }
161
+ }
162
+ }
163
+ // Add company registration number to PartyLegalEntity
164
+ if (party.registrationDetails?.registrationId) {
165
+ let legalEntity = partyElement.getElementsByTagName('cac:PartyLegalEntity')[0];
166
+ if (!legalEntity) {
167
+ legalEntity = doc.createElement('cac:PartyLegalEntity');
168
+ // Insert after PostalAddress
169
+ const postalAddress = partyElement.getElementsByTagName('cac:PostalAddress')[0];
170
+ if (postalAddress && postalAddress.nextSibling) {
171
+ partyElement.insertBefore(legalEntity, postalAddress.nextSibling);
172
+ }
173
+ else {
174
+ partyElement.appendChild(legalEntity);
175
+ }
176
+ }
177
+ // Add registration name if not present
178
+ if (!legalEntity.getElementsByTagName('cbc:RegistrationName')[0]) {
179
+ const regName = doc.createElement('cbc:RegistrationName');
180
+ regName.textContent = party.registrationDetails.registrationName || party.name;
181
+ legalEntity.appendChild(regName);
182
+ }
183
+ // Add company ID if not present
184
+ if (!legalEntity.getElementsByTagName('cbc:CompanyID')[0]) {
185
+ const companyId = doc.createElement('cbc:CompanyID');
186
+ companyId.textContent = party.registrationDetails.registrationId;
187
+ legalEntity.appendChild(companyId);
188
+ }
189
+ }
190
+ }
191
+ /**
192
+ * Fixes German country codes in the document
193
+ * @param doc XML document
194
+ */
195
+ fixGermanCountryCodes(doc) {
196
+ const countryNodes = doc.getElementsByTagName('cbc:IdentificationCode');
197
+ for (let i = 0; i < countryNodes.length; i++) {
198
+ const node = countryNodes[i];
199
+ if (node.textContent) {
200
+ const text = node.textContent.toLowerCase();
201
+ if (text === 'germany' || text === 'deutschland' || text === 'de') {
202
+ node.textContent = 'DE';
203
+ }
204
+ else if (text.length > 2) {
205
+ // Try to use first 2 characters as country code
206
+ node.textContent = text.substring(0, 2).toUpperCase();
207
+ }
208
+ }
209
+ }
210
+ }
211
+ /**
212
+ * Adds business references from metadata to the document
213
+ * @param doc XML document
214
+ * @param businessReferences Business references from metadata
215
+ */
216
+ addBusinessReferences(doc, businessReferences) {
217
+ if (!businessReferences)
218
+ return;
219
+ const root = doc.documentElement;
220
+ // Add OrderReference
221
+ if (businessReferences.orderReference && !root.getElementsByTagName('cac:OrderReference')[0]) {
222
+ const orderRef = doc.createElement('cac:OrderReference');
223
+ const orderId = doc.createElement('cbc:ID');
224
+ orderId.textContent = businessReferences.orderReference;
225
+ orderRef.appendChild(orderId);
226
+ // Insert after DocumentCurrencyCode
227
+ const currencyCode = root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
228
+ if (currencyCode && currencyCode.parentNode) {
229
+ currencyCode.parentNode.insertBefore(orderRef, currencyCode.nextSibling);
230
+ }
231
+ }
232
+ // Add ContractDocumentReference
233
+ if (businessReferences.contractReference && !root.getElementsByTagName('cac:ContractDocumentReference')[0]) {
234
+ const contractRef = doc.createElement('cac:ContractDocumentReference');
235
+ const contractId = doc.createElement('cbc:ID');
236
+ contractId.textContent = businessReferences.contractReference;
237
+ contractRef.appendChild(contractId);
238
+ // Insert after OrderReference or DocumentCurrencyCode
239
+ const orderRef = root.getElementsByTagName('cac:OrderReference')[0];
240
+ const insertAfter = orderRef || root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
241
+ if (insertAfter && insertAfter.parentNode) {
242
+ insertAfter.parentNode.insertBefore(contractRef, insertAfter.nextSibling);
243
+ }
244
+ }
245
+ // Add ProjectReference
246
+ if (businessReferences.projectReference && !root.getElementsByTagName('cac:ProjectReference')[0]) {
247
+ const projectRef = doc.createElement('cac:ProjectReference');
248
+ const projectId = doc.createElement('cbc:ID');
249
+ projectId.textContent = businessReferences.projectReference;
250
+ projectRef.appendChild(projectId);
251
+ // Insert after ContractDocumentReference or other refs
252
+ const contractRef = root.getElementsByTagName('cac:ContractDocumentReference')[0];
253
+ const orderRef = root.getElementsByTagName('cac:OrderReference')[0];
254
+ const insertAfter = contractRef || orderRef || root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
255
+ if (insertAfter && insertAfter.parentNode) {
256
+ insertAfter.parentNode.insertBefore(projectRef, insertAfter.nextSibling);
257
+ }
258
+ }
259
+ }
260
+ /**
261
+ * Enhances payment information from metadata
262
+ * @param doc XML document
263
+ * @param paymentInfo Payment information from metadata
264
+ */
265
+ enhancePaymentInformation(doc, paymentInfo) {
266
+ if (!paymentInfo)
267
+ return;
268
+ const root = doc.documentElement;
269
+ let paymentMeans = root.getElementsByTagName('cac:PaymentMeans')[0];
270
+ // Create PaymentMeans if it doesn't exist
271
+ if (!paymentMeans) {
272
+ paymentMeans = doc.createElement('cac:PaymentMeans');
273
+ // Insert before TaxTotal
274
+ const taxTotal = root.getElementsByTagName('cac:TaxTotal')[0];
275
+ if (taxTotal && taxTotal.parentNode) {
276
+ taxTotal.parentNode.insertBefore(paymentMeans, taxTotal);
277
+ }
278
+ }
279
+ // Add PaymentMeansCode
280
+ if (paymentInfo.paymentMeansCode && !paymentMeans.getElementsByTagName('cbc:PaymentMeansCode')[0]) {
281
+ const meansCode = doc.createElement('cbc:PaymentMeansCode');
282
+ meansCode.textContent = paymentInfo.paymentMeansCode;
283
+ paymentMeans.appendChild(meansCode);
284
+ }
285
+ // Add PaymentID
286
+ if (paymentInfo.paymentID && !paymentMeans.getElementsByTagName('cbc:PaymentID')[0]) {
287
+ const paymentId = doc.createElement('cbc:PaymentID');
288
+ paymentId.textContent = paymentInfo.paymentID;
289
+ paymentMeans.appendChild(paymentId);
290
+ }
291
+ // Add PaymentDueDate
292
+ if (paymentInfo.paymentDueDate && !paymentMeans.getElementsByTagName('cbc:PaymentDueDate')[0]) {
293
+ const dueDate = doc.createElement('cbc:PaymentDueDate');
294
+ dueDate.textContent = paymentInfo.paymentDueDate;
295
+ paymentMeans.appendChild(dueDate);
296
+ }
297
+ // Add IBAN and BIC
298
+ if (paymentInfo.iban || paymentInfo.bic) {
299
+ let payeeAccount = paymentMeans.getElementsByTagName('cac:PayeeFinancialAccount')[0];
300
+ if (!payeeAccount) {
301
+ payeeAccount = doc.createElement('cac:PayeeFinancialAccount');
302
+ paymentMeans.appendChild(payeeAccount);
303
+ }
304
+ // Add IBAN
305
+ if (paymentInfo.iban && !payeeAccount.getElementsByTagName('cbc:ID')[0]) {
306
+ const iban = doc.createElement('cbc:ID');
307
+ iban.textContent = paymentInfo.iban;
308
+ payeeAccount.appendChild(iban);
309
+ }
310
+ // Add account name (must come after ID but before FinancialInstitutionBranch)
311
+ if (paymentInfo.accountName && !payeeAccount.getElementsByTagName('cbc:Name')[0]) {
312
+ const accountName = doc.createElement('cbc:Name');
313
+ accountName.textContent = paymentInfo.accountName;
314
+ // Insert after ID but before FinancialInstitutionBranch
315
+ const id = payeeAccount.getElementsByTagName('cbc:ID')[0];
316
+ const finInstBranch = payeeAccount.getElementsByTagName('cac:FinancialInstitutionBranch')[0];
317
+ if (finInstBranch) {
318
+ payeeAccount.insertBefore(accountName, finInstBranch);
319
+ }
320
+ else if (id && id.nextSibling) {
321
+ payeeAccount.insertBefore(accountName, id.nextSibling);
322
+ }
323
+ else {
324
+ payeeAccount.appendChild(accountName);
325
+ }
326
+ }
327
+ // Add BIC and bank name
328
+ if (paymentInfo.bic || paymentInfo.bankName) {
329
+ let finInstBranch = payeeAccount.getElementsByTagName('cac:FinancialInstitutionBranch')[0];
330
+ if (!finInstBranch) {
331
+ finInstBranch = doc.createElement('cac:FinancialInstitutionBranch');
332
+ payeeAccount.appendChild(finInstBranch);
333
+ }
334
+ // Add BIC as branch ID
335
+ if (paymentInfo.bic && !finInstBranch.getElementsByTagName('cbc:ID')[0]) {
336
+ const bicElement = doc.createElement('cbc:ID');
337
+ bicElement.textContent = paymentInfo.bic;
338
+ finInstBranch.appendChild(bicElement);
339
+ }
340
+ // Add bank name
341
+ if (paymentInfo.bankName && !finInstBranch.getElementsByTagName('cbc:Name')[0]) {
342
+ const bankNameElement = doc.createElement('cbc:Name');
343
+ bankNameElement.textContent = paymentInfo.bankName;
344
+ finInstBranch.appendChild(bankNameElement);
345
+ }
346
+ }
347
+ }
348
+ // Add payment terms with discount if available
349
+ if (paymentInfo.paymentTermsNote && paymentInfo.paymentTermsNote.includes('early payment')) {
350
+ let paymentTerms = root.getElementsByTagName('cac:PaymentTerms')[0];
351
+ if (!paymentTerms) {
352
+ paymentTerms = doc.createElement('cac:PaymentTerms');
353
+ // Insert before PaymentMeans
354
+ const paymentMeans = root.getElementsByTagName('cac:PaymentMeans')[0];
355
+ if (paymentMeans && paymentMeans.parentNode) {
356
+ paymentMeans.parentNode.insertBefore(paymentTerms, paymentMeans);
357
+ }
358
+ }
359
+ // Update or add note
360
+ let note = paymentTerms.getElementsByTagName('cbc:Note')[0];
361
+ if (!note) {
362
+ note = doc.createElement('cbc:Note');
363
+ paymentTerms.appendChild(note);
364
+ }
365
+ note.textContent = paymentInfo.paymentTermsNote;
366
+ // Add discount percent if available
367
+ if (paymentInfo.discountPercent && !paymentTerms.getElementsByTagName('cbc:SettlementDiscountPercent')[0]) {
368
+ const discountElement = doc.createElement('cbc:SettlementDiscountPercent');
369
+ discountElement.textContent = paymentInfo.discountPercent;
370
+ paymentTerms.appendChild(discountElement);
371
+ }
372
+ }
373
+ }
374
+ /**
375
+ * Adds date information from metadata
376
+ * @param doc XML document
377
+ * @param dateInfo Date information from metadata
378
+ */
379
+ addDateInformation(doc, dateInfo) {
380
+ if (!dateInfo)
381
+ return;
382
+ const root = doc.documentElement;
383
+ // Add InvoicePeriod
384
+ if ((dateInfo.periodStart || dateInfo.periodEnd) && !root.getElementsByTagName('cac:InvoicePeriod')[0]) {
385
+ const invoicePeriod = doc.createElement('cac:InvoicePeriod');
386
+ if (dateInfo.periodStart) {
387
+ const startDate = doc.createElement('cbc:StartDate');
388
+ startDate.textContent = dateInfo.periodStart;
389
+ invoicePeriod.appendChild(startDate);
390
+ }
391
+ if (dateInfo.periodEnd) {
392
+ const endDate = doc.createElement('cbc:EndDate');
393
+ endDate.textContent = dateInfo.periodEnd;
394
+ invoicePeriod.appendChild(endDate);
395
+ }
396
+ // Insert after business references or DocumentCurrencyCode
397
+ const projectRef = root.getElementsByTagName('cac:ProjectReference')[0];
398
+ const contractRef = root.getElementsByTagName('cac:ContractDocumentReference')[0];
399
+ const orderRef = root.getElementsByTagName('cac:OrderReference')[0];
400
+ const insertAfter = projectRef || contractRef || orderRef || root.getElementsByTagName('cbc:DocumentCurrencyCode')[0];
401
+ if (insertAfter && insertAfter.parentNode) {
402
+ insertAfter.parentNode.insertBefore(invoicePeriod, insertAfter.nextSibling);
403
+ }
404
+ }
405
+ // Add Delivery with ActualDeliveryDate
406
+ if (dateInfo.deliveryDate && !root.getElementsByTagName('cac:Delivery')[0]) {
407
+ const delivery = doc.createElement('cac:Delivery');
408
+ const deliveryDate = doc.createElement('cbc:ActualDeliveryDate');
409
+ deliveryDate.textContent = dateInfo.deliveryDate;
410
+ delivery.appendChild(deliveryDate);
411
+ // Insert before PaymentMeans
412
+ const paymentMeans = root.getElementsByTagName('cac:PaymentMeans')[0];
413
+ if (paymentMeans && paymentMeans.parentNode) {
414
+ paymentMeans.parentNode.insertBefore(delivery, paymentMeans);
415
+ }
416
+ }
417
+ }
418
+ /**
419
+ * Enhances party information with contact details from metadata
420
+ * @param doc XML document
421
+ * @param invoice Invoice data
422
+ */
423
+ enhancePartyInformation(doc, invoice) {
424
+ // Enhance supplier party
425
+ this.addContactToParty(doc, 'cac:AccountingSupplierParty', invoice.from?.metadata?.contactInformation);
426
+ // Enhance customer party
427
+ this.addContactToParty(doc, 'cac:AccountingCustomerParty', invoice.to?.metadata?.contactInformation);
428
+ }
429
+ /**
430
+ * Adds contact information to a party
431
+ * @param doc XML document
432
+ * @param partySelector Party selector
433
+ * @param contactInfo Contact information from metadata
434
+ */
435
+ addContactToParty(doc, partySelector, contactInfo) {
436
+ if (!contactInfo)
437
+ return;
438
+ const partyContainer = doc.getElementsByTagName(partySelector)[0];
439
+ if (!partyContainer)
440
+ return;
441
+ const party = partyContainer.getElementsByTagName('cac:Party')[0];
442
+ if (!party)
443
+ return;
444
+ // Check if Contact already exists
445
+ let contact = party.getElementsByTagName('cac:Contact')[0];
446
+ if (!contact && (contactInfo.name || contactInfo.phone || contactInfo.email)) {
447
+ contact = doc.createElement('cac:Contact');
448
+ // Insert after PartyName
449
+ const partyName = party.getElementsByTagName('cac:PartyName')[0];
450
+ if (partyName && partyName.parentNode) {
451
+ partyName.parentNode.insertBefore(contact, partyName.nextSibling);
452
+ }
453
+ else {
454
+ party.appendChild(contact);
455
+ }
456
+ }
457
+ if (contact) {
458
+ // Add contact name
459
+ if (contactInfo.name && !contact.getElementsByTagName('cbc:Name')[0]) {
460
+ const name = doc.createElement('cbc:Name');
461
+ name.textContent = contactInfo.name;
462
+ contact.appendChild(name);
463
+ }
464
+ // Add telephone
465
+ if (contactInfo.phone && !contact.getElementsByTagName('cbc:Telephone')[0]) {
466
+ const phone = doc.createElement('cbc:Telephone');
467
+ phone.textContent = contactInfo.phone;
468
+ contact.appendChild(phone);
469
+ }
470
+ // Add email
471
+ if (contactInfo.email && !contact.getElementsByTagName('cbc:ElectronicMail')[0]) {
472
+ const email = doc.createElement('cbc:ElectronicMail');
473
+ email.textContent = contactInfo.email;
474
+ contact.appendChild(email);
475
+ }
476
+ }
477
+ }
478
+ /**
479
+ * Enhances line items with metadata
480
+ * @param doc XML document
481
+ * @param invoice Invoice data
482
+ */
483
+ enhanceLineItems(doc, invoice) {
484
+ const invoiceLines = doc.getElementsByTagName('cac:InvoiceLine');
485
+ for (let i = 0; i < invoiceLines.length && i < invoice.items.length; i++) {
486
+ const line = invoiceLines[i];
487
+ const item = invoice.items[i];
488
+ const itemMetadata = item.metadata;
489
+ if (!itemMetadata)
490
+ continue;
491
+ const itemElement = line.getElementsByTagName('cac:Item')[0];
492
+ if (!itemElement)
493
+ continue;
494
+ // Add item description
495
+ if (itemMetadata.description && !itemElement.getElementsByTagName('cbc:Description')[0]) {
496
+ const desc = doc.createElement('cbc:Description');
497
+ desc.textContent = itemMetadata.description;
498
+ // Insert before Name
499
+ const name = itemElement.getElementsByTagName('cbc:Name')[0];
500
+ if (name && name.parentNode) {
501
+ name.parentNode.insertBefore(desc, name);
502
+ }
503
+ else {
504
+ itemElement.appendChild(desc);
505
+ }
506
+ }
507
+ // Add SellersItemIdentification
508
+ if (itemMetadata.buyerItemID && !itemElement.getElementsByTagName('cac:SellersItemIdentification')[0]) {
509
+ const sellerId = doc.createElement('cac:SellersItemIdentification');
510
+ const id = doc.createElement('cbc:ID');
511
+ id.textContent = item.articleNumber || itemMetadata.buyerItemID;
512
+ sellerId.appendChild(id);
513
+ itemElement.appendChild(sellerId);
514
+ }
515
+ // Add BuyersItemIdentification
516
+ if (itemMetadata.buyerItemID && !itemElement.getElementsByTagName('cac:BuyersItemIdentification')[0]) {
517
+ const buyerId = doc.createElement('cac:BuyersItemIdentification');
518
+ const id = doc.createElement('cbc:ID');
519
+ id.textContent = itemMetadata.buyerItemID;
520
+ buyerId.appendChild(id);
521
+ itemElement.appendChild(buyerId);
522
+ }
523
+ // Add StandardItemIdentification
524
+ if (itemMetadata.standardItemID && !itemElement.getElementsByTagName('cac:StandardItemIdentification')[0]) {
525
+ const standardId = doc.createElement('cac:StandardItemIdentification');
526
+ const id = doc.createElement('cbc:ID');
527
+ id.textContent = itemMetadata.standardItemID;
528
+ standardId.appendChild(id);
529
+ itemElement.appendChild(standardId);
530
+ }
531
+ // Add CommodityClassification
532
+ if (itemMetadata.commodityClassification && !itemElement.getElementsByTagName('cac:CommodityClassification')[0]) {
533
+ const classification = doc.createElement('cac:CommodityClassification');
534
+ const code = doc.createElement('cbc:ItemClassificationCode');
535
+ code.textContent = itemMetadata.commodityClassification;
536
+ classification.appendChild(code);
537
+ itemElement.appendChild(classification);
538
+ }
539
+ // Add additional item properties
540
+ if (itemMetadata.additionalProperties) {
541
+ for (const [propName, propValue] of Object.entries(itemMetadata.additionalProperties)) {
542
+ const additionalProp = doc.createElement('cac:AdditionalItemProperty');
543
+ const nameElement = doc.createElement('cbc:Name');
544
+ nameElement.textContent = propName;
545
+ additionalProp.appendChild(nameElement);
546
+ const valueElement = doc.createElement('cbc:Value');
547
+ valueElement.textContent = propValue;
548
+ additionalProp.appendChild(valueElement);
549
+ itemElement.appendChild(additionalProp);
550
+ }
551
+ }
552
+ }
553
+ }
554
+ }
555
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJlY2hudW5nLmVuY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9mb3JtYXRzL3VibC94cmVjaG51bmcveHJlY2hudW5nLmVuY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFVBQVU7SUFDOUM7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUF1QjtRQUN0RCw2QkFBNkI7UUFDN0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFekQsaUNBQWlDO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsVUFBaUMsQ0FBQyxDQUFDO1FBRTFFLDJCQUEyQjtRQUMzQixPQUFPLElBQUksYUFBYSxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQXFCO1FBQ25ELDZCQUE2QjtRQUM3QixNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkQsaUNBQWlDO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsU0FBZ0MsQ0FBQyxDQUFDO1FBRXpFLDJCQUEyQjtRQUMzQixPQUFPLElBQUksYUFBYSxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw0QkFBNEIsQ0FBQyxHQUFhLEVBQUUsT0FBaUI7UUFDbkUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUVqQyxnQ0FBZ0M7UUFDaEMsTUFBTSxRQUFRLEdBQUksT0FBZSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7UUFFdkQsMkNBQTJDO1FBQzNDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsZUFBZSxDQUFDLFdBQVcsR0FBRyw0RUFBNEUsQ0FBQztRQUM3RyxDQUFDO1FBRUQseURBQXlEO1FBQ3pELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sbUJBQW1CLEdBQUksT0FBZSxDQUFDLGNBQWMsSUFBSSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDMUgsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsdURBQXVEO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ25ELFFBQVEsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7Z0JBQzNDLFlBQVksQ0FBQyxVQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUUsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3ZFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7UUFDN0MsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hFLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDM0MsV0FBVyxDQUFDLFdBQVcsR0FBRyx5QkFBeUIsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLFFBQVEsQ0FBQztZQUNyRixDQUFDO1FBQ0gsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLDZCQUE2QixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLDZCQUE2QixFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVqRixrQ0FBa0M7UUFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMvQyxTQUFTLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRCxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhDLDZDQUE2QztRQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRTlELDZDQUE2QztRQUM3QyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRWxFLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUV4RCxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUzQyxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSywyQkFBMkIsQ0FBQyxHQUFhLEVBQUUsU0FBaUIsRUFBRSxLQUFVO1FBQzlFLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFFNUIsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUUxQiw2Q0FBNkM7UUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakQsMkRBQTJEO1lBQzNELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RCxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDO1lBQ2hGLFlBQVksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztZQUV6RCx5Q0FBeUM7WUFDekMsSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVCLFlBQVksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNuRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25DLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RCxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtZQUMvRCxZQUFZLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFFckMseUNBQXlDO1lBQ3pDLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM1QixZQUFZLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUM7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNoQyxLQUFLLE1BQU0sVUFBVSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7Z0JBQzdELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN0QixFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsRUFBRSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUNsQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUV4QiwwQ0FBMEM7Z0JBQzFDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3JDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztxQkFBTSxJQUFJLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbkMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksS0FBSyxDQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQzlDLElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsV0FBVyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDeEQsNkJBQTZCO2dCQUM3QixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEYsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUMvQyxZQUFZLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0gsQ0FBQztZQUVELHVDQUF1QztZQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUMvRSxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNyRCxTQUFTLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUM7Z0JBQ2pFLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0sscUJBQXFCLENBQUMsR0FBYTtRQUN6QyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN4RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNsRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDMUIsQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLGdEQUFnRDtvQkFDaEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDeEQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxxQkFBcUIsQ0FBQyxHQUFhLEVBQUUsa0JBQXdCO1FBQ25FLElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPO1FBRWhDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFFakMscUJBQXFCO1FBQ3JCLElBQUksa0JBQWtCLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDekQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxPQUFPLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQztZQUN4RCxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTlCLG9DQUFvQztZQUNwQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0UsQ0FBQztRQUNILENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxrQkFBa0IsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0csTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsVUFBVSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQztZQUM5RCxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXBDLHNEQUFzRDtZQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxNQUFNLFdBQVcsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekYsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyxXQUFXLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVFLENBQUM7UUFDSCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksa0JBQWtCLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pHLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM3RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUM7WUFDNUQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVsQyx1REFBdUQ7WUFDdkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsTUFBTSxXQUFXLEdBQUcsV0FBVyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RyxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0UsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHlCQUF5QixDQUFDLEdBQWEsRUFBRSxXQUFpQjtRQUNoRSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFFekIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNqQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwRSwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLFlBQVksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDckQseUJBQXlCO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEcsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzVELFNBQVMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1lBQ3JELFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixJQUFJLFdBQVcsQ0FBQyxTQUFTLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JELFNBQVMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztZQUM5QyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxXQUFXLENBQUMsY0FBYyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEQsT0FBTyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDO1lBQ2pELFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLElBQUksWUFBWSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDOUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBRUQsV0FBVztZQUNYLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUVELDhFQUE4RTtZQUM5RSxJQUFJLFdBQVcsQ0FBQyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDakYsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDbEQsV0FBVyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO2dCQUNsRCx3REFBd0Q7Z0JBQ3hELE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdGLElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ2xCLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUN4RCxDQUFDO3FCQUFNLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDaEMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztZQUNILENBQUM7WUFFRCx3QkFBd0I7WUFDeEIsSUFBSSxXQUFXLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDbkIsYUFBYSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztvQkFDcEUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztnQkFFRCx1QkFBdUI7Z0JBQ3ZCLElBQUksV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMvQyxVQUFVLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUM7b0JBQ3pDLGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7Z0JBRUQsZ0JBQWdCO2dCQUNoQixJQUFJLFdBQVcsQ0FBQyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDL0UsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDdEQsZUFBZSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO29CQUNuRCxhQUFhLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLElBQUksV0FBVyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzNGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDckQsNkJBQTZCO2dCQUM3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUM1QyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ25FLENBQUM7WUFDSCxDQUFDO1lBRUQscUJBQXFCO1lBQ3JCLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3JDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1lBRWhELG9DQUFvQztZQUNwQyxJQUFJLFdBQVcsQ0FBQyxlQUFlLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMxRyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLCtCQUErQixDQUFDLENBQUM7Z0JBQzNFLGVBQWUsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQztnQkFDMUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsR0FBYSxFQUFFLFFBQWM7UUFDdEQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRXRCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFFakMsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkcsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRTdELElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN6QixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNyRCxTQUFTLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQzdDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pDLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUVELDJEQUEyRDtZQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxNQUFNLFdBQVcsR0FBRyxVQUFVLElBQUksV0FBVyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0SCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUUsQ0FBQztRQUNILENBQUM7UUFFRCx1Q0FBdUM7UUFDdkMsSUFBSSxRQUFRLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0UsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDakUsWUFBWSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQ2pELFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFbkMsNkJBQTZCO1lBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDNUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9ELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx1QkFBdUIsQ0FBQyxHQUFhLEVBQUUsT0FBaUI7UUFDOUQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLEVBQUcsT0FBTyxDQUFDLElBQVksRUFBRSxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUVoSCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSw2QkFBNkIsRUFBRyxPQUFPLENBQUMsRUFBVSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGlCQUFpQixDQUFDLEdBQWEsRUFBRSxhQUFxQixFQUFFLFdBQWlCO1FBQy9FLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUV6QixNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPO1FBRTVCLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsa0NBQWtDO1FBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdFLE9BQU8sR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTNDLHlCQUF5QjtZQUN6QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0QyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLG1CQUFtQjtZQUNuQixJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFFRCxnQkFBZ0I7WUFDaEIsSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2pELEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDdEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBRUQsWUFBWTtZQUNaLElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDdEQsS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO2dCQUN0QyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxHQUFhLEVBQUUsT0FBaUI7UUFDdkQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFakUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekUsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxZQUFZLEdBQUksSUFBWSxDQUFDLFFBQVEsQ0FBQztZQUU1QyxJQUFJLENBQUMsWUFBWTtnQkFBRSxTQUFTO1lBRTVCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsV0FBVztnQkFBRSxTQUFTO1lBRTNCLHVCQUF1QjtZQUN2QixJQUFJLFlBQVksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQztnQkFDNUMscUJBQXFCO2dCQUNyQixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEMsQ0FBQztZQUNILENBQUM7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBSSxZQUFZLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdEcsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQztnQkFDaEUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBRUQsK0JBQStCO1lBQy9CLElBQUksWUFBWSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JHLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsOEJBQThCLENBQUMsQ0FBQztnQkFDbEUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkMsRUFBRSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO2dCQUMxQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QixXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxpQ0FBaUM7WUFDakMsSUFBSSxZQUFZLENBQUMsY0FBYyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUcsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2dCQUN2RSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxFQUFFLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUM7Z0JBQzdDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNCLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUVELDhCQUE4QjtZQUM5QixJQUFJLFlBQVksQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hILE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsNkJBQTZCLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztnQkFDeEQsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBRUQsaUNBQWlDO1lBQ2pDLElBQUksWUFBWSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3RDLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7b0JBQ3RGLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsQ0FBQztvQkFFdkUsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDbEQsV0FBVyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7b0JBQ25DLGNBQWMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBRXhDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3BELFlBQVksQ0FBQyxXQUFXLEdBQUcsU0FBbUIsQ0FBQztvQkFDL0MsY0FBYyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFFekMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
@@ -0,0 +1,15 @@
1
+ import { EN16931UBLValidator } from './en16931.ubl.validator.js';
2
+ /**
3
+ * XRechnung-specific validator that extends EN16931 validation
4
+ * Implements additional German CIUS (Core Invoice Usage Specification) rules
5
+ */
6
+ export declare class XRechnungValidator extends EN16931UBLValidator {
7
+ /**
8
+ * Validates XRechnung-specific structure requirements
9
+ */
10
+ protected validateStructure(): boolean;
11
+ /**
12
+ * Validates XRechnung-specific business rules
13
+ */
14
+ protected validateBusinessRules(): boolean;
15
+ }