text-to-map 1.1.45 → 1.1.47

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 (97) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +69 -69
  3. package/dist/bin/address-points.d.ts +1 -1
  4. package/dist/bin/address-points.js +16 -16
  5. package/dist/bin/cities.d.ts +1 -1
  6. package/dist/bin/cities.js +10 -10
  7. package/dist/bin/clear-all.d.ts +1 -1
  8. package/dist/bin/clear-all.js +13 -13
  9. package/dist/bin/constants.d.ts +2 -2
  10. package/dist/bin/constants.js +4 -4
  11. package/dist/bin/generate-syntax-diagrams.d.ts +1 -1
  12. package/dist/bin/generate-syntax-diagrams.js +20 -20
  13. package/dist/bin/init-db.d.ts +1 -1
  14. package/dist/bin/init-db.js +8 -8
  15. package/dist/bin/knex.d.ts +1 -1
  16. package/dist/bin/knex.js +10 -10
  17. package/dist/bin/parse-ordinance.d.ts +1 -1
  18. package/dist/bin/parse-ordinance.js +74 -74
  19. package/dist/bin/polygons.d.ts +1 -1
  20. package/dist/bin/polygons.js +27 -27
  21. package/dist/bin/regions.d.ts +1 -1
  22. package/dist/bin/regions.js +10 -10
  23. package/dist/bin/schools.d.ts +1 -1
  24. package/dist/bin/schools.js +10 -10
  25. package/dist/bin/streets.d.ts +1 -1
  26. package/dist/bin/streets.js +19 -19
  27. package/dist/bin/sync-all.d.ts +1 -1
  28. package/dist/bin/sync-all.js +4 -4
  29. package/dist/db/address-points.d.ts +59 -59
  30. package/dist/db/address-points.js +401 -399
  31. package/dist/db/cities.d.ts +7 -7
  32. package/dist/db/cities.js +95 -95
  33. package/dist/db/db.d.ts +37 -37
  34. package/dist/db/db.js +191 -191
  35. package/dist/db/founders.d.ts +14 -14
  36. package/dist/db/founders.js +461 -461
  37. package/dist/db/meta.d.ts +4 -4
  38. package/dist/db/meta.js +26 -26
  39. package/dist/db/migrations/20230704125715_initial.js +304 -304
  40. package/dist/db/migrations/20230731232915_city_positions.js +13 -13
  41. package/dist/db/migrations/20240106224603_city_polygon.js +11 -11
  42. package/dist/db/migrations/20240320200534_district_polygon.js +11 -11
  43. package/dist/db/migrations/20250316162700_kindergartens.js +12 -12
  44. package/dist/db/regions.d.ts +31 -31
  45. package/dist/db/regions.js +81 -81
  46. package/dist/db/schools.d.ts +7 -7
  47. package/dist/db/schools.js +95 -95
  48. package/dist/db/street-sync.d.ts +6 -6
  49. package/dist/db/street-sync.js +22 -22
  50. package/dist/db/sync-log.d.ts +9 -9
  51. package/dist/db/sync-log.js +66 -66
  52. package/dist/db/types.d.ts +59 -59
  53. package/dist/db/types.js +26 -26
  54. package/dist/index.d.ts +23 -23
  55. package/dist/index.js +32 -32
  56. package/dist/open-data-sync/address-points.d.ts +2 -2
  57. package/dist/open-data-sync/address-points.js +68 -68
  58. package/dist/open-data-sync/cities.d.ts +2 -2
  59. package/dist/open-data-sync/cities.js +32 -32
  60. package/dist/open-data-sync/common.d.ts +2 -2
  61. package/dist/open-data-sync/common.js +22 -22
  62. package/dist/open-data-sync/regions.d.ts +2 -2
  63. package/dist/open-data-sync/regions.js +37 -37
  64. package/dist/open-data-sync/schools.d.ts +3 -3
  65. package/dist/open-data-sync/schools.js +207 -207
  66. package/dist/open-data-sync/streets.d.ts +2 -2
  67. package/dist/open-data-sync/streets.js +132 -132
  68. package/dist/smd-to-csv/json-to-csv.d.ts +1 -1
  69. package/dist/smd-to-csv/json-to-csv.js +154 -154
  70. package/dist/smd-to-csv/ordinance-to-csv-rules.d.ts +1 -1
  71. package/dist/smd-to-csv/ordinance-to-csv-rules.js +23 -23
  72. package/dist/smd-to-csv/txt-to-json.d.ts +1 -1
  73. package/dist/smd-to-csv/txt-to-json.js +92 -92
  74. package/dist/souradnice.csv +6260 -6260
  75. package/dist/street-markdown/municipality.d.ts +11 -11
  76. package/dist/street-markdown/municipality.js +116 -116
  77. package/dist/street-markdown/polygons.d.ts +7 -7
  78. package/dist/street-markdown/polygons.js +261 -261
  79. package/dist/street-markdown/roman-numerals.d.ts +1 -1
  80. package/dist/street-markdown/roman-numerals.js +68 -68
  81. package/dist/street-markdown/smd-line-parser.d.ts +4 -4
  82. package/dist/street-markdown/smd-line-parser.js +40 -40
  83. package/dist/street-markdown/smd-parser.d.ts +23 -23
  84. package/dist/street-markdown/smd-parser.js +393 -393
  85. package/dist/street-markdown/smd.d.ts +24 -24
  86. package/dist/street-markdown/smd.js +440 -440
  87. package/dist/street-markdown/token-definition.d.ts +25 -25
  88. package/dist/street-markdown/token-definition.js +168 -168
  89. package/dist/street-markdown/types.d.ts +148 -148
  90. package/dist/street-markdown/types.js +13 -13
  91. package/dist/utils/atom.d.ts +2 -2
  92. package/dist/utils/atom.js +57 -57
  93. package/dist/utils/helpers.d.ts +28 -28
  94. package/dist/utils/helpers.js +176 -176
  95. package/dist/utils/jtsk2wgs84.d.ts +17 -17
  96. package/dist/utils/jtsk2wgs84.js +82 -82
  97. package/package.json +109 -109
@@ -1,393 +1,393 @@
1
- import { EmbeddedActionsParser, EOF } from "chevrotain";
2
- import { splitStreetViaRomanNumerals } from "./roman-numerals";
3
- import { AllType, AndAbove, AndBelow, DescriptiveType, EvenType, From, Hyphen, MainSeparator, MunicipalityPartName, Number, OddType, Separator, Slash, StreetName, To, Without, } from "./token-definition";
4
- import { SeriesType } from "./types";
5
- export class SmdParser extends EmbeddedActionsParser {
6
- constructor(tokenVocabulary) {
7
- super(tokenVocabulary);
8
- this.street = this.RULE("street", () => {
9
- let result;
10
- this.OR([
11
- {
12
- ALT: () => {
13
- result = this.SUBRULE(this.streetNameAndNumbersSpecs);
14
- },
15
- },
16
- {
17
- ALT: () => {
18
- result = {
19
- type: "street",
20
- street: this.CONSUME(StreetName).image,
21
- numberSpec: [],
22
- };
23
- },
24
- },
25
- {
26
- ALT: () => {
27
- result = this.SUBRULE(this.municipalityPartNameAndNumbersSpecs);
28
- },
29
- },
30
- {
31
- ALT: () => {
32
- const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image);
33
- result = {
34
- type: "municipalityPart",
35
- municipalityPart,
36
- numberSpec: [],
37
- };
38
- },
39
- },
40
- ]);
41
- if (result.type === "street") {
42
- return splitStreetViaRomanNumerals(result.street).map((street) => ({
43
- type: "street",
44
- street,
45
- numberSpec: result.numberSpec,
46
- }));
47
- }
48
- else {
49
- return [result];
50
- }
51
- });
52
- this.streetNameAndNumbersSpecs = this.RULE("streetNameAndNumbersSpecs", () => {
53
- const street = this.CONSUME(StreetName).image;
54
- this.OPTION(() => {
55
- this.CONSUME(MainSeparator);
56
- });
57
- const numberSpec = this.SUBRULE(this.numberSpecs);
58
- return { type: "street", street, numberSpec };
59
- });
60
- this.municipalityPartNameAndNumbersSpecs = this.RULE("municipalityPartNameAndNumbersSpecs", () => {
61
- const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image);
62
- this.OPTION(() => {
63
- this.CONSUME(MainSeparator);
64
- });
65
- const numberSpec = this.SUBRULE(this.numberSpecs);
66
- return {
67
- type: "municipalityPart",
68
- municipalityPart,
69
- numberSpec,
70
- };
71
- });
72
- this.numberSpecs = this.RULE("numberSpecs", () => {
73
- const positiveResult = [];
74
- let negativeResult;
75
- this.OR([
76
- {
77
- GATE: () => this.LA(2).tokenType === Without,
78
- ALT: () => {
79
- const type = this.SUBRULE(this.seriesType);
80
- this.CONSUME(Without);
81
- this.OPTION(() => {
82
- this.CONSUME(AllType);
83
- });
84
- const ranges = this.SUBRULE(this.rangeList);
85
- return { negative: true, type, ranges };
86
- },
87
- },
88
- {
89
- ALT: () => {
90
- this.CONSUME2(Without);
91
- this.OR1([
92
- {
93
- GATE: this._gatePostfixTypeSeriesSpec,
94
- ALT: () => {
95
- const { type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec);
96
- negativeResult = { negative: true, type, ranges };
97
- },
98
- },
99
- {
100
- ALT: () => {
101
- const type = this.SUBRULE2(this.seriesType);
102
- const ranges = this.SUBRULE2(this.rangeList);
103
- negativeResult = { negative: true, type, ranges };
104
- },
105
- },
106
- ]);
107
- },
108
- },
109
- {
110
- ALT: () => {
111
- this.AT_LEAST_ONE_SEP({
112
- SEP: Separator,
113
- DEF: () => {
114
- positiveResult.push(this.SUBRULE(this.seriesSpecs));
115
- },
116
- });
117
- },
118
- },
119
- ]);
120
- if (negativeResult) {
121
- return negativeResult;
122
- }
123
- return positiveResult;
124
- });
125
- this.seriesSpecs = this.RULE("seriesSpecs", () => {
126
- let ranges = [];
127
- let type;
128
- this.OR([
129
- {
130
- GATE: this._gatePostfixTypeSeriesSpec,
131
- ALT: () => {
132
- ({ type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec));
133
- },
134
- },
135
- {
136
- ALT: () => {
137
- type = this.SUBRULE(this.seriesType);
138
- this.OPTION(() => {
139
- ranges = this.SUBRULE(this.rangeList);
140
- });
141
- },
142
- },
143
- {
144
- ALT: () => {
145
- ({ type, ranges } = this.SUBRULE2(this.fromAndAboveWithType));
146
- },
147
- },
148
- {
149
- ALT: () => {
150
- ({ type, ranges } = this.SUBRULE(this.toOrBelowWithType));
151
- },
152
- },
153
- ]);
154
- return { type, ranges };
155
- });
156
- this._gatePostfixTypeSeriesSpec = () => {
157
- let index = 2;
158
- while (![Separator, EOF].includes(this.LA(index).tokenType)) {
159
- if ([OddType, EvenType].includes(this.LA(index).tokenType)) {
160
- return true;
161
- }
162
- index++;
163
- }
164
- return false;
165
- };
166
- this.postfixTypeSeriesSpec = this.RULE("postfixTypeSeriesSpec", () => {
167
- this.CONSUME(AllType);
168
- const ranges = [this.SUBRULE(this.rangeOrNumber)];
169
- let type;
170
- this.OR1([
171
- {
172
- ALT: () => {
173
- this.CONSUME(OddType);
174
- type = SeriesType.Odd;
175
- },
176
- },
177
- {
178
- ALT: () => {
179
- this.CONSUME1(EvenType);
180
- type = SeriesType.Even;
181
- },
182
- },
183
- ]);
184
- return { type, ranges };
185
- });
186
- this.rangeList = this.RULE("rangeList", () => {
187
- let ranges = [];
188
- ranges.push(this.SUBRULE(this.rangeOrNumber));
189
- this.MANY({
190
- GATE: () => [Number, To, From].includes(this.LA(2).tokenType),
191
- DEF: () => {
192
- this.CONSUME(Separator);
193
- ranges.push(this.SUBRULE2(this.rangeOrNumber));
194
- },
195
- });
196
- return ranges;
197
- });
198
- this.seriesType = this.RULE("seriesType", () => {
199
- let type;
200
- this.OR([
201
- {
202
- ALT: () => {
203
- this.CONSUME(OddType);
204
- type = SeriesType.Odd;
205
- },
206
- },
207
- {
208
- ALT: () => {
209
- this.CONSUME1(EvenType);
210
- type = SeriesType.Even;
211
- },
212
- },
213
- {
214
- ALT: () => {
215
- this.CONSUME2(AllType);
216
- type = SeriesType.All;
217
- },
218
- },
219
- {
220
- ALT: () => {
221
- this.CONSUME3(DescriptiveType);
222
- type = SeriesType.Description;
223
- },
224
- },
225
- ]);
226
- return type;
227
- });
228
- this.rangeOrNumber = this.RULE("rangeOrNumber", () => {
229
- let result;
230
- this.OR([
231
- {
232
- ALT: () => {
233
- result = this.SUBRULE(this.range);
234
- },
235
- },
236
- {
237
- ALT: () => {
238
- result = this.SUBRULE(this.fromAndAbove);
239
- },
240
- },
241
- {
242
- ALT: () => {
243
- result = this.SUBRULE(this.toOrBelow);
244
- },
245
- },
246
- {
247
- ALT: () => {
248
- result = this.SUBRULE(this.fullStreetNumber);
249
- },
250
- },
251
- {
252
- ALT: () => {
253
- const n = parseRichNumber(this.CONSUME(Number).image);
254
- result = { from: n, to: n };
255
- },
256
- },
257
- ]);
258
- return result;
259
- });
260
- this.range = this.RULE("range", () => {
261
- const from = parseRichNumber(this.CONSUME(Number).image);
262
- this.OR([
263
- { ALT: () => this.CONSUME1(Hyphen) },
264
- { ALT: () => this.CONSUME2(MainSeparator) },
265
- ]);
266
- this.OPTION(() => {
267
- this.CONSUME(AllType);
268
- });
269
- const to = parseRichNumber(this.CONSUME3(Number).image);
270
- return { from, to };
271
- });
272
- this.fromAndAbove = this.RULE("fromAndAbove", () => {
273
- let from;
274
- this.OR([
275
- {
276
- ALT: () => {
277
- from = parseRichNumber(this.CONSUME(Number).image);
278
- this.CONSUME(AndAbove);
279
- },
280
- },
281
- {
282
- ALT: () => {
283
- this.CONSUME(From);
284
- this.OPTION(() => {
285
- this.CONSUME(AllType);
286
- });
287
- from = parseRichNumber(this.CONSUME2(Number).image);
288
- this.OPTION2(() => {
289
- this.CONSUME2(AndAbove);
290
- });
291
- },
292
- },
293
- ]);
294
- return { from };
295
- });
296
- this.fromAndAboveWithType = this.RULE("fromAndAboveWithType", () => {
297
- let type = SeriesType.All;
298
- this.CONSUME(From);
299
- this.OPTION(() => {
300
- this.OR([
301
- {
302
- ALT: () => {
303
- type = SeriesType.All;
304
- this.CONSUME(AllType);
305
- },
306
- },
307
- {
308
- ALT: () => {
309
- type = SeriesType.Description;
310
- this.CONSUME(DescriptiveType);
311
- },
312
- },
313
- ]);
314
- });
315
- const from = parseRichNumber(this.CONSUME(Number).image);
316
- this.OPTION2(() => {
317
- this.CONSUME(AndAbove);
318
- });
319
- return { type, ranges: [{ from }] };
320
- });
321
- this.toOrBelow = this.RULE("toOrBelow", () => {
322
- let to;
323
- this.OR([
324
- {
325
- ALT: () => {
326
- to = parseRichNumber(this.CONSUME(Number).image);
327
- this.CONSUME(AndBelow);
328
- },
329
- },
330
- {
331
- ALT: () => {
332
- this.CONSUME2(To);
333
- to = parseRichNumber(this.CONSUME2(Number).image);
334
- },
335
- },
336
- ]);
337
- return { to };
338
- });
339
- this.toOrBelowWithType = this.RULE("toOrBelowWithType", () => {
340
- let type = SeriesType.All;
341
- this.CONSUME(To);
342
- this.OPTION(() => {
343
- this.OR([
344
- {
345
- ALT: () => {
346
- type = SeriesType.All;
347
- this.CONSUME(AllType);
348
- },
349
- },
350
- {
351
- ALT: () => {
352
- type = SeriesType.Description;
353
- this.CONSUME(DescriptiveType);
354
- },
355
- },
356
- ]);
357
- });
358
- const to = parseRichNumber(this.CONSUME(Number).image);
359
- return { type, ranges: [{ to }] };
360
- });
361
- this.fullStreetNumber = this.RULE("fullStreetNumber", () => {
362
- const descriptiveNumber = parseRichNumber(this.CONSUME(Number).image);
363
- this.CONSUME(Slash);
364
- const orientationNumber = parseRichNumber(this.CONSUME2(Number).image);
365
- return {
366
- descriptionNumber: descriptiveNumber,
367
- orientationalNumber: orientationNumber,
368
- };
369
- });
370
- this.performSelfAnalysis();
371
- }
372
- }
373
- const numberWithCharacterPattern = /^(\d+)([a-z])$/;
374
- export const parseRichNumber = (number) => {
375
- if (numberWithCharacterPattern.test(number)) {
376
- const match = numberWithCharacterPattern.exec(number);
377
- return {
378
- number: parseInt(match[1]),
379
- letter: match[2],
380
- };
381
- }
382
- else {
383
- return {
384
- number: parseInt(number),
385
- };
386
- }
387
- };
388
- const municipalityPartPattern = /^část (?<type>obce|města) (?<name>.+)$/;
389
- export const parseMunicipalityPartName = (name) => {
390
- const match = municipalityPartPattern.exec(name);
391
- return match?.groups.name?.trim() ?? "";
392
- };
393
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21kLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlZXQtbWFya2Rvd24vc21kLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLEVBQ1IsZUFBZSxFQUNmLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNOLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixFQUFFLEVBQ0YsT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFvRCxVQUFVLEVBQVcsTUFBTSxTQUFTLENBQUM7QUFFaEcsTUFBTSxPQUFPLFNBQVUsU0FBUSxxQkFBcUI7SUFDbEQsWUFBWSxlQUFnQztRQUMxQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFJbEIsV0FBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQWMsRUFBRTtZQUNsRCxJQUFJLE1BQU0sQ0FBQztZQUNYLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ047b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLE1BQU0sR0FBRzs0QkFDUCxJQUFJLEVBQUUsUUFBUTs0QkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLOzRCQUN0QyxVQUFVLEVB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Q0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO0lBQ2hFLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxPQUFPLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWJlZGRlZEFjdGlvbnNQYXJzZXIsIEVPRiwgVG9rZW5Wb2NhYnVsYXJ5IH0gZnJvbSBcImNoZXZyb3RhaW5cIjtcclxuaW1wb3J0IHsgc3BsaXRTdHJlZXRWaWFSb21hbk51bWVyYWxzIH0gZnJvbSBcIi4vcm9tYW4tbnVtZXJhbHNcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgQWxsVHlwZSxcclxuICBBbmRBYm92ZSxcclxuICBBbmRCZWxvdyxcclxuICBEZXNjcmlwdGl2ZVR5cGUsXHJcbiAgRXZlblR5cGUsXHJcbiAgRnJvbSxcclxuICBIeXBoZW4sXHJcbiAgTWFpblNlcGFyYXRvcixcclxuICBNdW5pY2lwYWxpdHlQYXJ0TmFtZSxcclxuICBOdW1iZXIsXHJcbiAgT2RkVHlwZSxcclxuICBTZXBhcmF0b3IsXHJcbiAgU2xhc2gsXHJcbiAgU3RyZWV0TmFtZSxcclxuICBUbyxcclxuICBXaXRob3V0LFxyXG59IGZyb20gXCIuL3Rva2VuLWRlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgRnVsbFN0cmVldE51bWJlciwgTmVnYXRpdmVTZXJpZXNTcGVjLCBSaWNoTnVtYmVyLCBTZXJpZXNUeXBlLCBTbWRMaW5lIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTbWRQYXJzZXIgZXh0ZW5kcyBFbWJlZGRlZEFjdGlvbnNQYXJzZXIge1xyXG4gIGNvbnN0cnVjdG9yKHRva2VuVm9jYWJ1bGFyeTogVG9rZW5Wb2NhYnVsYXJ5KSB7XHJcbiAgICBzdXBlcih0b2tlblZvY2FidWxhcnkpO1xyXG4gICAgdGhpcy5wZXJmb3JtU2VsZkFuYWx5c2lzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RyZWV0ID0gdGhpcy5SVUxFKFwic3RyZWV0XCIsICgpOiBTbWRMaW5lW10gPT4ge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIHRoaXMuT1IoW1xyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5zdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwic3RyZWV0XCIsXHJcbiAgICAgICAgICAgIHN0cmVldDogdGhpcy5DT05TVU1FKFN0cmVldE5hbWUpLmltYWdlLFxyXG4gICAgICAgICAgICBudW1iZXJTcGVjOiBbXSxcclxuICAgICAgICAgIH0gYXMgU21kTGluZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5tdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbXVuaWNpcGFsaXR5UGFydCA9IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUoXHJcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShNdW5pY2lwYWxpdHlQYXJ0TmFtZSkuaW1hZ2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwibXVuaWNpcGFsaXR5UGFydFwiLFxyXG4gICAgICAgICAgICBtdW5pY2lwYWxpdHlQYXJ0LFxyXG4gICAgICAgICAgICBudW1iZXJTcGVjOiBbXSxcclxuICAgICAgICAgIH0gYXMgU21kTGluZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcblxyXG4gICAgaWYgKHJlc3VsdC50eXBlID09PSBcInN0cmVldFwiKSB7XHJcbiAgICAgIHJldHVybiBzcGxpdFN0cmVldFZpYVJvbWFuTnVtZXJhbHMocmVzdWx0LnN0cmVldCkubWFwKChzdHJlZXQpID0+ICh7XHJcbiAgICAgICAgdHlwZTogXCJzdHJlZXRcIixcclxuICAgICAgICBzdHJlZXQsXHJcbiAgICAgICAgbnVtYmVyU3BlYzogcmVzdWx0Lm51bWJlclNwZWMsXHJcbiAgICAgIH0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBbcmVzdWx0XTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcHJpdmF0ZSBzdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzID0gdGhpcy5SVUxFKFxyXG4gICAgXCJzdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzXCIsXHJcbiAgICAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN0cmVldCA9IHRoaXMuQ09OU1VNRShTdHJlZXROYW1lKS5pbWFnZTtcclxuICAgICAgdGhpcy5PUFRJT04oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuQ09OU1VNRShNYWluU2VwYXJhdG9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IG51bWJlclNwZWMgPSB0aGlzLlNVQlJVTEUodGhpcy5udW1iZXJTcGVjcyk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyZWV0XCIsIHN0cmVldCwgbnVtYmVyU3BlYyB9IGFzIFNtZExpbmU7XHJcbiAgICB9XHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBtdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjcyA9IHRoaXMuUlVMRShcclxuICAgIFwibXVuaWNpcGFsaXR5UGFydE5hbWVBbmROdW1iZXJzU3BlY3NcIixcclxuICAgICgpID0+IHtcclxuICAgICAgY29uc3QgbXVuaWNpcGFsaXR5UGFydCA9IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUoXHJcbiAgICAgICAgdGhpcy5DT05TVU1FKE11bmljaXBhbGl0eVBhcnROYW1lKS5pbWFnZVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5DT05TVU1FKE1haW5TZXBhcmF0b3IpO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgbnVtYmVyU3BlYyA9IHRoaXMuU1VCUlVMRSh0aGlzLm51bWJlclNwZWNzKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBcIm11bmljaXBhbGl0eVBhcnRcIixcclxuICAgICAgICBtdW5pY2lwYWxpdHlQYXJ0LFxyXG4gICAgICAgIG51bWJlclNwZWMsXHJcbiAgICAgIH0gYXMgU21kTGluZTtcclxuICAgIH1cclxuICApO1xyXG5cclxuICBwcml2YXRlIG51bWJlclNwZWNzID0gdGhpcy5SVUxFKFwibnVtYmVyU3BlY3NcIiwgKCkgPT4ge1xyXG4gICAgY29uc3QgcG9zaXRpdmVSZXN1bHQgPSBbXTtcclxuICAgIGxldCBuZWdhdGl2ZVJlc3VsdDogTmVnYXRpdmVTZXJpZXNTcGVjO1xyXG4gICAgdGhpcy5PUihbXHJcbiAgICAgIHtcclxuICAgICAgICBHQVRFOiAoKSA9PiB0aGlzLkxBKDIpLnRva2VuVHlwZSA9PT0gV2l0aG91dCxcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLlNVQlJVTEUodGhpcy5zZXJpZXNUeXBlKTtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRShXaXRob3V0KTtcclxuICAgICAgICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLlNVQlJVTEUodGhpcy5yYW5nZUxpc3QpO1xyXG4gICAgICAgICAgcmV0dXJuIHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTIoV2l0aG91dCk7XHJcbiAgICAgICAgICB0aGlzLk9SMShbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBHQVRFOiB0aGlzLl9nYXRlUG9zdGZpeFR5cGVTZXJpZXNTcGVjLFxyXG4gICAgICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0eXBlLCByYW5nZXMgfSA9IHRoaXMuU1VCUlVMRShcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wb3N0Zml4VHlwZVNlcmllc1NwZWNcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlc3VsdCA9IHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLlNVQlJVTEUyKHRoaXMuc2VyaWVzVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLlNVQlJVTEUyKHRoaXMucmFuZ2VMaXN0KTtcclxuICAgICAgICAgICAgICAgIG5lZ2F0aXZlUmVzdWx0ID0geyBuZWdhdGl2ZTogdHJ1ZSwgdHlwZSwgcmFuZ2VzIH07XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQVRfTEVBU1RfT05FX1NFUCh7XHJcbiAgICAgICAgICAgIFNFUDogU2VwYXJhdG9yLFxyXG4gICAgICAgICAgICBERUY6ICgpID0+IHtcclxuICAgICAgICAgICAgICBwb3NpdGl2ZVJlc3VsdC5wdXNoKHRoaXMuU1VCUlVMRSh0aGlzLnNlcmllc1NwZWNzKSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgICBpZiAobmVnYXRpdmVSZXN1bHQpIHtcclxuICAgICAgcmV0dXJuIG5lZ2F0aXZlUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBvc2l0aXZlUmVzdWx0O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHNlcmllc1NwZWNzID0gdGhpcy5SVUxFKFwic2VyaWVzU3BlY3NcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHJhbmdlcyA9IFtdO1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEdBVEU6IHRoaXMuX2dhdGVQb3N0Zml4VHlwZVNlcmllc1NwZWMsXHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAoeyB0eXBlLCByYW5nZXMgfSA9IHRoaXMuU1VCUlVMRSh0aGlzLnBvc3RmaXhUeXBlU2VyaWVzU3BlYykpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHR5cGUgPSB0aGlzLlNVQlJVTEUodGhpcy5zZXJpZXNUeXBlKTtcclxuICAgICAgICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgICAgICAgcmFuZ2VzID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2VMaXN0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgICh7IHR5cGUsIHJhbmdlcyB9ID0gdGhpcy5TVUJSVUxFMih0aGlzLmZyb21BbmRBYm92ZVdpdGhUeXBlKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgKHsgdHlwZSwgcmFuZ2VzIH0gPSB0aGlzLlNVQlJVTEUodGhpcy50b09yQmVsb3dXaXRoVHlwZSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdKTtcclxuXHJcbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXMgfTtcclxuICB9KTtcclxuXHJcbiAgcHJpdmF0ZSBfZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyA9ICgpOiBib29sZWFuID0+IHtcclxuICAgIGxldCBpbmRleCA9IDI7XHJcbiAgICB3aGlsZSAoIVtTZXBhcmF0b3IsIEVPRl0uaW5jbHVkZXModGhpcy5MQShpbmRleCkudG9rZW5UeXBlKSkge1xyXG4gICAgICBpZiAoW09kZFR5cGUsIEV2ZW5UeXBlXS5pbmNsdWRlcyh0aGlzLkxBKGluZGV4KS50b2tlblR5cGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaW5kZXgrKztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHBvc3RmaXhUeXBlU2VyaWVzU3BlYyA9IHRoaXMuUlVMRShcInBvc3RmaXhUeXBlU2VyaWVzU3BlY1wiLCAoKSA9PiB7XHJcbiAgICB0aGlzLkNPTlNVTUUoQWxsVHlwZSk7XHJcbiAgICBjb25zdCByYW5nZXMgPSBbdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2VPck51bWJlcildO1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SMShbXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRShPZGRUeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLk9kZDtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUxKEV2ZW5UeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkV2ZW47XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0pO1xyXG4gICAgcmV0dXJuIHsgdHlwZSwgcmFuZ2VzIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgcmFuZ2VMaXN0ID0gdGhpcy5SVUxFKFwicmFuZ2VMaXN0XCIsICgpID0+IHtcclxuICAgIGxldCByYW5nZXMgPSBbXTtcclxuICAgIHJhbmdlcy5wdXNoKHRoaXMuU1VCUlVMRSh0aGlzLnJhbmdlT3JOdW1iZXIpKTtcclxuICAgIHRoaXMuTUFOWSh7XHJcbiAgICAgIEdBVEU6ICgpID0+IFtOdW1iZXIsIFRvLCBGcm9tXS5pbmNsdWRlcyh0aGlzLkxBKDIpLnRva2VuVHlwZSksXHJcbiAgICAgIERFRjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuQ09OU1VNRShTZXBhcmF0b3IpO1xyXG4gICAgICAgIHJhbmdlcy5wdXNoKHRoaXMuU1VCUlVMRTIodGhpcy5yYW5nZU9yTnVtYmVyKSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByYW5nZXM7XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgc2VyaWVzVHlwZSA9IHRoaXMuUlVMRShcInNlcmllc1R5cGVcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKE9kZFR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuT2RkO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTEoRXZlblR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuRXZlbjtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUyKEFsbFR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTMoRGVzY3JpcHRpdmVUeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdKTtcclxuICAgIHJldHVybiB0eXBlO1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHJhbmdlT3JOdW1iZXIgPSB0aGlzLlJVTEUoXCJyYW5nZU9yTnVtYmVyXCIsICgpID0+IHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuU1VCUlVMRSh0aGlzLmZyb21BbmRBYm92ZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMudG9PckJlbG93KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5mdWxsU3RyZWV0TnVtYmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcclxuICAgICAgICAgIHJlc3VsdCA9IHsgZnJvbTogbiwgdG86IG4gfTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHJhbmdlID0gdGhpcy5SVUxFKFwicmFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgY29uc3QgZnJvbSA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAgeyBBTFQ6ICgpID0+IHRoaXMuQ09OU1VNRTEoSHlwaGVuKSB9LFxyXG4gICAgICB7IEFMVDogKCkgPT4gdGhpcy5DT05TVU1FMihNYWluU2VwYXJhdG9yKSB9LFxyXG4gICAgXSk7XHJcbiAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgdG8gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FMyhOdW1iZXIpLmltYWdlKTtcclxuICAgIHJldHVybiB7IGZyb20sIHRvIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgZnJvbUFuZEFib3ZlID0gdGhpcy5SVUxFKFwiZnJvbUFuZEFib3ZlXCIsICgpID0+IHtcclxuICAgIGxldCBmcm9tOiBSaWNoTnVtYmVyO1xyXG4gICAgdGhpcy5PUihbXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIGZyb20gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKEFuZEFib3ZlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUoRnJvbSk7XHJcbiAgICAgICAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZnJvbSA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUyKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5PUFRJT04yKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FMihBbmRBYm92ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcblxyXG4gICAgcmV0dXJuIHsgZnJvbSB9O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIGZyb21BbmRBYm92ZVdpdGhUeXBlID0gdGhpcy5SVUxFKFwiZnJvbUFuZEFib3ZlV2l0aFR5cGVcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgIHRoaXMuQ09OU1VNRShGcm9tKTtcclxuICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgdGhpcy5PUihbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKERlc2NyaXB0aXZlVHlwZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcclxuICAgIHRoaXMuT1BUSU9OMigoKSA9PiB7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShBbmRBYm92ZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IHR5cGUsIHJhbmdlczogW3sgZnJvbSB9XSB9O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHRvT3JCZWxvdyA9IHRoaXMuUlVMRShcInRvT3JCZWxvd1wiLCAoKSA9PiB7XHJcbiAgICBsZXQgdG86IFJpY2hOdW1iZXI7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgdG8gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKEFuZEJlbG93KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUyKFRvKTtcclxuICAgICAgICAgIHRvID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0pO1xyXG5cclxuICAgIHJldHVybiB7IHRvIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgdG9PckJlbG93V2l0aFR5cGUgPSB0aGlzLlJVTEUoXCJ0b09yQmVsb3dXaXRoVHlwZVwiLCAoKSA9PiB7XHJcbiAgICBsZXQgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xyXG4gICAgdGhpcy5DT05TVU1FKFRvKTtcclxuICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgdGhpcy5PUihbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKERlc2NyaXB0aXZlVHlwZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCB0byA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXM6IFt7IHRvIH1dIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgZnVsbFN0cmVldE51bWJlciA9IHRoaXMuUlVMRShcclxuICAgIFwiZnVsbFN0cmVldE51bWJlclwiLFxyXG4gICAgKCk6IEZ1bGxTdHJlZXROdW1iZXIgPT4ge1xyXG4gICAgICBjb25zdCBkZXNjcmlwdGl2ZU51bWJlciA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShTbGFzaCk7XHJcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uTnVtYmVyID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGVzY3JpcHRpb25OdW1iZXI6IGRlc2NyaXB0aXZlTnVtYmVyLFxyXG4gICAgICAgIG9yaWVudGF0aW9uYWxOdW1iZXI6IG9yaWVudGF0aW9uTnVtYmVyLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICk7XHJcbn1cclxuXHJcbmNvbnN0IG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuID0gL14oXFxkKykoW2Etel0pJC87XHJcblxyXG5leHBvcnQgY29uc3QgcGFyc2VSaWNoTnVtYmVyID0gKG51bWJlcjogc3RyaW5nKTogUmljaE51bWJlciA9PiB7XHJcbiAgaWYgKG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuLnRlc3QobnVtYmVyKSkge1xyXG4gICAgY29uc3QgbWF0Y2ggPSBudW1iZXJXaXRoQ2hhcmFjdGVyUGF0dGVybi5leGVjKG51bWJlcik7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBudW1iZXI6IHBhcnNlSW50KG1hdGNoWzFdKSxcclxuICAgICAgbGV0dGVyOiBtYXRjaFsyXSxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG51bWJlcjogcGFyc2VJbnQobnVtYmVyKSxcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgbXVuaWNpcGFsaXR5UGFydFBhdHRlcm4gPSAvXsSNw6FzdCAoPzx0eXBlPm9iY2V8bcSbc3RhKSAoPzxuYW1lPi4rKSQvO1xyXG5cclxuZXhwb3J0IGNvbnN0IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBtYXRjaCA9IG11bmljaXBhbGl0eVBhcnRQYXR0ZXJuLmV4ZWMobmFtZSk7XHJcbiAgcmV0dXJuIG1hdGNoPy5ncm91cHMubmFtZT8udHJpbSgpID8/IFwiXCI7XHJcbn07XHJcbiJdfQ==
1
+ import { EmbeddedActionsParser, EOF } from "chevrotain";
2
+ import { splitStreetViaRomanNumerals } from "./roman-numerals";
3
+ import { AllType, AndAbove, AndBelow, DescriptiveType, EvenType, From, Hyphen, MainSeparator, MunicipalityPartName, Number, OddType, Separator, Slash, StreetName, To, Without, } from "./token-definition";
4
+ import { SeriesType } from "./types";
5
+ export class SmdParser extends EmbeddedActionsParser {
6
+ constructor(tokenVocabulary) {
7
+ super(tokenVocabulary);
8
+ this.street = this.RULE("street", () => {
9
+ let result;
10
+ this.OR([
11
+ {
12
+ ALT: () => {
13
+ result = this.SUBRULE(this.streetNameAndNumbersSpecs);
14
+ },
15
+ },
16
+ {
17
+ ALT: () => {
18
+ result = {
19
+ type: "street",
20
+ street: this.CONSUME(StreetName).image,
21
+ numberSpec: [],
22
+ };
23
+ },
24
+ },
25
+ {
26
+ ALT: () => {
27
+ result = this.SUBRULE(this.municipalityPartNameAndNumbersSpecs);
28
+ },
29
+ },
30
+ {
31
+ ALT: () => {
32
+ const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image);
33
+ result = {
34
+ type: "municipalityPart",
35
+ municipalityPart,
36
+ numberSpec: [],
37
+ };
38
+ },
39
+ },
40
+ ]);
41
+ if (result.type === "street") {
42
+ return splitStreetViaRomanNumerals(result.street).map((street) => ({
43
+ type: "street",
44
+ street,
45
+ numberSpec: result.numberSpec,
46
+ }));
47
+ }
48
+ else {
49
+ return [result];
50
+ }
51
+ });
52
+ this.streetNameAndNumbersSpecs = this.RULE("streetNameAndNumbersSpecs", () => {
53
+ const street = this.CONSUME(StreetName).image;
54
+ this.OPTION(() => {
55
+ this.CONSUME(MainSeparator);
56
+ });
57
+ const numberSpec = this.SUBRULE(this.numberSpecs);
58
+ return { type: "street", street, numberSpec };
59
+ });
60
+ this.municipalityPartNameAndNumbersSpecs = this.RULE("municipalityPartNameAndNumbersSpecs", () => {
61
+ const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image);
62
+ this.OPTION(() => {
63
+ this.CONSUME(MainSeparator);
64
+ });
65
+ const numberSpec = this.SUBRULE(this.numberSpecs);
66
+ return {
67
+ type: "municipalityPart",
68
+ municipalityPart,
69
+ numberSpec,
70
+ };
71
+ });
72
+ this.numberSpecs = this.RULE("numberSpecs", () => {
73
+ const positiveResult = [];
74
+ let negativeResult;
75
+ this.OR([
76
+ {
77
+ GATE: () => this.LA(2).tokenType === Without,
78
+ ALT: () => {
79
+ const type = this.SUBRULE(this.seriesType);
80
+ this.CONSUME(Without);
81
+ this.OPTION(() => {
82
+ this.CONSUME(AllType);
83
+ });
84
+ const ranges = this.SUBRULE(this.rangeList);
85
+ return { negative: true, type, ranges };
86
+ },
87
+ },
88
+ {
89
+ ALT: () => {
90
+ this.CONSUME2(Without);
91
+ this.OR1([
92
+ {
93
+ GATE: this._gatePostfixTypeSeriesSpec,
94
+ ALT: () => {
95
+ const { type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec);
96
+ negativeResult = { negative: true, type, ranges };
97
+ },
98
+ },
99
+ {
100
+ ALT: () => {
101
+ const type = this.SUBRULE2(this.seriesType);
102
+ const ranges = this.SUBRULE2(this.rangeList);
103
+ negativeResult = { negative: true, type, ranges };
104
+ },
105
+ },
106
+ ]);
107
+ },
108
+ },
109
+ {
110
+ ALT: () => {
111
+ this.AT_LEAST_ONE_SEP({
112
+ SEP: Separator,
113
+ DEF: () => {
114
+ positiveResult.push(this.SUBRULE(this.seriesSpecs));
115
+ },
116
+ });
117
+ },
118
+ },
119
+ ]);
120
+ if (negativeResult) {
121
+ return negativeResult;
122
+ }
123
+ return positiveResult;
124
+ });
125
+ this.seriesSpecs = this.RULE("seriesSpecs", () => {
126
+ let ranges = [];
127
+ let type;
128
+ this.OR([
129
+ {
130
+ GATE: this._gatePostfixTypeSeriesSpec,
131
+ ALT: () => {
132
+ ({ type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec));
133
+ },
134
+ },
135
+ {
136
+ ALT: () => {
137
+ type = this.SUBRULE(this.seriesType);
138
+ this.OPTION(() => {
139
+ ranges = this.SUBRULE(this.rangeList);
140
+ });
141
+ },
142
+ },
143
+ {
144
+ ALT: () => {
145
+ ({ type, ranges } = this.SUBRULE2(this.fromAndAboveWithType));
146
+ },
147
+ },
148
+ {
149
+ ALT: () => {
150
+ ({ type, ranges } = this.SUBRULE(this.toOrBelowWithType));
151
+ },
152
+ },
153
+ ]);
154
+ return { type, ranges };
155
+ });
156
+ this._gatePostfixTypeSeriesSpec = () => {
157
+ let index = 2;
158
+ while (![Separator, EOF].includes(this.LA(index).tokenType)) {
159
+ if ([OddType, EvenType].includes(this.LA(index).tokenType)) {
160
+ return true;
161
+ }
162
+ index++;
163
+ }
164
+ return false;
165
+ };
166
+ this.postfixTypeSeriesSpec = this.RULE("postfixTypeSeriesSpec", () => {
167
+ this.CONSUME(AllType);
168
+ const ranges = [this.SUBRULE(this.rangeOrNumber)];
169
+ let type;
170
+ this.OR1([
171
+ {
172
+ ALT: () => {
173
+ this.CONSUME(OddType);
174
+ type = SeriesType.Odd;
175
+ },
176
+ },
177
+ {
178
+ ALT: () => {
179
+ this.CONSUME1(EvenType);
180
+ type = SeriesType.Even;
181
+ },
182
+ },
183
+ ]);
184
+ return { type, ranges };
185
+ });
186
+ this.rangeList = this.RULE("rangeList", () => {
187
+ let ranges = [];
188
+ ranges.push(this.SUBRULE(this.rangeOrNumber));
189
+ this.MANY({
190
+ GATE: () => [Number, To, From].includes(this.LA(2).tokenType),
191
+ DEF: () => {
192
+ this.CONSUME(Separator);
193
+ ranges.push(this.SUBRULE2(this.rangeOrNumber));
194
+ },
195
+ });
196
+ return ranges;
197
+ });
198
+ this.seriesType = this.RULE("seriesType", () => {
199
+ let type;
200
+ this.OR([
201
+ {
202
+ ALT: () => {
203
+ this.CONSUME(OddType);
204
+ type = SeriesType.Odd;
205
+ },
206
+ },
207
+ {
208
+ ALT: () => {
209
+ this.CONSUME1(EvenType);
210
+ type = SeriesType.Even;
211
+ },
212
+ },
213
+ {
214
+ ALT: () => {
215
+ this.CONSUME2(AllType);
216
+ type = SeriesType.All;
217
+ },
218
+ },
219
+ {
220
+ ALT: () => {
221
+ this.CONSUME3(DescriptiveType);
222
+ type = SeriesType.Description;
223
+ },
224
+ },
225
+ ]);
226
+ return type;
227
+ });
228
+ this.rangeOrNumber = this.RULE("rangeOrNumber", () => {
229
+ let result;
230
+ this.OR([
231
+ {
232
+ ALT: () => {
233
+ result = this.SUBRULE(this.range);
234
+ },
235
+ },
236
+ {
237
+ ALT: () => {
238
+ result = this.SUBRULE(this.fromAndAbove);
239
+ },
240
+ },
241
+ {
242
+ ALT: () => {
243
+ result = this.SUBRULE(this.toOrBelow);
244
+ },
245
+ },
246
+ {
247
+ ALT: () => {
248
+ result = this.SUBRULE(this.fullStreetNumber);
249
+ },
250
+ },
251
+ {
252
+ ALT: () => {
253
+ const n = parseRichNumber(this.CONSUME(Number).image);
254
+ result = { from: n, to: n };
255
+ },
256
+ },
257
+ ]);
258
+ return result;
259
+ });
260
+ this.range = this.RULE("range", () => {
261
+ const from = parseRichNumber(this.CONSUME(Number).image);
262
+ this.OR([
263
+ { ALT: () => this.CONSUME1(Hyphen) },
264
+ { ALT: () => this.CONSUME2(MainSeparator) },
265
+ ]);
266
+ this.OPTION(() => {
267
+ this.CONSUME(AllType);
268
+ });
269
+ const to = parseRichNumber(this.CONSUME3(Number).image);
270
+ return { from, to };
271
+ });
272
+ this.fromAndAbove = this.RULE("fromAndAbove", () => {
273
+ let from;
274
+ this.OR([
275
+ {
276
+ ALT: () => {
277
+ from = parseRichNumber(this.CONSUME(Number).image);
278
+ this.CONSUME(AndAbove);
279
+ },
280
+ },
281
+ {
282
+ ALT: () => {
283
+ this.CONSUME(From);
284
+ this.OPTION(() => {
285
+ this.CONSUME(AllType);
286
+ });
287
+ from = parseRichNumber(this.CONSUME2(Number).image);
288
+ this.OPTION2(() => {
289
+ this.CONSUME2(AndAbove);
290
+ });
291
+ },
292
+ },
293
+ ]);
294
+ return { from };
295
+ });
296
+ this.fromAndAboveWithType = this.RULE("fromAndAboveWithType", () => {
297
+ let type = SeriesType.All;
298
+ this.CONSUME(From);
299
+ this.OPTION(() => {
300
+ this.OR([
301
+ {
302
+ ALT: () => {
303
+ type = SeriesType.All;
304
+ this.CONSUME(AllType);
305
+ },
306
+ },
307
+ {
308
+ ALT: () => {
309
+ type = SeriesType.Description;
310
+ this.CONSUME(DescriptiveType);
311
+ },
312
+ },
313
+ ]);
314
+ });
315
+ const from = parseRichNumber(this.CONSUME(Number).image);
316
+ this.OPTION2(() => {
317
+ this.CONSUME(AndAbove);
318
+ });
319
+ return { type, ranges: [{ from }] };
320
+ });
321
+ this.toOrBelow = this.RULE("toOrBelow", () => {
322
+ let to;
323
+ this.OR([
324
+ {
325
+ ALT: () => {
326
+ to = parseRichNumber(this.CONSUME(Number).image);
327
+ this.CONSUME(AndBelow);
328
+ },
329
+ },
330
+ {
331
+ ALT: () => {
332
+ this.CONSUME2(To);
333
+ to = parseRichNumber(this.CONSUME2(Number).image);
334
+ },
335
+ },
336
+ ]);
337
+ return { to };
338
+ });
339
+ this.toOrBelowWithType = this.RULE("toOrBelowWithType", () => {
340
+ let type = SeriesType.All;
341
+ this.CONSUME(To);
342
+ this.OPTION(() => {
343
+ this.OR([
344
+ {
345
+ ALT: () => {
346
+ type = SeriesType.All;
347
+ this.CONSUME(AllType);
348
+ },
349
+ },
350
+ {
351
+ ALT: () => {
352
+ type = SeriesType.Description;
353
+ this.CONSUME(DescriptiveType);
354
+ },
355
+ },
356
+ ]);
357
+ });
358
+ const to = parseRichNumber(this.CONSUME(Number).image);
359
+ return { type, ranges: [{ to }] };
360
+ });
361
+ this.fullStreetNumber = this.RULE("fullStreetNumber", () => {
362
+ const descriptiveNumber = parseRichNumber(this.CONSUME(Number).image);
363
+ this.CONSUME(Slash);
364
+ const orientationNumber = parseRichNumber(this.CONSUME2(Number).image);
365
+ return {
366
+ descriptionNumber: descriptiveNumber,
367
+ orientationalNumber: orientationNumber,
368
+ };
369
+ });
370
+ this.performSelfAnalysis();
371
+ }
372
+ }
373
+ const numberWithCharacterPattern = /^(\d+)([a-z])$/;
374
+ export const parseRichNumber = (number) => {
375
+ if (numberWithCharacterPattern.test(number)) {
376
+ const match = numberWithCharacterPattern.exec(number);
377
+ return {
378
+ number: parseInt(match[1]),
379
+ letter: match[2],
380
+ };
381
+ }
382
+ else {
383
+ return {
384
+ number: parseInt(number),
385
+ };
386
+ }
387
+ };
388
+ const municipalityPartPattern = /^část (?<type>obce|města) (?<name>.+)$/;
389
+ export const parseMunicipalityPartName = (name) => {
390
+ const match = municipalityPartPattern.exec(name);
391
+ return match?.groups.name?.trim() ?? "";
392
+ };
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21kLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlZXQtbWFya2Rvd24vc21kLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLEVBQ1IsZUFBZSxFQUNmLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNOLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixFQUFFLEVBQ0YsT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFvRCxVQUFVLEVBQVcsTUFBTSxTQUFTLENBQUM7QUFFaEcsTUFBTSxPQUFPLFNBQVUsU0FBUSxxQkFBcUI7SUFDbEQsWUFBWSxlQUFnQztRQUMxQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFJbEIsV0FBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQWMsRUFBRTtZQUNsRCxJQUFJLE1BQU0sQ0FBQztZQUNYLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ047b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLE1BQU0sR0FBRzs0QkFDUCxJQUFJLEVBQUUsUUFBUTs0QkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLOzRCQUN0QyxVQUFVLEVB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Q0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO0lBQ2hFLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxPQUFPLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWJlZGRlZEFjdGlvbnNQYXJzZXIsIEVPRiwgVG9rZW5Wb2NhYnVsYXJ5IH0gZnJvbSBcImNoZXZyb3RhaW5cIjtcbmltcG9ydCB7IHNwbGl0U3RyZWV0VmlhUm9tYW5OdW1lcmFscyB9IGZyb20gXCIuL3JvbWFuLW51bWVyYWxzXCI7XG5cbmltcG9ydCB7XG4gIEFsbFR5cGUsXG4gIEFuZEFib3ZlLFxuICBBbmRCZWxvdyxcbiAgRGVzY3JpcHRpdmVUeXBlLFxuICBFdmVuVHlwZSxcbiAgRnJvbSxcbiAgSHlwaGVuLFxuICBNYWluU2VwYXJhdG9yLFxuICBNdW5pY2lwYWxpdHlQYXJ0TmFtZSxcbiAgTnVtYmVyLFxuICBPZGRUeXBlLFxuICBTZXBhcmF0b3IsXG4gIFNsYXNoLFxuICBTdHJlZXROYW1lLFxuICBUbyxcbiAgV2l0aG91dCxcbn0gZnJvbSBcIi4vdG9rZW4tZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRnVsbFN0cmVldE51bWJlciwgTmVnYXRpdmVTZXJpZXNTcGVjLCBSaWNoTnVtYmVyLCBTZXJpZXNUeXBlLCBTbWRMaW5lIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFNtZFBhcnNlciBleHRlbmRzIEVtYmVkZGVkQWN0aW9uc1BhcnNlciB7XG4gIGNvbnN0cnVjdG9yKHRva2VuVm9jYWJ1bGFyeTogVG9rZW5Wb2NhYnVsYXJ5KSB7XG4gICAgc3VwZXIodG9rZW5Wb2NhYnVsYXJ5KTtcbiAgICB0aGlzLnBlcmZvcm1TZWxmQW5hbHlzaXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdHJlZXQgPSB0aGlzLlJVTEUoXCJzdHJlZXRcIiwgKCk6IFNtZExpbmVbXSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0aGlzLk9SKFtcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMuc3RyZWV0TmFtZUFuZE51bWJlcnNTcGVjcyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmVldFwiLFxuICAgICAgICAgICAgc3RyZWV0OiB0aGlzLkNPTlNVTUUoU3RyZWV0TmFtZSkuaW1hZ2UsXG4gICAgICAgICAgICBudW1iZXJTcGVjOiBbXSxcbiAgICAgICAgICB9IGFzIFNtZExpbmU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5tdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjcyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBtdW5pY2lwYWxpdHlQYXJ0ID0gcGFyc2VNdW5pY2lwYWxpdHlQYXJ0TmFtZShcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShNdW5pY2lwYWxpdHlQYXJ0TmFtZSkuaW1hZ2VcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwibXVuaWNpcGFsaXR5UGFydFwiLFxuICAgICAgICAgICAgbXVuaWNpcGFsaXR5UGFydCxcbiAgICAgICAgICAgIG51bWJlclNwZWM6IFtdLFxuICAgICAgICAgIH0gYXMgU21kTGluZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICBpZiAocmVzdWx0LnR5cGUgPT09IFwic3RyZWV0XCIpIHtcbiAgICAgIHJldHVybiBzcGxpdFN0cmVldFZpYVJvbWFuTnVtZXJhbHMocmVzdWx0LnN0cmVldCkubWFwKChzdHJlZXQpID0+ICh7XG4gICAgICAgIHR5cGU6IFwic3RyZWV0XCIsXG4gICAgICAgIHN0cmVldCxcbiAgICAgICAgbnVtYmVyU3BlYzogcmVzdWx0Lm51bWJlclNwZWMsXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbcmVzdWx0XTtcbiAgICB9XG4gIH0pO1xuXG4gIHByaXZhdGUgc3RyZWV0TmFtZUFuZE51bWJlcnNTcGVjcyA9IHRoaXMuUlVMRShcbiAgICBcInN0cmVldE5hbWVBbmROdW1iZXJzU3BlY3NcIixcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBzdHJlZXQgPSB0aGlzLkNPTlNVTUUoU3RyZWV0TmFtZSkuaW1hZ2U7XG4gICAgICB0aGlzLk9QVElPTigoKSA9PiB7XG4gICAgICAgIHRoaXMuQ09OU1VNRShNYWluU2VwYXJhdG9yKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbnVtYmVyU3BlYyA9IHRoaXMuU1VCUlVMRSh0aGlzLm51bWJlclNwZWNzKTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyZWV0XCIsIHN0cmVldCwgbnVtYmVyU3BlYyB9IGFzIFNtZExpbmU7XG4gICAgfVxuICApO1xuXG4gIHByaXZhdGUgbXVuaWNpcGFsaXR5UGFydE5hbWVBbmROdW1iZXJzU3BlY3MgPSB0aGlzLlJVTEUoXG4gICAgXCJtdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjc1wiLFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IG11bmljaXBhbGl0eVBhcnQgPSBwYXJzZU11bmljaXBhbGl0eVBhcnROYW1lKFxuICAgICAgICB0aGlzLkNPTlNVTUUoTXVuaWNpcGFsaXR5UGFydE5hbWUpLmltYWdlXG4gICAgICApO1xuICAgICAgdGhpcy5PUFRJT04oKCkgPT4ge1xuICAgICAgICB0aGlzLkNPTlNVTUUoTWFpblNlcGFyYXRvcik7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG51bWJlclNwZWMgPSB0aGlzLlNVQlJVTEUodGhpcy5udW1iZXJTcGVjcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIm11bmljaXBhbGl0eVBhcnRcIixcbiAgICAgICAgbXVuaWNpcGFsaXR5UGFydCxcbiAgICAgICAgbnVtYmVyU3BlYyxcbiAgICAgIH0gYXMgU21kTGluZTtcbiAgICB9XG4gICk7XG5cbiAgcHJpdmF0ZSBudW1iZXJTcGVjcyA9IHRoaXMuUlVMRShcIm51bWJlclNwZWNzXCIsICgpID0+IHtcbiAgICBjb25zdCBwb3NpdGl2ZVJlc3VsdCA9IFtdO1xuICAgIGxldCBuZWdhdGl2ZVJlc3VsdDogTmVnYXRpdmVTZXJpZXNTcGVjO1xuICAgIHRoaXMuT1IoW1xuICAgICAge1xuICAgICAgICBHQVRFOiAoKSA9PiB0aGlzLkxBKDIpLnRva2VuVHlwZSA9PT0gV2l0aG91dCxcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuU1VCUlVMRSh0aGlzLnNlcmllc1R5cGUpO1xuICAgICAgICAgIHRoaXMuQ09OU1VNRShXaXRob3V0KTtcbiAgICAgICAgICB0aGlzLk9QVElPTigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkNPTlNVTUUoQWxsVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmFuZ2VzID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2VMaXN0KTtcbiAgICAgICAgICByZXR1cm4geyBuZWdhdGl2ZTogdHJ1ZSwgdHlwZSwgcmFuZ2VzIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLkNPTlNVTUUyKFdpdGhvdXQpO1xuICAgICAgICAgIHRoaXMuT1IxKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgR0FURTogdGhpcy5fZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyxcbiAgICAgICAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0eXBlLCByYW5nZXMgfSA9IHRoaXMuU1VCUlVMRShcbiAgICAgICAgICAgICAgICAgIHRoaXMucG9zdGZpeFR5cGVTZXJpZXNTcGVjXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlc3VsdCA9IHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuU1VCUlVMRTIodGhpcy5zZXJpZXNUeXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLlNVQlJVTEUyKHRoaXMucmFuZ2VMaXN0KTtcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlc3VsdCA9IHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuQVRfTEVBU1RfT05FX1NFUCh7XG4gICAgICAgICAgICBTRVA6IFNlcGFyYXRvcixcbiAgICAgICAgICAgIERFRjogKCkgPT4ge1xuICAgICAgICAgICAgICBwb3NpdGl2ZVJlc3VsdC5wdXNoKHRoaXMuU1VCUlVMRSh0aGlzLnNlcmllc1NwZWNzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBpZiAobmVnYXRpdmVSZXN1bHQpIHtcbiAgICAgIHJldHVybiBuZWdhdGl2ZVJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aXZlUmVzdWx0O1xuICB9KTtcblxuICBwcml2YXRlIHNlcmllc1NwZWNzID0gdGhpcy5SVUxFKFwic2VyaWVzU3BlY3NcIiwgKCkgPT4ge1xuICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICBsZXQgdHlwZTogU2VyaWVzVHlwZTtcbiAgICB0aGlzLk9SKFtcbiAgICAgIHtcbiAgICAgICAgR0FURTogdGhpcy5fZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyxcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgKHsgdHlwZSwgcmFuZ2VzIH0gPSB0aGlzLlNVQlJVTEUodGhpcy5wb3N0Zml4VHlwZVNlcmllc1NwZWMpKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHR5cGUgPSB0aGlzLlNVQlJVTEUodGhpcy5zZXJpZXNUeXBlKTtcbiAgICAgICAgICB0aGlzLk9QVElPTigoKSA9PiB7XG4gICAgICAgICAgICByYW5nZXMgPSB0aGlzLlNVQlJVTEUodGhpcy5yYW5nZUxpc3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgKHsgdHlwZSwgcmFuZ2VzIH0gPSB0aGlzLlNVQlJVTEUyKHRoaXMuZnJvbUFuZEFib3ZlV2l0aFR5cGUpKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgICh7IHR5cGUsIHJhbmdlcyB9ID0gdGhpcy5TVUJSVUxFKHRoaXMudG9PckJlbG93V2l0aFR5cGUpKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXMgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyA9ICgpOiBib29sZWFuID0+IHtcbiAgICBsZXQgaW5kZXggPSAyO1xuICAgIHdoaWxlICghW1NlcGFyYXRvciwgRU9GXS5pbmNsdWRlcyh0aGlzLkxBKGluZGV4KS50b2tlblR5cGUpKSB7XG4gICAgICBpZiAoW09kZFR5cGUsIEV2ZW5UeXBlXS5pbmNsdWRlcyh0aGlzLkxBKGluZGV4KS50b2tlblR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHByaXZhdGUgcG9zdGZpeFR5cGVTZXJpZXNTcGVjID0gdGhpcy5SVUxFKFwicG9zdGZpeFR5cGVTZXJpZXNTcGVjXCIsICgpID0+IHtcbiAgICB0aGlzLkNPTlNVTUUoQWxsVHlwZSk7XG4gICAgY29uc3QgcmFuZ2VzID0gW3RoaXMuU1VCUlVMRSh0aGlzLnJhbmdlT3JOdW1iZXIpXTtcbiAgICBsZXQgdHlwZTogU2VyaWVzVHlwZTtcbiAgICB0aGlzLk9SMShbXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuQ09OU1VNRShPZGRUeXBlKTtcbiAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5PZGQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLkNPTlNVTUUxKEV2ZW5UeXBlKTtcbiAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5FdmVuO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXMgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByYW5nZUxpc3QgPSB0aGlzLlJVTEUoXCJyYW5nZUxpc3RcIiwgKCkgPT4ge1xuICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICByYW5nZXMucHVzaCh0aGlzLlNVQlJVTEUodGhpcy5yYW5nZU9yTnVtYmVyKSk7XG4gICAgdGhpcy5NQU5ZKHtcbiAgICAgIEdBVEU6ICgpID0+IFtOdW1iZXIsIFRvLCBGcm9tXS5pbmNsdWRlcyh0aGlzLkxBKDIpLnRva2VuVHlwZSksXG4gICAgICBERUY6ICgpID0+IHtcbiAgICAgICAgdGhpcy5DT05TVU1FKFNlcGFyYXRvcik7XG4gICAgICAgIHJhbmdlcy5wdXNoKHRoaXMuU1VCUlVMRTIodGhpcy5yYW5nZU9yTnVtYmVyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiByYW5nZXM7XG4gIH0pO1xuXG4gIHByaXZhdGUgc2VyaWVzVHlwZSA9IHRoaXMuUlVMRShcInNlcmllc1R5cGVcIiwgKCkgPT4ge1xuICAgIGxldCB0eXBlOiBTZXJpZXNUeXBlO1xuICAgIHRoaXMuT1IoW1xuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLkNPTlNVTUUoT2RkVHlwZSk7XG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuT2RkO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5DT05TVU1FMShFdmVuVHlwZSk7XG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuRXZlbjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuQ09OU1VNRTIoQWxsVHlwZSk7XG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5DT05TVU1FMyhEZXNjcmlwdGl2ZVR5cGUpO1xuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4gdHlwZTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByYW5nZU9yTnVtYmVyID0gdGhpcy5SVUxFKFwicmFuZ2VPck51bWJlclwiLCAoKSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0aGlzLk9SKFtcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2UpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMuZnJvbUFuZEFib3ZlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuU1VCUlVMRSh0aGlzLnRvT3JCZWxvdyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5mdWxsU3RyZWV0TnVtYmVyKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xuICAgICAgICAgIHJlc3VsdCA9IHsgZnJvbTogbiwgdG86IG4gfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByYW5nZSA9IHRoaXMuUlVMRShcInJhbmdlXCIsICgpID0+IHtcbiAgICBjb25zdCBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcbiAgICB0aGlzLk9SKFtcbiAgICAgIHsgQUxUOiAoKSA9PiB0aGlzLkNPTlNVTUUxKEh5cGhlbikgfSxcbiAgICAgIHsgQUxUOiAoKSA9PiB0aGlzLkNPTlNVTUUyKE1haW5TZXBhcmF0b3IpIH0sXG4gICAgXSk7XG4gICAgdGhpcy5PUFRJT04oKCkgPT4ge1xuICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xuICAgIH0pO1xuICAgIGNvbnN0IHRvID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTMoTnVtYmVyKS5pbWFnZSk7XG4gICAgcmV0dXJuIHsgZnJvbSwgdG8gfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBmcm9tQW5kQWJvdmUgPSB0aGlzLlJVTEUoXCJmcm9tQW5kQWJvdmVcIiwgKCkgPT4ge1xuICAgIGxldCBmcm9tOiBSaWNoTnVtYmVyO1xuICAgIHRoaXMuT1IoW1xuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcbiAgICAgICAgICB0aGlzLkNPTlNVTUUoQW5kQWJvdmUpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5DT05TVU1FKEZyb20pO1xuICAgICAgICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XG4gICAgICAgICAgdGhpcy5PUFRJT04yKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRTIoQW5kQWJvdmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIHJldHVybiB7IGZyb20gfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBmcm9tQW5kQWJvdmVXaXRoVHlwZSA9IHRoaXMuUlVMRShcImZyb21BbmRBYm92ZVdpdGhUeXBlXCIsICgpID0+IHtcbiAgICBsZXQgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xuICAgIHRoaXMuQ09OU1VNRShGcm9tKTtcbiAgICB0aGlzLk9QVElPTigoKSA9PiB7XG4gICAgICB0aGlzLk9SKFtcbiAgICAgICAge1xuICAgICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgdGhpcy5DT05TVU1FKERlc2NyaXB0aXZlVHlwZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuICAgIGNvbnN0IGZyb20gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xuICAgIHRoaXMuT1BUSU9OMigoKSA9PiB7XG4gICAgICB0aGlzLkNPTlNVTUUoQW5kQWJvdmUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHR5cGUsIHJhbmdlczogW3sgZnJvbSB9XSB9O1xuICB9KTtcblxuICBwcml2YXRlIHRvT3JCZWxvdyA9IHRoaXMuUlVMRShcInRvT3JCZWxvd1wiLCAoKSA9PiB7XG4gICAgbGV0IHRvOiBSaWNoTnVtYmVyO1xuICAgIHRoaXMuT1IoW1xuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICB0byA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XG4gICAgICAgICAgdGhpcy5DT05TVU1FKEFuZEJlbG93KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuQ09OU1VNRTIoVG8pO1xuICAgICAgICAgIHRvID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHsgdG8gfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSB0b09yQmVsb3dXaXRoVHlwZSA9IHRoaXMuUlVMRShcInRvT3JCZWxvd1dpdGhUeXBlXCIsICgpID0+IHtcbiAgICBsZXQgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xuICAgIHRoaXMuQ09OU1VNRShUbyk7XG4gICAgdGhpcy5PUFRJT04oKCkgPT4ge1xuICAgICAgdGhpcy5PUihbXG4gICAgICAgIHtcbiAgICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShEZXNjcmlwdGl2ZVR5cGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcbiAgICBjb25zdCB0byA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XG4gICAgcmV0dXJuIHsgdHlwZSwgcmFuZ2VzOiBbeyB0byB9XSB9O1xuICB9KTtcblxuICBwcml2YXRlIGZ1bGxTdHJlZXROdW1iZXIgPSB0aGlzLlJVTEUoXG4gICAgXCJmdWxsU3RyZWV0TnVtYmVyXCIsXG4gICAgKCk6IEZ1bGxTdHJlZXROdW1iZXIgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpdmVOdW1iZXIgPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xuICAgICAgdGhpcy5DT05TVU1FKFNsYXNoKTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uTnVtYmVyID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXNjcmlwdGlvbk51bWJlcjogZGVzY3JpcHRpdmVOdW1iZXIsXG4gICAgICAgIG9yaWVudGF0aW9uYWxOdW1iZXI6IG9yaWVudGF0aW9uTnVtYmVyLFxuICAgICAgfTtcbiAgICB9XG4gICk7XG59XG5cbmNvbnN0IG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuID0gL14oXFxkKykoW2Etel0pJC87XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJpY2hOdW1iZXIgPSAobnVtYmVyOiBzdHJpbmcpOiBSaWNoTnVtYmVyID0+IHtcbiAgaWYgKG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuLnRlc3QobnVtYmVyKSkge1xuICAgIGNvbnN0IG1hdGNoID0gbnVtYmVyV2l0aENoYXJhY3RlclBhdHRlcm4uZXhlYyhudW1iZXIpO1xuICAgIHJldHVybiB7XG4gICAgICBudW1iZXI6IHBhcnNlSW50KG1hdGNoWzFdKSxcbiAgICAgIGxldHRlcjogbWF0Y2hbMl0sXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbnVtYmVyOiBwYXJzZUludChudW1iZXIpLFxuICAgIH07XG4gIH1cbn07XG5cbmNvbnN0IG11bmljaXBhbGl0eVBhcnRQYXR0ZXJuID0gL17EjcOhc3QgKD88dHlwZT5vYmNlfG3Em3N0YSkgKD88bmFtZT4uKykkLztcblxuZXhwb3J0IGNvbnN0IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBtdW5pY2lwYWxpdHlQYXJ0UGF0dGVybi5leGVjKG5hbWUpO1xuICByZXR1cm4gbWF0Y2g/Lmdyb3Vwcy5uYW1lPy50cmltKCkgPz8gXCJcIjtcbn07XG4iXX0=