@fin.cx/opendata 3.6.0 → 4.0.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 (78) hide show
  1. package/.smartconfig.json +20 -20
  2. package/dist_ts/00_commitinfo_data.js +3 -3
  3. package/dist_ts/handelsregister/classes.handelsregisterclient.d.ts +64 -0
  4. package/dist_ts/handelsregister/classes.handelsregisterclient.js +397 -0
  5. package/dist_ts/handelsregister/classes.handelsregistererror.d.ts +56 -0
  6. package/dist_ts/handelsregister/classes.handelsregistererror.js +37 -0
  7. package/dist_ts/handelsregister/classes.portalsession.d.ts +46 -0
  8. package/dist_ts/handelsregister/classes.portalsession.js +160 -0
  9. package/dist_ts/handelsregister/classes.slidingwindowgate.d.ts +32 -0
  10. package/dist_ts/handelsregister/classes.slidingwindowgate.js +55 -0
  11. package/dist_ts/handelsregister/constants.d.ts +13 -0
  12. package/dist_ts/handelsregister/constants.js +19 -0
  13. package/dist_ts/handelsregister/data.codelists.d.ts +29 -0
  14. package/dist_ts/handelsregister/data.codelists.js +616 -0
  15. package/dist_ts/handelsregister/forms.d.ts +27 -0
  16. package/dist_ts/handelsregister/forms.js +77 -0
  17. package/dist_ts/handelsregister/html.d.ts +26 -0
  18. package/dist_ts/handelsregister/html.js +82 -0
  19. package/dist_ts/handelsregister/index.d.ts +9 -0
  20. package/dist_ts/handelsregister/index.js +10 -0
  21. package/dist_ts/handelsregister/interfaces.d.ts +240 -0
  22. package/dist_ts/handelsregister/interfaces.js +2 -0
  23. package/dist_ts/handelsregister/parse.searchresults.d.ts +35 -0
  24. package/dist_ts/handelsregister/parse.searchresults.js +175 -0
  25. package/dist_ts/handelsregister/parse.structuredcontent.d.ts +6 -0
  26. package/dist_ts/handelsregister/parse.structuredcontent.js +306 -0
  27. package/dist_ts/handelsregister/plugins.d.ts +4 -0
  28. package/dist_ts/handelsregister/plugins.js +8 -0
  29. package/dist_ts/handelsregister/references.d.ts +34 -0
  30. package/dist_ts/handelsregister/references.js +76 -0
  31. package/dist_ts/index.d.ts +0 -2
  32. package/dist_ts/index.js +1 -3
  33. package/dist_ts/plugins.d.ts +2 -20
  34. package/dist_ts/plugins.js +3 -22
  35. package/package.json +33 -37
  36. package/readme.md +159 -126
  37. package/ts/00_commitinfo_data.ts +2 -2
  38. package/ts/handelsregister/classes.handelsregisterclient.ts +474 -0
  39. package/ts/handelsregister/classes.handelsregistererror.ts +82 -0
  40. package/ts/handelsregister/classes.portalsession.ts +191 -0
  41. package/ts/handelsregister/classes.slidingwindowgate.ts +74 -0
  42. package/ts/handelsregister/constants.ts +30 -0
  43. package/ts/handelsregister/data.codelists.ts +640 -0
  44. package/ts/handelsregister/forms.ts +99 -0
  45. package/ts/handelsregister/html.ts +113 -0
  46. package/ts/handelsregister/index.ts +27 -0
  47. package/ts/handelsregister/interfaces.ts +272 -0
  48. package/ts/handelsregister/parse.searchresults.ts +241 -0
  49. package/ts/handelsregister/parse.structuredcontent.ts +338 -0
  50. package/ts/handelsregister/plugins.ts +15 -0
  51. package/ts/handelsregister/references.ts +115 -0
  52. package/ts/index.ts +0 -2
  53. package/ts/plugins.ts +0 -39
  54. package/dist_ts/classes.businessrecord.d.ts +0 -38
  55. package/dist_ts/classes.businessrecord.js +0 -90
  56. package/dist_ts/classes.handelsregister.d.ts +0 -134
  57. package/dist_ts/classes.handelsregister.js +0 -307
  58. package/dist_ts/classes.jsonldata.d.ts +0 -43
  59. package/dist_ts/classes.jsonldata.js +0 -68
  60. package/dist_ts/classes.main.opendata.d.ts +0 -25
  61. package/dist_ts/classes.main.opendata.js +0 -91
  62. package/dist_ts/laws/classes.lawrecord.d.ts +0 -24
  63. package/dist_ts/laws/classes.lawrecord.js +0 -181
  64. package/dist_ts/laws/classes.lawservice.d.ts +0 -52
  65. package/dist_ts/laws/classes.lawservice.js +0 -740
  66. package/dist_ts/laws/index.d.ts +0 -3
  67. package/dist_ts/laws/index.js +0 -4
  68. package/dist_ts/laws/interfaces.law.d.ts +0 -35
  69. package/dist_ts/laws/interfaces.law.js +0 -2
  70. package/readme.hints.md +0 -89
  71. package/ts/classes.businessrecord.ts +0 -67
  72. package/ts/classes.handelsregister.ts +0 -385
  73. package/ts/classes.jsonldata.ts +0 -114
  74. package/ts/classes.main.opendata.ts +0 -120
  75. package/ts/laws/classes.lawrecord.ts +0 -81
  76. package/ts/laws/classes.lawservice.ts +0 -1010
  77. package/ts/laws/index.ts +0 -3
  78. package/ts/laws/interfaces.law.ts +0 -48
@@ -1,307 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- /**
3
- * the HandlesRegister exposed as a class
4
- */
5
- export class HandelsRegister {
6
- openDataRef;
7
- asyncExecutionStack = new plugins.lik.AsyncExecutionStack();
8
- downloadDir;
9
- uniqueDowloadFolder;
10
- // Puppeteer wrapper instance
11
- smartbrowserInstance = new plugins.smartbrowser.SmartBrowser();
12
- constructor(openDataRef, downloadDirArg) {
13
- this.openDataRef = openDataRef;
14
- this.downloadDir = downloadDirArg;
15
- this.uniqueDowloadFolder = plugins.path.join(this.downloadDir, plugins.smartunique.uniSimple());
16
- }
17
- async resetDownloadFolder() {
18
- await plugins.smartfs.directory(this.uniqueDowloadFolder).recursive().delete().catch(() => { });
19
- await plugins.smartfs.directory(this.uniqueDowloadFolder).create();
20
- }
21
- async waitForDownloadedFile() {
22
- for (let attempt = 0; attempt < 120; attempt++) {
23
- const directoryEntries = await plugins.fs.readdir(this.uniqueDowloadFolder);
24
- const fileName = directoryEntries.find((entry) => !entry.endsWith('.crdownload') && !entry.endsWith('.tmp'));
25
- if (fileName) {
26
- const filePath = plugins.path.join(this.uniqueDowloadFolder, fileName);
27
- const firstStat = await plugins.fs.stat(filePath);
28
- await plugins.smartdelay.delayFor(500);
29
- const secondStat = await plugins.fs.stat(filePath);
30
- if (firstStat.size === secondStat.size) {
31
- return filePath;
32
- }
33
- }
34
- await plugins.smartdelay.delayFor(500);
35
- }
36
- throw new Error('Timed out while waiting for the download to finish.');
37
- }
38
- async start() {
39
- // Start the browser
40
- await this.resetDownloadFolder();
41
- await this.smartbrowserInstance.start();
42
- }
43
- async stop() {
44
- // Stop the browser
45
- await plugins.smartfs.directory(this.uniqueDowloadFolder).recursive().delete();
46
- await this.smartbrowserInstance.stop();
47
- }
48
- /**
49
- * Creates a new page and configures it to allow file downloads
50
- * to a predefined path.
51
- */
52
- getNewPage = async () => {
53
- const page = await this.smartbrowserInstance.headlessBrowser.newPage();
54
- // 1) Create a DevTools session for this page
55
- const cdpSession = await page.target().createCDPSession();
56
- // 2) Allow file downloads and set the download path
57
- await cdpSession.send('Page.setDownloadBehavior', {
58
- behavior: 'allow',
59
- downloadPath: this.uniqueDowloadFolder, // <-- Change this to your desired absolute path
60
- });
61
- // Optionally set viewport and go to page
62
- await page.setViewport({ width: 1920, height: 1080 });
63
- await page.goto('https://www.handelsregister.de/');
64
- return page;
65
- };
66
- navigateToPage = async (pageArg, pageNameArg) => {
67
- try {
68
- await pageArg.evaluate((pageNameArg2) => {
69
- const elements = Array.from(document.querySelectorAll('.ui-menuitem-text > span'));
70
- const targetElement = elements.find((el) => el.textContent?.trim() === pageNameArg2);
71
- if (targetElement) {
72
- targetElement.click();
73
- }
74
- }, pageNameArg);
75
- console.log(`Navigated to the ${pageNameArg} page successfully.`);
76
- }
77
- catch (error) {
78
- console.error(`Failed to navigate to the ${pageNameArg} page:`, error);
79
- }
80
- };
81
- waitForResults = async (pageArg) => {
82
- await pageArg
83
- .waitForSelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data', {
84
- timeout: 30000,
85
- })
86
- .catch(async (err) => {
87
- await pageArg.screenshot({ path: `${this.downloadDir}/error.png` });
88
- throw err;
89
- });
90
- const businessRecords = await pageArg.evaluate(() => {
91
- const rows = document.querySelectorAll('#ergebnissForm\\:selectedSuchErgebnisFormTable_data > tr');
92
- const records = [];
93
- rows.forEach((row) => {
94
- const nameElement = row.querySelector('td.ui-panelgrid-cell span.marginLeft20');
95
- const cityElement = row.querySelector('td.ui-panelgrid-cell.sitzSuchErgebnisse span');
96
- const statusElement = row.querySelector('td.ui-panelgrid-cell span.verticalText');
97
- const registrationCourtElement = row.querySelector('td.ui-panelgrid-cell.fontTableNameSize');
98
- const name = nameElement?.textContent?.trim();
99
- const city = cityElement?.textContent?.trim();
100
- const status = statusElement?.textContent?.trim();
101
- const registrationId = registrationCourtElement?.textContent?.trim();
102
- // Push parsed data into records array
103
- records.push({
104
- name,
105
- city,
106
- registrationId,
107
- businessType: status,
108
- });
109
- });
110
- return records;
111
- });
112
- return businessRecords;
113
- };
114
- clickFindButton = async (pageArg, resultsLimitArg = 100) => {
115
- try {
116
- // Wait for the button with the text "Find" to appear
117
- await pageArg.waitForSelector('span.ui-button-text.ui-c', { timeout: 5000 });
118
- // adjust to 100 results per page
119
- await pageArg.select('#form\\:ergebnisseProSeite_input', `${resultsLimitArg}`);
120
- // Locate and click the button using its text
121
- await pageArg.evaluate(() => {
122
- const buttons = Array.from(document.querySelectorAll('span.ui-button-text.ui-c'));
123
- const targetButton = buttons.find((button) => button.textContent?.trim() === 'Find');
124
- if (targetButton) {
125
- const parentButton = targetButton.closest('button') || targetButton;
126
- parentButton.click();
127
- }
128
- });
129
- console.log('Find button clicked successfully!');
130
- }
131
- catch (error) {
132
- console.error('Failed to find or click the "Find" button:', error);
133
- }
134
- };
135
- async downloadFile(pageArg, typeArg) {
136
- // Trigger the file download by clicking on the relevant link
137
- await pageArg.evaluate((typeArg2) => {
138
- // Locate the table body
139
- const tableBody = document.querySelector('#ergebnissForm\\:selectedSuchErgebnisFormTable_data');
140
- if (!tableBody) {
141
- throw new Error('Table body not found');
142
- }
143
- // Locate the first row
144
- const firstRow = tableBody.querySelector('tr:nth-child(1)');
145
- if (!firstRow) {
146
- throw new Error('First row not found');
147
- }
148
- // Locate the last cell in the first row
149
- const lastCell = firstRow.querySelector('td:last-child');
150
- if (!lastCell) {
151
- throw new Error('Last cell not found in the first row');
152
- }
153
- // Locate the download links
154
- const adLink = lastCell.querySelector('a:first-of-type');
155
- const siLink = lastCell.querySelector('a:last-of-type');
156
- if (!siLink) {
157
- throw new Error('SI link not found in the last cell');
158
- }
159
- // Simulate a click on the last <a> element
160
- switch (typeArg2) {
161
- case 'AD':
162
- adLink.click();
163
- break;
164
- case 'SI':
165
- siLink.click();
166
- break;
167
- default:
168
- throw new Error('Invalid file type');
169
- }
170
- }, typeArg);
171
- const downloadedFilePath = await this.waitForDownloadedFile();
172
- const renamedFilePath = plugins.path.join(this.uniqueDowloadFolder, typeArg === 'AD' ? 'ad.pdf' : 'si.xml');
173
- await plugins.fs.rename(downloadedFilePath, renamedFilePath);
174
- const file = await plugins.smartfileFactory.fromFilePath(renamedFilePath);
175
- // Keep the download folder empty between requests.
176
- await this.resetDownloadFolder();
177
- return file;
178
- }
179
- /**
180
- * Helper method to parse the German registration string
181
- */
182
- async parseGermanRegistration(input) {
183
- // e.g. District court Berlin (Charlottenburg) HRB 123456
184
- const regex = /District court (\p{L}[\p{L}\s-]*?(?:\s*\([\p{L}\s-]+\))?)\s+(HRA|HRB|GnR|VR|PR|GsR)\s+(\d+)/u;
185
- const match = input.match(regex);
186
- if (match) {
187
- return {
188
- court: match[1],
189
- type: match[2], // Adjust if needed
190
- number: match[3],
191
- };
192
- }
193
- }
194
- /**
195
- * Search for a company by name and return basic info
196
- */
197
- async searchCompany(companyNameArg, resultsLimitArg = 100) {
198
- return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
199
- const page = await this.getNewPage();
200
- await this.navigateToPage(page, 'Normal search');
201
- try {
202
- // Wait for the textarea to appear
203
- await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
204
- // Enter text into the textarea
205
- const inputText = companyNameArg;
206
- await page.evaluate((text) => {
207
- const textarea = document.querySelector('#form\\:schlagwoerter');
208
- if (textarea) {
209
- textarea.value = text; // Set the value
210
- // Trigger the change event manually if required
211
- const event = new Event('change', { bubbles: true });
212
- textarea.dispatchEvent(event);
213
- }
214
- }, inputText);
215
- console.log('Text entered successfully!');
216
- }
217
- catch (error) {
218
- console.error('Failed to find or enter text into the textarea:', error);
219
- }
220
- try {
221
- // Wait for the radio button's label to appear
222
- await page.waitForSelector('label[for="form:schlagwortOptionen:0"]', { timeout: 5000 });
223
- // Click the label to select the radio button
224
- await page.evaluate(() => {
225
- const label = document.querySelector('label[for="form:schlagwortOptionen:0"]');
226
- if (label) {
227
- label.click();
228
- }
229
- });
230
- console.log('Radio button clicked successfully!');
231
- }
232
- catch (error) {
233
- console.error('Failed to find or click the radio button:', error);
234
- }
235
- await this.clickFindButton(page, resultsLimitArg);
236
- const businessRecords = await this.waitForResults(page);
237
- // Parse out the registration info
238
- for (const record of businessRecords) {
239
- if (record.registrationId) {
240
- record.germanParsedRegistration = await this.parseGermanRegistration(record.registrationId);
241
- }
242
- }
243
- await page.close();
244
- return businessRecords;
245
- }, 60000);
246
- }
247
- /**
248
- * Search for a specific company (known register type/number/court),
249
- * then click on an element that triggers a file download.
250
- */
251
- async getSpecificCompany(companyArg) {
252
- return this.asyncExecutionStack.getExclusiveExecutionSlot(async () => {
253
- if (!companyArg?.type || !companyArg.number || !companyArg.court) {
254
- throw new Error('A complete parsed German registration is required.');
255
- }
256
- const page = await this.getNewPage();
257
- await this.navigateToPage(page, 'Normal search');
258
- await page.waitForSelector('#form\\:schlagwoerter', { timeout: 5000 });
259
- // 1) Type of Register (e.g. HRB, HRA, etc.)
260
- await page.waitForSelector('#form\\:registerArt_label');
261
- await page.click('#form\\:registerArt_label');
262
- await page.waitForSelector('#form\\:registerArt_items');
263
- await page.evaluate((type) => {
264
- const options = Array.from(document.querySelectorAll('#form\\:registerArt_items li'));
265
- const targetOption = options.find((option) => option.textContent?.trim() === type);
266
- targetOption?.click();
267
- }, companyArg.type);
268
- // 2) Register number
269
- await page.waitForSelector('#form\\:registerNummer');
270
- await page.type('#form\\:registerNummer', companyArg.number);
271
- // 3) Register court
272
- await page.waitForSelector('#form\\:registergericht_label');
273
- await page.click('#form\\:registergericht_label');
274
- await page.waitForSelector('#form\\:registergericht_items');
275
- await page.evaluate((court) => {
276
- const options = Array.from(document.querySelectorAll('#form\\:registergericht_items li'));
277
- const targetOption = options.find((option) => option.textContent?.trim() === court);
278
- targetOption?.click();
279
- }, companyArg.court);
280
- // Click 'Find'
281
- await this.clickFindButton(page);
282
- // Optionally grab the results, just for logging
283
- const businessRecords = await this.waitForResults(page);
284
- console.log(businessRecords);
285
- const files = [];
286
- // download files
287
- files.push(await this.downloadFile(page, 'SI'));
288
- files.push(await this.downloadFile(page, 'AD'));
289
- // At this point, the file should have been downloaded automatically
290
- // to the path specified by `Page.setDownloadBehavior`
291
- await page.close();
292
- return {
293
- businessRecords,
294
- files,
295
- };
296
- }, 60000);
297
- }
298
- /**
299
- * get specific company by full name
300
- */
301
- async getSpecificCompanyByName(companyNameArg) {
302
- const businessRecords = await this.searchCompany(companyNameArg, 1);
303
- const result = this.getSpecificCompany(businessRecords[0].germanParsedRegistration);
304
- return result;
305
- }
306
- }
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kZWxzcmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmhhbmRlbHNyZWdpc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBQ2xCLFdBQVcsQ0FBVztJQUN0QixtQkFBbUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM1RCxXQUFXLENBQVM7SUFDcEIsbUJBQW1CLENBQVM7SUFFcEMsNkJBQTZCO0lBQ3RCLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV0RSxZQUFZLFdBQXFCLEVBQUUsY0FBc0I7UUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CO1FBQy9CLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9GLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckUsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUI7UUFDakMsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUM1RSxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQ3BDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUNyRSxDQUFDO1lBRUYsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZFLE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRW5ELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3ZDLE9BQU8sUUFBUSxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsb0JBQW9CO1FBQ3BCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsbUJBQW1CO1FBQ25CLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0UsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVUsR0FBRyxLQUFLLElBQUksRUFBRTtRQUM3QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFdkUsNkNBQTZDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFMUQsb0RBQW9EO1FBQ3BELE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUNoRCxRQUFRLEVBQUUsT0FBTztZQUNqQixZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGdEQUFnRDtTQUN6RixDQUFDLENBQUM7UUFFSCx5Q0FBeUM7UUFDekMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVNLGNBQWMsR0FBRyxLQUFLLEVBQzVCLE9BQTJELEVBQzNELFdBQW1CLEVBQ25CLEVBQUU7UUFDRixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtnQkFDdEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLFlBQVksQ0FBQyxDQUFDO2dCQUNyRixJQUFJLGFBQWEsRUFBRSxDQUFDO29CQUNqQixhQUE2QixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QyxDQUFDO1lBQ0gsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLFdBQVcscUJBQXFCLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLFdBQVcsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFTSxjQUFjLEdBQUcsS0FBSyxFQUFFLE9BQTJELEVBQUUsRUFBRTtRQUM3RixNQUFNLE9BQU87YUFDVixlQUFlLENBQUMscURBQXFELEVBQUU7WUFDdEUsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO2FBQ0QsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNuQixNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxZQUErQixFQUFFLENBQUMsQ0FBQztZQUN2RixNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO1FBRUwsTUFBTSxlQUFlLEdBQTZCLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDNUUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUNwQywwREFBMEQsQ0FDM0QsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUE2QixFQUFFLENBQUM7WUFFN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNuQixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7Z0JBQ2hGLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsOENBQThDLENBQUMsQ0FBQztnQkFDdEYsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO2dCQUNsRixNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQ2hELHdDQUF3QyxDQUN6QyxDQUFDO2dCQUVGLE1BQU0sSUFBSSxHQUFHLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sSUFBSSxHQUFHLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sY0FBYyxHQUFHLHdCQUF3QixFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFFckUsc0NBQXNDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLElBQUk7b0JBQ0osSUFBSTtvQkFDSixjQUFjO29CQUNkLFlBQVksRUFBRSxNQUFNO2lCQUNyQixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQyxDQUFDO0lBRU0sZUFBZSxHQUFHLEtBQUssRUFBRSxPQUEyRCxFQUFFLGtCQUEwQixHQUFHLEVBQUUsRUFBRTtRQUM3SCxJQUFJLENBQUM7WUFDSCxxREFBcUQ7WUFDckQsTUFBTSxPQUFPLENBQUMsZUFBZSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFN0UsaUNBQWlDO1lBQ2pDLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFDLENBQUM7WUFFL0UsNkNBQTZDO1lBQzdDLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQzFCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztnQkFDbEYsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztnQkFDckYsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxZQUFZLENBQUM7b0JBQ25FLFlBQTRCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNENBQTRDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQ3hCLE9BQTJELEVBQzNELE9BQW9CO1FBRXBCLDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNsQyx3QkFBd0I7WUFDeEIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FDdEMscURBQXFELENBQ3RELENBQUM7WUFDRixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFFRCx1QkFBdUI7WUFDdkIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDekMsQ0FBQztZQUVELHdDQUF3QztZQUN4QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUVELDRCQUE0QjtZQUM1QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUVELDJDQUEyQztZQUMzQyxRQUFRLFFBQVEsRUFBRSxDQUFDO2dCQUNqQixLQUFLLElBQUk7b0JBQ04sTUFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDaEMsTUFBTTtnQkFDUixLQUFLLElBQUk7b0JBQ04sTUFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDaEMsTUFBTTtnQkFDUjtvQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNaLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM5RCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUN4QixPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FDdkMsQ0FBQztRQUNGLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTFFLG1EQUFtRDtRQUNuRCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHVCQUF1QixDQUNuQyxLQUFhO1FBRWIseURBQXlEO1FBQ3pELE1BQU0sS0FBSyxHQUNULDhGQUE4RixDQUFDO1FBQ2pHLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQWtCLEVBQUUsbUJBQW1CO2dCQUNwRCxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNqQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBc0IsRUFBRSxrQkFBMEIsR0FBRztRQUM5RSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNuRSxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRWpELElBQUksQ0FBQztnQkFDSCxrQ0FBa0M7Z0JBQ2xDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUV2RSwrQkFBK0I7Z0JBQy9CLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQztnQkFDakMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQzNCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQXNCLHVCQUF1QixDQUFDLENBQUM7b0JBQ3RGLElBQUksUUFBUSxFQUFFLENBQUM7d0JBQ2IsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0I7d0JBQ3ZDLGdEQUFnRDt3QkFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ3JELFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hDLENBQUM7Z0JBQ0gsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUVkLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGlEQUFpRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFFRCxJQUFJLENBQUM7Z0JBQ0gsOENBQThDO2dCQUM5QyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsd0NBQXdDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFeEYsNkNBQTZDO2dCQUM3QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFO29CQUN2QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUNsQyx3Q0FBd0MsQ0FDekMsQ0FBQztvQkFDRixJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNWLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDaEIsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRSxDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztZQUVsRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFeEQsa0NBQWtDO1lBQ2xDLEtBQUssTUFBTSxNQUFNLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUMxQixNQUFNLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQ2xFLE1BQU0sQ0FBQyxjQUFjLENBQ3RCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQThEO1FBQzVGLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ25FLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRXZFLDRDQUE0QztZQUM1QyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUN4RCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUN4RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDM0IsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO2dCQUN0RixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUNsRixZQUE0QixFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3pDLENBQUMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFcEIscUJBQXFCO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFN0Qsb0JBQW9CO1lBQ3BCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQzVELE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQzVELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUM1QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUM7Z0JBQzFGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssS0FBSyxDQUFDLENBQUM7Z0JBQ25GLFlBQTRCLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDekMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVyQixlQUFlO1lBQ2YsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpDLGdEQUFnRDtZQUNoRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUU3QixNQUFNLEtBQUssR0FBa0MsRUFBRSxDQUFDO1lBRWhELGlCQUFpQjtZQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUVoRCxvRUFBb0U7WUFDcEUsc0RBQXNEO1lBQ3RELE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRW5CLE9BQU87Z0JBQ0wsZUFBZTtnQkFDZixLQUFLO2FBQ04sQ0FBQztRQUNKLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxjQUFzQjtRQUMxRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNwRixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YifQ==
@@ -1,43 +0,0 @@
1
- export type SeedEntryType = {
2
- all_attributes: {
3
- _registerArt: string;
4
- _registerNummer: string;
5
- additional_data: {
6
- AD: boolean;
7
- CD: boolean;
8
- DK: boolean;
9
- HD: boolean;
10
- SI: boolean;
11
- UT: boolean;
12
- VÖ: boolean;
13
- };
14
- federal_state: string;
15
- native_company_number: string;
16
- registered_office: string;
17
- registrar: string;
18
- };
19
- company_number: string;
20
- current_status: string;
21
- jurisdiction_code: string;
22
- name: string;
23
- officers: {
24
- name: string;
25
- other_attributes: {
26
- city: string;
27
- firstname: string;
28
- flag: string;
29
- lastname: string;
30
- };
31
- position: string;
32
- start_date: string;
33
- type: string;
34
- }[];
35
- registered_address: string;
36
- retrieved_at: string;
37
- };
38
- export declare class JsonlDataProcessor<T> {
39
- private germanBusinessDataDir;
40
- forEachFunction: (entryArg: T) => Promise<void>;
41
- constructor(germanBusinessDataDirArg: string, forEachFunctionArg: typeof this.forEachFunction);
42
- processDataFromUrl(dataUrlArg?: string): Promise<void>;
43
- }
@@ -1,68 +0,0 @@
1
- import * as plugins from './plugins.js';
2
- export class JsonlDataProcessor {
3
- germanBusinessDataDir;
4
- forEachFunction;
5
- constructor(germanBusinessDataDirArg, forEachFunctionArg) {
6
- this.germanBusinessDataDir = germanBusinessDataDirArg;
7
- this.forEachFunction = forEachFunctionArg;
8
- }
9
- // TODO: define a mapper as argument instead of hard-coding it
10
- async processDataFromUrl(dataUrlArg = 'https://daten.offeneregister.de/de_companies_ocdata.jsonl.bz2') {
11
- const done = plugins.smartpromise.defer();
12
- const dataExists = await plugins.smartfs.directory(this.germanBusinessDataDir).exists();
13
- if (!dataExists) {
14
- await plugins.smartfs.directory(this.germanBusinessDataDir).create();
15
- }
16
- else {
17
- }
18
- const jsonlDataStream = await plugins.smartarchive.SmartArchive.create()
19
- .url(dataUrlArg)
20
- .toStreamFiles();
21
- let totalRecordsCounter = 0;
22
- let nextRest = '';
23
- jsonlDataStream.pipe(new plugins.smartstream.SmartDuplex({
24
- objectMode: true,
25
- writeFunction: async (chunkArg, streamToolsArg) => {
26
- const readStream = await chunkArg.createReadStream();
27
- readStream.pipe(new plugins.smartstream.SmartDuplex({
28
- objectMode: true,
29
- writeFunction: async (chunkArg, streamToolsArg) => {
30
- const currentString = nextRest + chunkArg.toString();
31
- const lines = currentString.split('\n');
32
- nextRest = lines.pop() ?? '';
33
- console.log(`Got another ${lines.length} records.`);
34
- const concurrentProcessor = new plugins.smartarray.ConcurrentProcessor(async (line) => {
35
- let entry;
36
- if (!line)
37
- return;
38
- try {
39
- entry = JSON.parse(line);
40
- }
41
- catch (err) {
42
- console.log(line);
43
- await plugins.smartdelay.delayFor(10000);
44
- }
45
- if (!entry)
46
- return;
47
- totalRecordsCounter++;
48
- if (totalRecordsCounter % 10000 === 0)
49
- console.log(`${totalRecordsCounter} total records.`);
50
- await this.forEachFunction(entry);
51
- }, 1000);
52
- await concurrentProcessor.process(lines);
53
- },
54
- finalFunction: async (streamToolsArg) => {
55
- console.log(`finished processing ${totalRecordsCounter} records.`);
56
- if (nextRest) {
57
- JSON.parse(nextRest);
58
- }
59
- ;
60
- done.resolve();
61
- },
62
- }));
63
- },
64
- }));
65
- await done.promise;
66
- }
67
- }
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5qc29ubGRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmpzb25sZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQXlDeEMsTUFBTSxPQUFPLGtCQUFrQjtJQUNyQixxQkFBcUIsQ0FBUztJQUMvQixlQUFlLENBQWlDO0lBRXZELFlBQVksd0JBQWdDLEVBQUUsa0JBQStDO1FBQzNGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztRQUN0RCxJQUFJLENBQUMsZUFBZSxHQUFHLGtCQUFrQixDQUFDO0lBQzVDLENBQUM7SUFFRCw4REFBOEQ7SUFDdkQsS0FBSyxDQUFDLGtCQUFrQixDQUM3QixVQUFVLEdBQUcsK0RBQStEO1FBRTVFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4RixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2RSxDQUFDO2FBQU0sQ0FBQztRQUNSLENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTthQUNyRSxHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ2YsYUFBYSxFQUFFLENBQUM7UUFDbkIsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxRQUFRLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLElBQUks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
@@ -1,25 +0,0 @@
1
- import { BusinessRecord } from './classes.businessrecord.js';
2
- import { HandelsRegister } from './classes.handelsregister.js';
3
- import { JsonlDataProcessor, type SeedEntryType } from './classes.jsonldata.js';
4
- import * as plugins from './plugins.js';
5
- export interface IOpenDataConfig {
6
- downloadDir: string;
7
- germanBusinessDataDir: string;
8
- nogitDir: string;
9
- }
10
- export declare class OpenData {
11
- db: plugins.smartdata.SmartdataDb;
12
- private localSmartDb?;
13
- private config;
14
- private started;
15
- jsonLDataProcessor: JsonlDataProcessor<SeedEntryType>;
16
- handelsregister: HandelsRegister;
17
- CBusinessRecord: typeof BusinessRecord;
18
- constructor(configArg: IOpenDataConfig);
19
- start(): Promise<void>;
20
- buildInitialDb(): Promise<void>;
21
- slowValidateDb(): Promise<void>;
22
- validateSearchByName(): Promise<void>;
23
- searchDbByBusinessNameAndPostalCode(businessNameArg: string, postalCodeArg: string): Promise<void>;
24
- stop(): Promise<void>;
25
- }
@@ -1,91 +0,0 @@
1
- import { BusinessRecord } from './classes.businessrecord.js';
2
- import { HandelsRegister } from './classes.handelsregister.js';
3
- import { JsonlDataProcessor } from './classes.jsonldata.js';
4
- import * as plugins from './plugins.js';
5
- export class OpenData {
6
- db;
7
- localSmartDb;
8
- config;
9
- started = false;
10
- jsonLDataProcessor;
11
- handelsregister;
12
- CBusinessRecord = plugins.smartdata.setDefaultManagerForDoc(this, BusinessRecord);
13
- constructor(configArg) {
14
- if (!configArg) {
15
- throw new Error('@fin.cx/opendata: Configuration is required. You must provide downloadDir, germanBusinessDataDir, and nogitDir paths.');
16
- }
17
- if (!configArg.downloadDir || !configArg.germanBusinessDataDir || !configArg.nogitDir) {
18
- throw new Error('@fin.cx/opendata: All directory paths are required (downloadDir, germanBusinessDataDir, nogitDir).');
19
- }
20
- this.config = configArg;
21
- }
22
- async start() {
23
- if (this.started) {
24
- return;
25
- }
26
- // Ensure configured directories exist
27
- await plugins.smartfs.directory(this.config.nogitDir).create();
28
- await plugins.smartfs.directory(this.config.downloadDir).create();
29
- await plugins.smartfs.directory(this.config.germanBusinessDataDir).create();
30
- this.localSmartDb = new plugins.smartdb.LocalSmartDb({
31
- folderPath: plugins.path.join(this.config.nogitDir, 'opendata-smartdb'),
32
- });
33
- const connectionInfo = await this.localSmartDb.start();
34
- this.db = new plugins.smartdata.SmartdataDb({
35
- mongoDbUrl: connectionInfo.connectionUri,
36
- mongoDbName: 'opendata',
37
- });
38
- try {
39
- await this.db.init();
40
- await this.db.mongoDb.collection('_opendata_bootstrap').insertOne({
41
- createdAt: new Date(),
42
- });
43
- await this.db.mongoDb.collection('_opendata_bootstrap').deleteMany({});
44
- this.jsonLDataProcessor = new JsonlDataProcessor(this.config.germanBusinessDataDir, async (entryArg) => {
45
- const businessRecord = new this.CBusinessRecord();
46
- businessRecord.id = await this.CBusinessRecord.getNewId();
47
- businessRecord.data.name = entryArg.name;
48
- businessRecord.data.germanParsedRegistration = {
49
- court: entryArg.all_attributes.registered_office,
50
- number: entryArg.all_attributes._registerNummer,
51
- type: entryArg.all_attributes._registerArt,
52
- };
53
- await businessRecord.save();
54
- });
55
- this.handelsregister = new HandelsRegister(this, this.config.downloadDir);
56
- await this.handelsregister.start();
57
- this.started = true;
58
- }
59
- catch (error) {
60
- if (this.handelsregister) {
61
- await this.handelsregister.stop().catch(() => { });
62
- }
63
- await this.db.close().catch(() => { });
64
- await this.localSmartDb.stop().catch(() => { });
65
- this.localSmartDb = undefined;
66
- throw error;
67
- }
68
- }
69
- async buildInitialDb() {
70
- await this.jsonLDataProcessor.processDataFromUrl();
71
- }
72
- async slowValidateDb() {
73
- }
74
- async validateSearchByName() {
75
- }
76
- async searchDbByBusinessNameAndPostalCode(businessNameArg, postalCodeArg) {
77
- }
78
- async stop() {
79
- if (!this.started) {
80
- return;
81
- }
82
- if (this.handelsregister) {
83
- await this.handelsregister.stop();
84
- }
85
- await this.db.close();
86
- await this.localSmartDb?.stop();
87
- this.localSmartDb = undefined;
88
- this.started = false;
89
- }
90
- }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYWluLm9wZW5kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5tYWluLm9wZW5kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFzQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBUXhDLE1BQU0sT0FBTyxRQUFRO0lBQ1osRUFBRSxDQUFpQztJQUNsQyxZQUFZLENBQWdDO0lBQzVDLE1BQU0sQ0FBa0I7SUFDeEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVqQixrQkFBa0IsQ0FBcUM7SUFDdkQsZUFBZSxDQUFtQjtJQUVsQyxlQUFlLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFekYsWUFBWSxTQUEwQjtRQUNwQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHVIQUF1SCxDQUFDLENBQUM7UUFDM0ksQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RGLE1BQU0sSUFBSSxLQUFLLENBQUMsb0dBQW9HLENBQUMsQ0FBQztRQUN4SCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sT0FB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
@@ -1,24 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import type { TJurisdiction, TLawSource, TRawLawFormat } from './interfaces.law.js';
3
- export declare class LawRecord extends plugins.smartdata.SmartDataDbDoc<LawRecord, LawRecord> {
4
- static getByLookupKey: (lookupKeyArg: string) => Promise<LawRecord>;
5
- id: string;
6
- lookupKey: string;
7
- jurisdiction: TJurisdiction;
8
- source: TLawSource;
9
- identifier: string;
10
- title: string;
11
- shortTitle: string;
12
- citation: string;
13
- type: string;
14
- language: string;
15
- sourceUrl: string;
16
- rawFormat: TRawLawFormat;
17
- rawBody: string;
18
- text: string;
19
- dateIssued: string;
20
- lastModified: string;
21
- sourceMeta: Record<string, string>;
22
- fetchedAt: Date;
23
- syncedAt: Date;
24
- }