text-to-map 1.1.28 → 1.1.30

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 (58) hide show
  1. package/dist/bin/address-points.js +1 -0
  2. package/dist/bin/cities.js +1 -0
  3. package/dist/bin/clear-all.js +8 -18
  4. package/dist/bin/constants.js +1 -0
  5. package/dist/bin/generate-syntax-diagrams.js +1 -0
  6. package/dist/bin/init-db.js +5 -15
  7. package/dist/bin/knex.js +6 -16
  8. package/dist/bin/parse-ordinance.js +60 -71
  9. package/dist/bin/polygons.js +23 -32
  10. package/dist/bin/regions.js +1 -0
  11. package/dist/bin/schools.js +1 -0
  12. package/dist/bin/streets.js +1 -0
  13. package/dist/bin/sync-all.js +1 -0
  14. package/dist/db/address-points.js +43 -54
  15. package/dist/db/cities.d.ts +5 -3
  16. package/dist/db/cities.js +56 -25
  17. package/dist/db/db.js +24 -32
  18. package/dist/db/founders.js +104 -91
  19. package/dist/db/meta.js +12 -20
  20. package/dist/db/migrations/20230704125715_initial.js +291 -303
  21. package/dist/db/migrations/20230731232915_city_positions.js +9 -21
  22. package/dist/db/migrations/20240106224603_city_polygon.js +7 -19
  23. package/dist/db/migrations/20240320200534_district_polygon.js +11 -0
  24. package/dist/db/migrations/20240729211323_ordinance_city.js +11 -0
  25. package/dist/db/regions.js +20 -28
  26. package/dist/db/schools.d.ts +1 -1
  27. package/dist/db/schools.js +18 -23
  28. package/dist/db/street-sync.js +13 -21
  29. package/dist/db/sync-log.js +25 -33
  30. package/dist/db/types.d.ts +3 -1
  31. package/dist/db/types.js +2 -1
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +12 -22
  34. package/dist/open-data-sync/address-points.js +21 -29
  35. package/dist/open-data-sync/cities.js +10 -18
  36. package/dist/open-data-sync/common.js +8 -16
  37. package/dist/open-data-sync/regions.js +13 -21
  38. package/dist/open-data-sync/schools.js +20 -28
  39. package/dist/open-data-sync/streets.js +40 -39
  40. package/dist/smd-to-csv/json-to-csv.js +1 -0
  41. package/dist/smd-to-csv/ordinance-to-csv-rules.js +4 -12
  42. package/dist/smd-to-csv/txt-to-json.js +59 -69
  43. package/dist/street-markdown/municipality.js +26 -28
  44. package/dist/street-markdown/polygons.d.ts +7 -4
  45. package/dist/street-markdown/polygons.js +190 -44
  46. package/dist/street-markdown/roman-numerals.js +1 -0
  47. package/dist/street-markdown/smd-line-parser.js +6 -8
  48. package/dist/street-markdown/smd-parser.js +2 -2
  49. package/dist/street-markdown/smd.d.ts +7 -1
  50. package/dist/street-markdown/smd.js +190 -164
  51. package/dist/street-markdown/token-definition.js +1 -0
  52. package/dist/street-markdown/types.d.ts +21 -11
  53. package/dist/street-markdown/types.js +3 -2
  54. package/dist/utils/atom.js +9 -17
  55. package/dist/utils/helpers.d.ts +3 -1
  56. package/dist/utils/helpers.js +12 -4
  57. package/dist/utils/jtsk2wgs84.js +1 -0
  58. package/package.json +5 -1
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import distance from "@turf/distance";
11
2
  import { wholeLineError } from "../street-markdown/smd";
12
3
  import { extractMunicipalityName, findClosestString, sanitizeMunicipalityName, } from "../utils/helpers";
@@ -14,8 +5,7 @@ import { getKnexDb, insertAutoincrementRow, insertMultipleRows } from "./db";
14
5
  import { MunicipalityType, } from "./types";
15
6
  const cityTypeCode = 261;
16
7
  const cityDistrictTypeCode = 263;
17
- export const insertFounders = (founders) => __awaiter(void 0, void 0, void 0, function* () {
18
- var _a, _b, _c;
8
+ export const insertFounders = async (founders) => {
19
9
  let insertedFounders = 0;
20
10
  const schoolFounderConnectionData = [];
21
11
  for (const founder of founders) {
@@ -28,7 +18,7 @@ export const insertFounders = (founders) => __awaiter(void 0, void 0, void 0, fu
28
18
  let differingSchools = [];
29
19
  let municipalityCode = -1;
30
20
  for (const school of founder.schools) {
31
- const result = yield (founder.municipalityType === MunicipalityType.City
21
+ const result = await (founder.municipalityType === MunicipalityType.City
32
22
  ? getCityOfSchool(school.izo)
33
23
  : getDistrictOfSchool(school.izo));
34
24
  if (!result) {
@@ -45,27 +35,27 @@ export const insertFounders = (founders) => __awaiter(void 0, void 0, void 0, fu
45
35
  municipalityCode = parseInt(code);
46
36
  }
47
37
  }
48
- municipalityCode = yield fixFounderProblems(founder, municipalityCode, differingSchools, extractedMunicipalityName);
38
+ municipalityCode = await fixFounderProblems(founder, municipalityCode, differingSchools, extractedMunicipalityName);
49
39
  const cityDistrictCode = founder.municipalityType === MunicipalityType.District
50
40
  ? municipalityCode.toString()
51
41
  : null;
52
42
  let cityCode = null;
53
43
  if (founder.municipalityType === MunicipalityType.City) {
54
- cityCode = (_a = municipalityCode === null || municipalityCode === void 0 ? void 0 : municipalityCode.toString()) !== null && _a !== void 0 ? _a : null;
44
+ cityCode = municipalityCode?.toString() ?? null;
55
45
  }
56
46
  else {
57
- cityCode = yield getCityCodeByDistrictCode(municipalityCode);
47
+ cityCode = await getCityCodeByDistrictCode(municipalityCode);
58
48
  }
59
- const existing = yield getKnexDb()
49
+ const existing = await getKnexDb()
60
50
  .select("*")
61
51
  .from("founder")
62
52
  .where({
63
53
  name: sanitizeMunicipalityName(founder.name),
64
54
  ico: founder.ico,
65
55
  });
66
- let founderId = (_c = (_b = existing[0]) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : null;
56
+ let founderId = existing[0]?.id ?? null;
67
57
  if (existing.length === 0) {
68
- founderId = yield insertAutoincrementRow([
58
+ founderId = await insertAutoincrementRow([
69
59
  sanitizeMunicipalityName(founder.name),
70
60
  sanitizeMunicipalityName(extractedMunicipalityName),
71
61
  founder.ico,
@@ -86,11 +76,11 @@ export const insertFounders = (founders) => __awaiter(void 0, void 0, void 0, fu
86
76
  schoolFounderConnectionData.push([school.izo, founderId]);
87
77
  });
88
78
  }
89
- const insertedConnections = yield insertMultipleRows(schoolFounderConnectionData, "school_founder", ["school_izo", "founder_id"], true);
79
+ const insertedConnections = await insertMultipleRows(schoolFounderConnectionData, "school_founder", ["school_izo", "founder_id"], true);
90
80
  return insertedFounders + insertedConnections;
91
- });
92
- const getCityOfSchool = (izo) => __awaiter(void 0, void 0, void 0, function* () {
93
- return yield getKnexDb()
81
+ };
82
+ const getCityOfSchool = async (izo) => {
83
+ return await getKnexDb()
94
84
  .select("c.name", "c.code")
95
85
  .from("school as s")
96
86
  .join("school_location as l", "s.izo", "l.school_izo")
@@ -99,9 +89,9 @@ const getCityOfSchool = (izo) => __awaiter(void 0, void 0, void 0, function* ()
99
89
  .where("s.izo", izo)
100
90
  .limit(1)
101
91
  .first();
102
- });
103
- const getDistrictOfSchool = (izo) => __awaiter(void 0, void 0, void 0, function* () {
104
- return yield getKnexDb()
92
+ };
93
+ const getDistrictOfSchool = async (izo) => {
94
+ return await getKnexDb()
105
95
  .select("d.name", "d.code")
106
96
  .from("school as s")
107
97
  .join("school_location as l", "s.izo", "l.school_izo")
@@ -110,8 +100,8 @@ const getDistrictOfSchool = (izo) => __awaiter(void 0, void 0, void 0, function*
110
100
  .where("s.izo", izo)
111
101
  .limit(1)
112
102
  .first();
113
- });
114
- const fixFounderProblems = (founder, municipalityCode, differingSchools, extractedMunicipalityName) => __awaiter(void 0, void 0, void 0, function* () {
103
+ };
104
+ const fixFounderProblems = async (founder, municipalityCode, differingSchools, extractedMunicipalityName) => {
115
105
  if (differingSchools.length === 0 ||
116
106
  differingSchools.length < founder.schools.length) {
117
107
  return municipalityCode;
@@ -119,9 +109,9 @@ const fixFounderProblems = (founder, municipalityCode, differingSchools, extract
119
109
  // either the school does not have a position (invalid RUIAN or missing building)
120
110
  // or the school is not in the same municipality as the founder
121
111
  // find all cities and their position with the same name as municipalityName
122
- const municipalities = yield findMunicipalitiesAndPositionsByNameAndType(extractedMunicipalityName, founder.municipalityType);
112
+ const municipalities = await findMunicipalitiesAndPositionsByNameAndType(extractedMunicipalityName, founder.municipalityType);
123
113
  // get one school position (if there are more schools, they should be close to each other)
124
- const schoolPosition = yield getKnexDb()
114
+ const schoolPosition = await getKnexDb()
125
115
  .select("address_point.wgs84_latitude", "address_point.wgs84_longitude")
126
116
  .from("school")
127
117
  .join("school_location", "school.izo", "school_location.school_izo")
@@ -171,8 +161,8 @@ const fixFounderProblems = (founder, municipalityCode, differingSchools, extract
171
161
  return null;
172
162
  }
173
163
  }
174
- });
175
- const getClosestCode = (from, toList) => __awaiter(void 0, void 0, void 0, function* () {
164
+ };
165
+ const getClosestCode = async (from, toList) => {
176
166
  let lowestDistance = Number.MAX_SAFE_INTEGER;
177
167
  let code = null;
178
168
  for (const place of toList) {
@@ -183,27 +173,26 @@ const getClosestCode = (from, toList) => __awaiter(void 0, void 0, void 0, funct
183
173
  }
184
174
  }
185
175
  return code;
186
- });
187
- const getCityCodeByDistrictCode = (districtCode) => __awaiter(void 0, void 0, void 0, function* () {
188
- var _d;
189
- const result = yield getKnexDb()
176
+ };
177
+ const getCityCodeByDistrictCode = async (districtCode) => {
178
+ const result = await getKnexDb()
190
179
  .first("city.code")
191
180
  .from("city_district")
192
181
  .join("city", "city_district.city_code", "city.code")
193
182
  .where("city_district.code", districtCode)
194
183
  .limit(1);
195
- return (_d = result === null || result === void 0 ? void 0 : result.code) !== null && _d !== void 0 ? _d : null;
196
- });
197
- const findMunicipalitiesAndPositionsByNameAndType = (name, type) => __awaiter(void 0, void 0, void 0, function* () {
184
+ return result?.code ?? null;
185
+ };
186
+ const findMunicipalitiesAndPositionsByNameAndType = async (name, type) => {
198
187
  const knex = getKnexDb();
199
188
  return (type === MunicipalityType.City
200
- ? yield knex
189
+ ? await knex
201
190
  .select("city.name", "city.code", "address_point.wgs84_latitude", "address_point.wgs84_longitude")
202
191
  .from("city")
203
192
  .join("address_point", "city.code", "address_point.city_code")
204
193
  .where("city.name", name)
205
194
  .groupBy("city.code")
206
- : yield knex
195
+ : await knex
207
196
  .select("city_district.name", "city_district.code", "address_point.wgs84_latitude", "address_point.wgs84_longitude")
208
197
  .from("city_district")
209
198
  .join("address_point", "city_district.code", "address_point.city_district_code")
@@ -214,7 +203,7 @@ const findMunicipalitiesAndPositionsByNameAndType = (name, type) => __awaiter(vo
214
203
  lat: row.wgs84_latitude,
215
204
  lng: row.wgs84_longitude,
216
205
  }));
217
- });
206
+ };
218
207
  const extractFounderName = (line) => {
219
208
  if (line[0] === "#") {
220
209
  return line.substring(1).trim();
@@ -228,31 +217,52 @@ const getBaseFounderQuery = () => {
228
217
  .select("f.id", "f.name", "f.ico", "f.founder_type_code", "f.city_code", "f.city_district_code")
229
218
  .from("founder as f")
230
219
  .leftJoin("city as c", "c.code", "f.city_code")
231
- .leftJoin("city_district as d", "d.code", "f.city_district_code");
220
+ .leftJoin("city_district as d", "d.code", "f.city_district_code")
221
+ .orderBy("f.founder_type_code");
232
222
  };
233
- export const getFounderById = (id) => __awaiter(void 0, void 0, void 0, function* () {
234
- const result = yield getBaseFounderQuery().where("f.id", id).first();
235
- const founder = yield resultToFounder(result);
223
+ export const getFounderById = async (id) => {
224
+ const result = await getBaseFounderQuery().where("f.id", id).first();
225
+ const founder = await resultToFounder(result);
236
226
  return {
237
- founder: founder !== null && founder !== void 0 ? founder : null,
227
+ founder: founder ?? null,
238
228
  errors: founder
239
229
  ? []
240
230
  : [wholeLineError(`Zřizovatel s id ${id} neexistuje.`, "")],
241
231
  };
242
- });
243
- export const findFounder = (nameWithHashtag) => __awaiter(void 0, void 0, void 0, function* () {
232
+ };
233
+ export const findFounder = async (nameWithHashtag) => {
244
234
  const errors = [];
235
+ // special case where we search for a city instead of a founder
236
+ if (nameWithHashtag[1] === "#") {
237
+ const cityName = nameWithHashtag.substring(2).trim();
238
+ const result = await getKnexDb()
239
+ .select("code")
240
+ .from("city")
241
+ .where("name", cityName)
242
+ .first();
243
+ return {
244
+ founder: {
245
+ name: cityName,
246
+ ico: "00000000",
247
+ originalType: cityTypeCode,
248
+ municipalityType: MunicipalityType.City,
249
+ municipalityCode: result.code,
250
+ schools: await getSchoolsByCityCode(result.code),
251
+ },
252
+ errors,
253
+ };
254
+ }
245
255
  const name = extractFounderName(nameWithHashtag);
246
- const result = yield getBaseFounderQuery()
256
+ const result = await getBaseFounderQuery()
247
257
  .where("f.name", name)
248
258
  .orWhere("c.name", name)
249
259
  .orWhere("d.name", name)
250
260
  .first();
251
261
  if (result) {
252
- return { founder: yield resultToFounder(result), errors };
262
+ return { founder: await resultToFounder(result), errors };
253
263
  }
254
264
  else {
255
- const allFounderNames = yield getAllFounderNames();
265
+ const allFounderNames = await getAllFounderNames();
256
266
  const namesList = allFounderNames
257
267
  .map((row) => row.founderName)
258
268
  .concat(allFounderNames.map((row) => row.municipalityName));
@@ -267,35 +277,35 @@ export const findFounder = (nameWithHashtag) => __awaiter(void 0, void 0, void 0
267
277
  };
268
278
  }
269
279
  errors.push(wholeLineError(`Zřizovatel '${name}' neexistuje, mysleli jste '${bestMatch}'?`, nameWithHashtag));
270
- const founder = yield getKnexDb()
280
+ const founder = await getKnexDb()
271
281
  .select("id", "name", "ico", "founder_type_code", "city_code", "city_district_code")
272
282
  .from("founder")
273
283
  .where("id", bestMatchRow.id)
274
284
  .first();
275
285
  return {
276
- founder: yield resultToFounder(founder),
286
+ founder: await resultToFounder(founder),
277
287
  errors,
278
288
  };
279
289
  }
280
- });
290
+ };
281
291
  let cachedCityCode = null;
282
292
  let cityCodeFounder = null;
283
- export const getFounderCityCode = (founder) => __awaiter(void 0, void 0, void 0, function* () {
293
+ export const getFounderCityCode = async (founder) => {
284
294
  if (founder.municipalityType === MunicipalityType.District) {
285
295
  if (cityCodeFounder !== founder) {
286
296
  cityCodeFounder = founder;
287
- cachedCityCode = (yield getKnexDb()
297
+ cachedCityCode = (await getKnexDb()
288
298
  .from("city_district")
289
- .where("code", founder.cityOrDistrictCode)
299
+ .where("code", founder.municipalityCode)
290
300
  .first()).city_code;
291
301
  }
292
302
  return cachedCityCode;
293
303
  }
294
304
  else {
295
- return founder.cityOrDistrictCode;
305
+ return founder.municipalityCode;
296
306
  }
297
- });
298
- const resultToFounder = (result) => __awaiter(void 0, void 0, void 0, function* () {
307
+ };
308
+ const resultToFounder = async (result) => {
299
309
  return {
300
310
  name: result.name,
301
311
  ico: result.ico,
@@ -303,19 +313,21 @@ const resultToFounder = (result) => __awaiter(void 0, void 0, void 0, function*
303
313
  municipalityType: result.founder_type_code === cityTypeCode
304
314
  ? MunicipalityType.City
305
315
  : MunicipalityType.District,
306
- cityOrDistrictCode: result.founder_type_code === cityTypeCode
316
+ municipalityCode: result.founder_type_code === cityTypeCode
307
317
  ? result.city_code
308
318
  : result.city_district_code,
309
- schools: yield getSchoolsByFounderId(parseInt(result.id)),
319
+ schools: await getSchoolsByCityCode(result.city_code),
310
320
  };
311
- });
312
- const getSchoolsByFounderId = (founderId) => __awaiter(void 0, void 0, void 0, function* () {
313
- const result = yield getKnexDb()
321
+ };
322
+ // in case of cities, load all schools in the city, not just the ones connected to the founder
323
+ const getSchoolsByCityCode = async (cityCode) => {
324
+ const result = await getKnexDb()
314
325
  .select("s.izo", "s.redizo", "s.name", "s.capacity", "sl.address_point_id")
315
326
  .from("school as s")
316
327
  .join("school_founder as sf", "s.izo", "sf.school_izo")
317
328
  .join("school_location as sl", "s.izo", "sl.school_izo")
318
- .where("sf.founder_id", founderId);
329
+ .join("founder as f", "sf.founder_id", "f.id")
330
+ .where("f.city_code", cityCode);
319
331
  return result.map((row) => ({
320
332
  izo: String(row.izo),
321
333
  redizo: String(row.redizo),
@@ -327,9 +339,9 @@ const getSchoolsByFounderId = (founderId) => __awaiter(void 0, void 0, void 0, f
327
339
  },
328
340
  ],
329
341
  }));
330
- });
331
- const getAllFounderNames = () => __awaiter(void 0, void 0, void 0, function* () {
332
- const result = yield getKnexDb()
342
+ };
343
+ const getAllFounderNames = async () => {
344
+ const result = await getKnexDb()
333
345
  .select("f.id", "f.name as founder_name", "c.name as city_name", "d.name as city_district_name")
334
346
  .from("founder as f")
335
347
  .leftJoin("city as c", "c.code", "f.city_code")
@@ -339,11 +351,11 @@ const getAllFounderNames = () => __awaiter(void 0, void 0, void 0, function* ()
339
351
  founderName: String(row.founder_name),
340
352
  municipalityName: String(row.city_name ? row.city_name : row.city_district_name),
341
353
  }));
342
- });
343
- export const findMunicipalityPartByName = (name, founder) => __awaiter(void 0, void 0, void 0, function* () {
354
+ };
355
+ export const findMunicipalityPartByName = async (name, founder) => {
344
356
  const errors = [];
345
- const cityCode = yield getFounderCityCode(founder);
346
- const result = yield getKnexDb()
357
+ const cityCode = await getFounderCityCode(founder);
358
+ const result = await getKnexDb()
347
359
  .first("code")
348
360
  .from("municipality_part")
349
361
  .where({ name, city_code: cityCode });
@@ -351,7 +363,7 @@ export const findMunicipalityPartByName = (name, founder) => __awaiter(void 0, v
351
363
  return { municipalityPartCode: result.code, errors };
352
364
  }
353
365
  else {
354
- const allNames = yield getAllMunicipalityPartNames(cityCode);
366
+ const allNames = await getAllMunicipalityPartNames(cityCode);
355
367
  const namesList = allNames.map((row) => row.name);
356
368
  const bestMatch = findClosestString(name, namesList);
357
369
  errors.push({
@@ -364,30 +376,30 @@ export const findMunicipalityPartByName = (name, founder) => __awaiter(void 0, v
364
376
  errors,
365
377
  };
366
378
  }
367
- });
368
- export const findMunicipalityByNameAndType = (name, type, founder) => __awaiter(void 0, void 0, void 0, function* () {
379
+ };
380
+ export const findMunicipalityByNameAndType = async (name, type, founder) => {
369
381
  const errors = [];
370
382
  const result = type === MunicipalityType.City
371
- ? yield getKnexDb().select("code").from("city").where("name", name)
372
- : yield getKnexDb()
383
+ ? await getKnexDb().select("code").from("city").where("name", name)
384
+ : await getKnexDb()
373
385
  .select("code")
374
386
  .from("city_district")
375
387
  .where("name", name)
376
- .andWhere("city_code", yield getFounderCityCode(founder));
388
+ .andWhere("city_code", await getFounderCityCode(founder));
377
389
  if (result.length > 0) {
378
390
  if (result.length > 1) {
379
- const cityCode = yield getFounderCityCode(founder);
380
- const positions = yield getKnexDb()
391
+ const cityCode = await getFounderCityCode(founder);
392
+ const positions = await getKnexDb()
381
393
  .select("city_code", "wgs84_latitude", "wgs84_longitude")
382
394
  .from("address_point")
383
395
  .groupBy("city_code")
384
396
  .whereIn("city_code", result.map((row) => row.code));
385
- const founderPosition = yield getKnexDb()
397
+ const founderPosition = await getKnexDb()
386
398
  .first("wgs84_latitude", "wgs84_longitude")
387
399
  .from("address_point")
388
400
  .groupBy("city_code")
389
401
  .where("city_code", cityCode);
390
- const closestCode = yield getClosestCode({
402
+ const closestCode = await getClosestCode({
391
403
  code: cityCode,
392
404
  lat: founderPosition.wgs84_latitude,
393
405
  lng: founderPosition.wgs84_longitude,
@@ -403,7 +415,7 @@ export const findMunicipalityByNameAndType = (name, type, founder) => __awaiter(
403
415
  }
404
416
  }
405
417
  else {
406
- const allNames = yield getAllMunicipalityNames(type);
418
+ const allNames = await getAllMunicipalityNames(type);
407
419
  const namesList = allNames.map((row) => row.name);
408
420
  const bestMatch = findClosestString(name, namesList);
409
421
  const bestMatchRow = allNames.find((municipality) => municipality.name === bestMatch);
@@ -417,21 +429,22 @@ export const findMunicipalityByNameAndType = (name, type, founder) => __awaiter(
417
429
  errors,
418
430
  };
419
431
  }
420
- });
421
- const getAllMunicipalityNames = (type) => __awaiter(void 0, void 0, void 0, function* () {
422
- return (yield getKnexDb()
432
+ };
433
+ const getAllMunicipalityNames = async (type) => {
434
+ return (await getKnexDb()
423
435
  .select("name", "code")
424
436
  .from(type === MunicipalityType.City ? "city" : "city_district")).map((row) => ({
425
437
  name: row.name,
426
438
  code: row.code,
427
439
  }));
428
- });
429
- const getAllMunicipalityPartNames = (cityCode) => __awaiter(void 0, void 0, void 0, function* () {
430
- return (yield getKnexDb()
440
+ };
441
+ const getAllMunicipalityPartNames = async (cityCode) => {
442
+ return (await getKnexDb()
431
443
  .select("name", "code")
432
444
  .from("municipality_part")
433
445
  .where("city_code", cityCode)).map((row) => ({
434
446
  name: row.name,
435
447
  code: row.code,
436
448
  }));
437
- });
449
+ };
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm91bmRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvZm91bmRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBTXhELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLHdCQUF3QixHQUN6QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0UsT0FBTyxFQUVMLGdCQUFnQixHQUlqQixNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUM7QUFDekIsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEtBQUssRUFBRSxRQUFtQixFQUFtQixFQUFFO0lBQzNFLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0lBRXZDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1FBQzlCLElBQ0UsT0FBTyxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDLElBQUk7WUFDbEQsT0FBTyxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDLFFBQVEsRUFDdEQ7WUFDQSxTQUFTO1NBQ1Y7UUFDRCxNQUFNLHlCQUF5QixHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5FLHdGQUF3RjtRQUN4RixJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTFCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNwQyxNQUFNLE1B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QyxtQkFBbUIsQ0FBQztTQUN6QixLQUFLLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUNoQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNkLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtRQUNkLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtLQUNmLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRpc3RhbmNlIGZyb20gXCJAdHVyZi9kaXN0YW5jZVwiO1xyXG5pbXBvcnQgeyB3aG9sZUxpbmVFcnJvciB9IGZyb20gXCIuLi9zdHJlZXQtbWFya2Rvd24vc21kXCI7XHJcbmltcG9ydCB7XHJcbiAgRGJNdW5pY2lwYWxpdHlSZXN1bHQsXHJcbiAgTXVuaWNpcGFsaXR5UGFydFJlc3VsdCxcclxuICBTbWRFcnJvcixcclxufSBmcm9tIFwiLi4vc3RyZWV0LW1hcmtkb3duL3R5cGVzXCI7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdE11bmljaXBhbGl0eU5hbWUsXHJcbiAgZmluZENsb3Nlc3RTdHJpbmcsXHJcbiAgc2FuaXRpemVNdW5pY2lwYWxpdHlOYW1lLFxyXG59IGZyb20gXCIuLi91dGlscy9oZWxwZXJzXCI7XHJcbmltcG9ydCB7IGdldEtuZXhEYiwgaW5zZXJ0QXV0b2luY3JlbWVudFJvdywgaW5zZXJ0TXVsdGlwbGVSb3dzIH0gZnJvbSBcIi4vZGJcIjtcclxuaW1wb3J0IHtcclxuICBGb3VuZGVyLFxyXG4gIE11bmljaXBhbGl0eVR5cGUsXHJcbiAgTXVuaWNpcGFsaXR5V2l0aFBvc2l0aW9uLFxyXG4gIFBsYWNlV2l0aFBvc2l0aW9uLFxyXG4gIFNjaG9vbCxcclxufSBmcm9tIFwiLi90eXBlc1wiO1xyXG5cclxuY29uc3QgY2l0eVR5cGVDb2RlID0gMjYxO1xyXG5jb25zdCBjaXR5RGlzdHJpY3RUeXBlQ29kZSA9IDI2MztcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRGb3VuZGVycyA9IGFzeW5jIChmb3VuZGVyczogRm91bmRlcltdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICBsZXQgaW5zZXJ0ZWRGb3VuZGVycyA9IDA7XHJcbiAgY29uc3Qgc2Nob29sRm91bmRlckNvbm5lY3Rpb25EYXRhID0gW107XHJcblxyXG4gIGZvciAoY29uc3QgZm91bmRlciBvZiBmb3VuZGVycykge1xyXG4gICAgaWYgKFxyXG4gICAgICBmb3VuZGVyLm11bmljaXBhbGl0eVR5cGUgIT09IE11bmljaXBhbGl0eVR5cGUuQ2l0eSAmJlxyXG4gICAgICBmb3VuZGVyLm11bmljaXBhbGl0eVR5cGUgIT09IE11bmljaXBhbGl0eVR5cGUuRGlzdHJpY3RcclxuICAgICkge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGV4dHJhY3RlZE11bmljaXBhbGl0eU5hbWUgPSBleHRyYWN0TXVuaWNpcGFsaXR5TmFtZShmb3VuZGVyKTtcclxuXHJcbiAgICAvLyBjaGVjayBpZiB0aGUgZXh0cmFjdGVkIG11bmljaXBhbGl0eSBuYW1lIGlzIHRoZSBzYW1lIGFzIGluIGFsbCB0aGUgc2Nob29scycgbG9jYXRpb25zXHJcbiAgICBsZXQgZGlmZmVyaW5nU2Nob29scyA9IFtdO1xyXG4gICAgbGV0IG11bmljaXBhbGl0eUNvZGUgPSAtMTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHNjaG9vbCBvZiBmb3VuZGVyLnNjaG9vbHMpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKGZvdW5kZXIubXVuaWNpcGFsaXR5VHlwZSA9PT0gTXVuaWNpcGFsaXR5VHlwZS5DaXR5XHJcbiAgICAgICAgPyBnZXRDaXR5T2ZTY2hvb2woc2Nob29sLml6bylcclxuICAgICAgICA6IGdldERpc3RyaWN0T2ZTY2hvb2woc2Nob29sLml6bykpO1xyXG4gICAgICBpZiAoIXJlc3VsdCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgYGl6bzogJHtzY2hvb2wuaXpvfSwgZXh0cmFjdGVkOiAke2V4dHJhY3RlZE11bmljaXBhbGl0eU5hbWV9LCBSVUlBTjogVU5ERUZJTkVEYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZGlmZmVyaW5nU2Nob29scy5wdXNoKHNjaG9vbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgeyBuYW1lLCBjb2RlIH0gPSByZXN1bHQ7XHJcbiAgICAgICAgaWYgKG5hbWUgIT09IGV4dHJhY3RlZE11bmljaXBhbGl0eU5hbWUpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICBgaXpvOiAke3NjaG9vbC5pem99LCBleHRyYWN0ZWQ6ICR7ZXh0cmFjdGVkTXVuaWNpcGFsaXR5TmFtZX0sIFJVSUFOOiAke25hbWV9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGRpZmZlcmluZ1NjaG9vbHMucHVzaChzY2hvb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzdG9yZSBtdW5pY2lwYWxpdHlDb2RlIGV2ZW4gaWYgdGhlIG5hbWVzIGRvbid0IG1hdGNoLCB3ZSB3aWxsIHVzZSBpdCBsYXRlclxyXG4gICAgICAgIG11bmljaXBhbGl0eUNvZGUgPSBwYXJzZUludChjb2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG11bmljaXBhbGl0eUNvZGUgPSBhd2FpdCBmaXhGb3VuZGVyUHJvYmxlbXMoXHJcbiAgICAgIGZvdW5kZXIsXHJcbiAgICAgIG11bmljaXBhbGl0eUNvZGUsXHJcbiAgICAgIGRpZmZlcmluZ1NjaG9vbHMsXHJcbiAgICAgIGV4dHJhY3RlZE11bmljaXBhbGl0eU5hbWVcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgY2l0eURpc3RyaWN0Q29kZSA9XHJcbiAgICAgIGZvdW5kZXIubXVuaWNpcGFsaXR5VHlwZSA9PT0gTXVuaWNpcGFsaXR5VHlwZS5EaXN0cmljdFxyXG4gICAgICAgID8gbXVuaWNpcGFsaXR5Q29kZS50b1N0cmluZygpXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgbGV0IGNpdHlDb2RlID0gbnVsbDtcclxuICAgIGlmIChmb3VuZGVyLm11bmljaXBhbGl0eVR5cGUgPT09IE11bmljaXBhbGl0eVR5cGUuQ2l0eSkge1xyXG4gICAgICBjaXR5Q29kZSA9IG11bmljaXBhbGl0eUNvZGU/LnRvU3RyaW5nKCkgPz8gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNpdHlDb2RlID0gYXdhaXQgZ2V0Q2l0eUNvZGVCeURpc3RyaWN0Q29kZShtdW5pY2lwYWxpdHlDb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAgIC5zZWxlY3QoXCIqXCIpXHJcbiAgICAgIC5mcm9tKFwiZm91bmRlclwiKVxyXG4gICAgICAud2hlcmUoe1xyXG4gICAgICAgIG5hbWU6IHNhbml0aXplTXVuaWNpcGFsaXR5TmFtZShmb3VuZGVyLm5hbWUpLFxyXG4gICAgICAgIGljbzogZm91bmRlci5pY28sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCBmb3VuZGVySWQgPSBleGlzdGluZ1swXT8uaWQgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAoZXhpc3RpbmcubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGZvdW5kZXJJZCA9IGF3YWl0IGluc2VydEF1dG9pbmNyZW1lbnRSb3coXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgc2FuaXRpemVNdW5pY2lwYWxpdHlOYW1lKGZvdW5kZXIubmFtZSksXHJcbiAgICAgICAgICBzYW5pdGl6ZU11bmljaXBhbGl0eU5hbWUoZXh0cmFjdGVkTXVuaWNpcGFsaXR5TmFtZSksXHJcbiAgICAgICAgICBmb3VuZGVyLmljbyxcclxuICAgICAgICAgIFN0cmluZyhmb3VuZGVyLm9yaWdpbmFsVHlwZSksXHJcbiAgICAgICAgICBjaXR5Q29kZSxcclxuICAgICAgICAgIGNpdHlEaXN0cmljdENvZGUsXHJcbiAgICAgICAgXSxcclxuICAgICAgICBcImZvdW5kZXJcIixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBcIm5hbWVcIixcclxuICAgICAgICAgIFwic2hvcnRfbmFtZVwiLFxyXG4gICAgICAgICAgXCJpY29cIixcclxuICAgICAgICAgIFwiZm91bmRlcl90eXBlX2NvZGVcIixcclxuICAgICAgICAgIFwiY2l0eV9jb2RlXCIsXHJcbiAgICAgICAgICBcImNpdHlfZGlzdHJpY3RfY29kZVwiLFxyXG4gICAgICAgIF1cclxuICAgICAgKTtcclxuICAgICAgaW5zZXJ0ZWRGb3VuZGVycysrO1xyXG4gICAgfVxyXG5cclxuICAgIGZvdW5kZXIuc2Nob29scy5mb3JFYWNoKChzY2hvb2wpID0+IHtcclxuICAgICAgc2Nob29sRm91bmRlckNvbm5lY3Rpb25EYXRhLnB1c2goW3NjaG9vbC5pem8sIGZvdW5kZXJJZF0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBpbnNlcnRlZENvbm5lY3Rpb25zID0gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgc2Nob29sRm91bmRlckNvbm5lY3Rpb25EYXRhLFxyXG4gICAgXCJzY2hvb2xfZm91bmRlclwiLFxyXG4gICAgW1wic2Nob29sX2l6b1wiLCBcImZvdW5kZXJfaWRcIl0sXHJcbiAgICB0cnVlXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGluc2VydGVkRm91bmRlcnMgKyBpbnNlcnRlZENvbm5lY3Rpb25zO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0Q2l0eU9mU2Nob29sID0gYXN5bmMgKGl6bzogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgZ2V0S25leERiKClcclxuICAgIC5zZWxlY3QoXCJjLm5hbWVcIiwgXCJjLmNvZGVcIilcclxuICAgIC5mcm9tKFwic2Nob29sIGFzIHNcIilcclxuICAgIC5qb2luKFwic2Nob29sX2xvY2F0aW9uIGFzIGxcIiwgXCJzLml6b1wiLCBcImwuc2Nob29sX2l6b1wiKVxyXG4gICAgLmpvaW4oXCJhZGRyZXNzX3BvaW50IGFzIGFcIiwgXCJsLmFkZHJlc3NfcG9pbnRfaWRcIiwgXCJhLmlkXCIpXHJcbiAgICAuam9pbihcImNpdHkgYXMgY1wiLCBcImEuY2l0eV9jb2RlXCIsIFwiYy5jb2RlXCIpXHJcbiAgICAud2hlcmUoXCJzLml6b1wiLCBpem8pXHJcbiAgICAubGltaXQoMSlcclxuICAgIC5maXJzdCgpO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0RGlzdHJpY3RPZlNjaG9vbCA9IGFzeW5jIChpem86IHN0cmluZyk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuc2VsZWN0KFwiZC5uYW1lXCIsIFwiZC5jb2RlXCIpXHJcbiAgICAuZnJvbShcInNjaG9vbCBhcyBzXCIpXHJcbiAgICAuam9pbihcInNjaG9vbF9sb2NhdGlvbiBhcyBsXCIsIFwicy5pem9cIiwgXCJsLnNjaG9vbF9pem9cIilcclxuICAgIC5qb2luKFwiYWRkcmVzc19wb2ludCBhcyBhXCIsIFwibC5hZGRyZXNzX3BvaW50X2lkXCIsIFwiYS5pZFwiKVxyXG4gICAgLmpvaW4oXCJjaXR5X2Rpc3RyaWN0IGFzIGRcIiwgXCJhLmNpdHlfZGlzdHJpY3RfY29kZVwiLCBcImQuY29kZVwiKVxyXG4gICAgLndoZXJlKFwicy5pem9cIiwgaXpvKVxyXG4gICAgLmxpbWl0KDEpXHJcbiAgICAuZmlyc3QoKTtcclxufTtcclxuXHJcbmNvbnN0IGZpeEZvdW5kZXJQcm9ibGVtcyA9IGFzeW5jIChcclxuICBmb3VuZGVyOiBGb3VuZGVyLFxyXG4gIG11bmljaXBhbGl0eUNvZGU6IG51bWJlcixcclxuICBkaWZmZXJpbmdTY2hvb2xzOiBTY2hvb2xbXSxcclxuICBleHRyYWN0ZWRNdW5pY2lwYWxpdHlOYW1lOiBzdHJpbmdcclxuKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiA9PiB7XHJcbiAgaWYgKFxyXG4gICAgZGlmZmVyaW5nU2Nob29scy5sZW5ndGggPT09IDAgfHxcclxuICAgIGRpZmZlcmluZ1NjaG9vbHMubGVuZ3RoIDwgZm91bmRlci5zY2hvb2xzLmxlbmd0aFxyXG4gICkge1xyXG4gICAgcmV0dXJuIG11bmljaXBhbGl0eUNvZGU7XHJcbiAgfVxyXG5cclxuICAvLyBlaXRoZXIgdGhlIHNjaG9vbCBkb2VzIG5vdCBoYXZlIGEgcG9zaXRpb24gKGludmFsaWQgUlVJQU4gb3IgbWlzc2luZyBidWlsZGluZylcclxuICAvLyBvciB0aGUgc2Nob29sIGlzIG5vdCBpbiB0aGUgc2FtZSBtdW5pY2lwYWxpdHkgYXMgdGhlIGZvdW5kZXJcclxuXHJcbiAgLy8gZmluZCBhbGwgY2l0aWVzIGFuZCB0aGVpciBwb3NpdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgbXVuaWNpcGFsaXR5TmFtZVxyXG4gIGNvbnN0IG11bmljaXBhbGl0aWVzID0gYXdhaXQgZmluZE11bmljaXBhbGl0aWVzQW5kUG9zaXRpb25zQnlOYW1lQW5kVHlwZShcclxuICAgIGV4dHJhY3RlZE11bmljaXBhbGl0eU5hbWUsXHJcbiAgICBmb3VuZGVyLm11bmljaXBhbGl0eVR5cGVcclxuICApO1xyXG5cclxuICAvLyBnZXQgb25lIHNjaG9vbCBwb3NpdGlvbiAoaWYgdGhlcmUgYXJlIG1vcmUgc2Nob29scywgdGhleSBzaG91bGQgYmUgY2xvc2UgdG8gZWFjaCBvdGhlcilcclxuICBjb25zdCBzY2hvb2xQb3NpdGlvbjpcclxuICAgIHwgeyB3Z3M4NF9sYXRpdHVkZTogbnVtYmVyOyB3Z3M4NF9sb25naXR1ZGU6IG51bWJlciB9XHJcbiAgICB8IHVuZGVmaW5lZCA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuc2VsZWN0KFwiYWRkcmVzc19wb2ludC53Z3M4NF9sYXRpdHVkZVwiLCBcImFkZHJlc3NfcG9pbnQud2dzODRfbG9uZ2l0dWRlXCIpXHJcbiAgICAuZnJvbShcInNjaG9vbFwiKVxyXG4gICAgLmpvaW4oXCJzY2hvb2xfbG9jYXRpb25cIiwgXCJzY2hvb2wuaXpvXCIsIFwic2Nob29sX2xvY2F0aW9uLnNjaG9vbF9pem9cIilcclxuICAgIC5qb2luKFxyXG4gICAgICBcImFkZHJlc3NfcG9pbnRcIixcclxuICAgICAgXCJzY2hvb2xfbG9jYXRpb24uYWRkcmVzc19wb2ludF9pZFwiLFxyXG4gICAgICBcImFkZHJlc3NfcG9pbnQuaWRcIlxyXG4gICAgKVxyXG4gICAgLndoZXJlSW4oXHJcbiAgICAgIFwic2Nob29sLml6b1wiLFxyXG4gICAgICBkaWZmZXJpbmdTY2hvb2xzLm1hcCgoc2Nob29sKSA9PiBzY2hvb2wuaXpvKVxyXG4gICAgKVxyXG4gICAgLmxpbWl0KDEpXHJcbiAgICAuZmlyc3QoKTtcclxuXHJcbiAgaWYgKHNjaG9vbFBvc2l0aW9uKSB7XHJcbiAgICBpZiAobXVuaWNpcGFsaXRpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGlmIChtdW5pY2lwYWxpdHlDb2RlID09PSAtMSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgYG5vIG11bmljaXBhbGl0eSBieSBuYW1lIG9yIGJ5IGxvY2F0aW9uIGZvdW5kIGZvciAke2ZvdW5kZXIubmFtZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgIFwibm8gbXVuaWNpcGFsaXR5IG1hdGNoaW5nIHRoZSBleHRyYWN0ZWQgbmFtZSwgdXNpbmcgdGhlIG11bmljaXBhbGl0eSBmcm9tIFJVSUFOIGNvZGVcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAobXVuaWNpcGFsaXRpZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIFwidXNpbmcgdGhlIG9ubHkgbXVuaWNpcGFsaXR5IGZvdW5kIG1hdGNoaW5nIHRoZSBleHRyYWN0ZWQgbmFtZVwiXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBtdW5pY2lwYWxpdGllc1swXS5jb2RlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coXCJ1c2luZyB0aGUgY2xvc2VzdCBtdW5pY2lwYWxpdHkgbWF0Y2hpbmcgdGhlIGV4dHJhY3RlZCBuYW1lXCIpO1xyXG4gICAgICByZXR1cm4gZ2V0Q2xvc2VzdENvZGUoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29kZTogMSxcclxuICAgICAgICAgIGxhdDogc2Nob29sUG9zaXRpb24ud2dzODRfbGF0aXR1ZGUsXHJcbiAgICAgICAgICBsbmc6IHNjaG9vbFBvc2l0aW9uLndnczg0X2xvbmdpdHVkZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIG11bmljaXBhbGl0aWVzLm1hcCgobXVuaWNpcGFsaXR5KSA9PiAoe1xyXG4gICAgICAgICAgY29kZTogbXVuaWNpcGFsaXR5LmNvZGUsXHJcbiAgICAgICAgICBsYXQ6IG11bmljaXBhbGl0eS5sYXQsXHJcbiAgICAgICAgICBsbmc6IG11bmljaXBhbGl0eS5sbmcsXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGlmIChtdW5pY2lwYWxpdGllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChtdW5pY2lwYWxpdGllcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICBgdXNpbmcgdGhlIGZpcnN0IG11bmljaXBhbGl0eSBtYXRjaGluZyB0aGUgZXh0cmFjdGVkIG5hbWUgKCR7bXVuaWNpcGFsaXRpZXMubGVuZ3RofSBtYXRjaGVzKSAtIHBvc3NpYmx5IGluY29ycmVjdCFgXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgIFwidXNpbmcgdGhlIG9ubHkgbXVuaWNpcGFsaXR5IGZvdW5kIG1hdGNoaW5nIHRoZSBleHRyYWN0ZWQgbmFtZVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbXVuaWNpcGFsaXRpZXNbMF0uY29kZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIGBubyBtdW5pY2lwYWxpdHkgYnkgbmFtZSBvciBieSBsb2NhdGlvbiBmb3VuZCBmb3IgJHtmb3VuZGVyLm5hbWV9YFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBnZXRDbG9zZXN0Q29kZSA9IGFzeW5jIChcclxuICBmcm9tOiBQbGFjZVdpdGhQb3NpdGlvbixcclxuICB0b0xpc3Q6IFBsYWNlV2l0aFBvc2l0aW9uW11cclxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICBsZXQgbG93ZXN0RGlzdGFuY2UgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcclxuICBsZXQgY29kZTogbnVtYmVyID0gbnVsbDtcclxuICBmb3IgKGNvbnN0IHBsYWNlIG9mIHRvTGlzdCkge1xyXG4gICAgbGV0IG11bmljaXBhbGl0eURpc3RhbmNlID0gZGlzdGFuY2UoXHJcbiAgICAgIFtwbGFjZS5sYXQsIHBsYWNlLmxuZ10sXHJcbiAgICAgIFtmcm9tLmxhdCwgZnJvbS5sbmddXHJcbiAgICApO1xyXG4gICAgaWYgKG11bmljaXBhbGl0eURpc3RhbmNlIDwgbG93ZXN0RGlzdGFuY2UpIHtcclxuICAgICAgbG93ZXN0RGlzdGFuY2UgPSBtdW5pY2lwYWxpdHlEaXN0YW5jZTtcclxuICAgICAgY29kZSA9IHBsYWNlLmNvZGU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBjb2RlO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0Q2l0eUNvZGVCeURpc3RyaWN0Q29kZSA9IGFzeW5jIChcclxuICBkaXN0cmljdENvZGU6IG51bWJlclxyXG4pOiBQcm9taXNlPG51bWJlciB8IG51bGw+ID0+IHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRLbmV4RGIoKVxyXG4gICAgLmZpcnN0KFwiY2l0eS5jb2RlXCIpXHJcbiAgICAuZnJvbShcImNpdHlfZGlzdHJpY3RcIilcclxuICAgIC5qb2luKFwiY2l0eVwiLCBcImNpdHlfZGlzdHJpY3QuY2l0eV9jb2RlXCIsIFwiY2l0eS5jb2RlXCIpXHJcbiAgICAud2hlcmUoXCJjaXR5X2Rpc3RyaWN0LmNvZGVcIiwgZGlzdHJpY3RDb2RlKVxyXG4gICAgLmxpbWl0KDEpO1xyXG4gIHJldHVybiByZXN1bHQ/LmNvZGUgPz8gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGZpbmRNdW5pY2lwYWxpdGllc0FuZFBvc2l0aW9uc0J5TmFtZUFuZFR5cGUgPSBhc3luYyAoXHJcbiAgbmFtZTogc3RyaW5nLFxyXG4gIHR5cGU6IE11bmljaXBhbGl0eVR5cGVcclxuKTogUHJvbWlzZTxNdW5pY2lwYWxpdHlXaXRoUG9zaXRpb25bXT4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICByZXR1cm4gKFxyXG4gICAgdHlwZSA9PT0gTXVuaWNpcGFsaXR5VHlwZS5DaXR5XHJcbiAgICAgID8gYXdhaXQga25leFxyXG4gICAgICAgICAgLnNlbGVjdChcclxuICAgICAgICAgICAgXCJjaXR5Lm5hbWVcIixcclxuICAgICAgICAgICAgXCJjaXR5LmNvZGVcIixcclxuICAgICAgICAgICAgXCJhZGRyZXNzX3BvaW50Lndnczg0X2xhdGl0dWRlXCIsXHJcbiAgICAgICAgICAgIFwiYWRkcmVzc19wb2ludC53Z3M4NF9sb25naXR1ZGVcIlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLmZyb20oXCJjaXR5XCIpXHJcbiAgICAgICAgICAuam9pbihcImFkZHJlc3NfcG9pbnRcIiwgXCJjaXR5LmNvZGVcIiwgXCJhZGRyZXNzX3BvaW50LmNpdHlfY29kZVwiKVxyXG4gICAgICAgICAgLndoZXJlKFwiY2l0eS5uYW1lXCIsIG5hbWUpXHJcbiAgICAgICAgICAuZ3JvdXBCeShcImNpdHkuY29kZVwiKVxyXG4gICAgICA6IGF3YWl0IGtuZXhcclxuICAgICAgICAgIC5zZWxlY3QoXHJcbiAgICAgICAgICAgIFwiY2l0eV9kaXN0cmljdC5uYW1lXCIsXHJcbiAgICAgICAgICAgIFwiY2l0eV9kaXN0cmljdC5jb2RlXCIsXHJcbiAgICAgICAgICAgIFwiYWRkcmVzc19wb2ludC53Z3M4NF9sYXRpdHVkZVwiLFxyXG4gICAgICAgICAgICBcImFkZHJlc3NfcG9pbnQud2dzODRfbG9uZ2l0dWRlXCJcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5mcm9tKFwiY2l0eV9kaXN0cmljdFwiKVxyXG4gICAgICAgICAgLmpvaW4oXHJcbiAgICAgICAgICAgIFwiYWRkcmVzc19wb2ludFwiLFxyXG4gICAgICAgICAgICBcImNpdHlfZGlzdHJpY3QuY29kZVwiLFxyXG4gICAgICAgICAgICBcImFkZHJlc3NfcG9pbnQuY2l0eV9kaXN0cmljdF9jb2RlXCJcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC53aGVyZShcImNpdHlfZGlzdHJpY3QubmFtZVwiLCBuYW1lKVxyXG4gICAgICAgICAgLmdyb3VwQnkoXCJjaXR5X2Rpc3RyaWN0LmNvZGVcIilcclxuICApLm1hcCgocm93KSA9PiAoe1xyXG4gICAgY29kZTogcm93LmNvZGUsXHJcbiAgICB0eXBlLFxyXG4gICAgbGF0OiByb3cud2dzODRfbGF0aXR1ZGUsXHJcbiAgICBsbmc6IHJvdy53Z3M4NF9sb25naXR1ZGUsXHJcbiAgfSkpO1xyXG59O1xyXG5cclxuY29uc3QgZXh0cmFjdEZvdW5kZXJOYW1lID0gKGxpbmU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKGxpbmVbMF0gPT09IFwiI1wiKSB7XHJcbiAgICByZXR1cm4gbGluZS5zdWJzdHJpbmcoMSkudHJpbSgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gbGluZS50cmltKCk7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgZ2V0QmFzZUZvdW5kZXJRdWVyeSA9ICgpID0+IHtcclxuICByZXR1cm4gZ2V0S25leERiKClcclxuICAgIC5zZWxlY3QoXHJcbiAgICAgIFwiZi5pZFwiLFxyXG4gICAgICBcImYubmFtZVwiLFxyXG4gICAgICBcImYuaWNvXCIsXHJcbiAgICAgIFwiZi5mb3VuZGVyX3R5cGVfY29kZVwiLFxyXG4gICAgICBcImYuY2l0eV9jb2RlXCIsXHJcbiAgICAgIFwiZi5jaXR5X2Rpc3RyaWN0X2NvZGVcIlxyXG4gICAgKVxyXG4gICAgLmZyb20oXCJmb3VuZGVyIGFzIGZcIilcclxuICAgIC5sZWZ0Sm9pbihcImNpdHkgYXMgY1wiLCBcImMuY29kZVwiLCBcImYuY2l0eV9jb2RlXCIpXHJcbiAgICAubGVmdEpvaW4oXCJjaXR5X2Rpc3RyaWN0IGFzIGRcIiwgXCJkLmNvZGVcIiwgXCJmLmNpdHlfZGlzdHJpY3RfY29kZVwiKVxyXG4gICAgLm9yZGVyQnkoXCJmLmZvdW5kZXJfdHlwZV9jb2RlXCIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZvdW5kZXJCeUlkID0gYXN5bmMgKFxyXG4gIGlkOiBudW1iZXJcclxuKTogUHJvbWlzZTx7IGZvdW5kZXI6IEZvdW5kZXI7IGVycm9yczogU21kRXJyb3JbXSB9PiA9PiB7XHJcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0QmFzZUZvdW5kZXJRdWVyeSgpLndoZXJlKFwiZi5pZFwiLCBpZCkuZmlyc3QoKTtcclxuICBjb25zdCBmb3VuZGVyID0gYXdhaXQgcmVzdWx0VG9Gb3VuZGVyKHJlc3VsdCk7XHJcbiAgcmV0dXJuIHtcclxuICAgIGZvdW5kZXI6IGZvdW5kZXIgPz8gbnVsbCxcclxuICAgIGVycm9yczogZm91bmRlclxyXG4gICAgICA/IFtdXHJcbiAgICAgIDogW3dob2xlTGluZUVycm9yKGBaxZlpem92YXRlbCBzIGlkICR7aWR9IG5lZXhpc3R1amUuYCwgXCJcIildLFxyXG4gIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZmluZEZvdW5kZXIgPSBhc3luYyAoXHJcbiAgbmFtZVdpdGhIYXNodGFnOiBzdHJpbmdcclxuKTogUHJvbWlzZTx7IGZvdW5kZXI6IEZvdW5kZXI7IGVycm9yczogU21kRXJyb3JbXSB9PiA9PiB7XHJcbiAgY29uc3QgZXJyb3JzOiBTbWRFcnJvcltdID0gW107XHJcblxyXG4gIC8vIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBzZWFyY2ggZm9yIGEgY2l0eSBpbnN0ZWFkIG9mIGEgZm91bmRlclxyXG4gIGlmIChuYW1lV2l0aEhhc2h0YWdbMV0gPT09IFwiI1wiKSB7XHJcbiAgICBjb25zdCBjaXR5TmFtZSA9IG5hbWVXaXRoSGFzaHRhZy5zdWJzdHJpbmcoMikudHJpbSgpO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0S25leERiKClcclxuICAgICAgLnNlbGVjdChcImNvZGVcIilcclxuICAgICAgLmZyb20oXCJjaXR5XCIpXHJcbiAgICAgIC53aGVyZShcIm5hbWVcIiwgY2l0eU5hbWUpXHJcbiAgICAgIC5maXJzdCgpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZvdW5kZXI6IHtcclxuICAgICAgICBuYW1lOiBjaXR5TmFtZSxcclxuICAgICAgICBpY286IFwiMDAwMDAwMDBcIixcclxuICAgICAgICBvcmlnaW5hbFR5cGU6IGNpdHlUeXBlQ29kZSxcclxuICAgICAgICBtdW5pY2lwYWxpdHlUeXBlOiBNdW5pY2lwYWxpdHlUeXBlLkNpdHksXHJcbiAgICAgICAgbXVuaWNpcGFsaXR5Q29kZTogcmVzdWx0LmNvZGUsXHJcbiAgICAgICAgc2Nob29sczogYXdhaXQgZ2V0U2Nob29sc0J5Q2l0eUNvZGUocmVzdWx0LmNvZGUpLFxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcnMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbmFtZSA9IGV4dHJhY3RGb3VuZGVyTmFtZShuYW1lV2l0aEhhc2h0YWcpO1xyXG5cclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRCYXNlRm91bmRlclF1ZXJ5KClcclxuICAgIC53aGVyZShcImYubmFtZVwiLCBuYW1lKVxyXG4gICAgLm9yV2hlcmUoXCJjLm5hbWVcIiwgbmFtZSlcclxuICAgIC5vcldoZXJlKFwiZC5uYW1lXCIsIG5hbWUpXHJcbiAgICAuZmlyc3QoKTtcclxuICBpZiAocmVzdWx0KSB7XHJcbiAgICByZXR1cm4geyBmb3VuZGVyOiBhd2FpdCByZXN1bHRUb0ZvdW5kZXIocmVzdWx0KSwgZXJyb3JzIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGFsbEZvdW5kZXJOYW1lcyA9IGF3YWl0IGdldEFsbEZvdW5kZXJOYW1lcygpO1xyXG4gICAgY29uc3QgbmFtZXNMaXN0ID0gYWxsRm91bmRlck5hbWVzXHJcbiAgICAgIC5tYXAoKHJvdykgPT4gcm93LmZvdW5kZXJOYW1lKVxyXG4gICAgICAuY29uY2F0KGFsbEZvdW5kZXJOYW1lcy5tYXAoKHJvdykgPT4gcm93Lm11bmljaXBhbGl0eU5hbWUpKTtcclxuICAgIGNvbnN0IGJlc3RNYXRjaCA9IGZpbmRDbG9zZXN0U3RyaW5nKG5hbWUsIG5hbWVzTGlzdCk7XHJcbiAgICBjb25zdCBiZXN0TWF0Y2hSb3cgPSBhbGxGb3VuZGVyTmFtZXMuZmluZChcclxuICAgICAgKGZvdW5kZXJzTmFtZXMpID0+XHJcbiAgICAgICAgZm91bmRlcnNOYW1lcy5mb3VuZGVyTmFtZSA9PT0gYmVzdE1hdGNoIHx8XHJcbiAgICAgICAgZm91bmRlcnNOYW1lcy5tdW5pY2lwYWxpdHlOYW1lID09PSBiZXN0TWF0Y2hcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFiZXN0TWF0Y2hSb3cpIHtcclxuICAgICAgZXJyb3JzLnB1c2goXHJcbiAgICAgICAgd2hvbGVMaW5lRXJyb3IoXHJcbiAgICAgICAgICBgTmVuYcWhbGkganNtZSDFvsOhZG7DqSB6xZlpem92YXRlbGUsIG5lanNww63FoSBqc3RlIHphcG9tbsSbbGkgaW5pY2lhbGl6b3ZhdCBkYXRhYsOhemkuYCxcclxuICAgICAgICAgIG5hbWVXaXRoSGFzaHRhZ1xyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBmb3VuZGVyOiBudWxsLFxyXG4gICAgICAgIGVycm9ycyxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBlcnJvcnMucHVzaChcclxuICAgICAgd2hvbGVMaW5lRXJyb3IoXHJcbiAgICAgICAgYFrFmWl6b3ZhdGVsICcke25hbWV9JyBuZWV4aXN0dWplLCBteXNsZWxpIGpzdGUgJyR7YmVzdE1hdGNofSc/YCxcclxuICAgICAgICBuYW1lV2l0aEhhc2h0YWdcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBmb3VuZGVyID0gYXdhaXQgZ2V0S25leERiKClcclxuICAgICAgLnNlbGVjdChcclxuICAgICAgICBcImlkXCIsXHJcbiAgICAgICAgXCJuYW1lXCIsXHJcbiAgICAgICAgXCJpY29cIixcclxuICAgICAgICBcImZvdW5kZXJfdHlwZV9jb2RlXCIsXHJcbiAgICAgICAgXCJjaXR5X2NvZGVcIixcclxuICAgICAgICBcImNpdHlfZGlzdHJpY3RfY29kZVwiXHJcbiAgICAgIClcclxuICAgICAgLmZyb20oXCJmb3VuZGVyXCIpXHJcbiAgICAgIC53aGVyZShcImlkXCIsIGJlc3RNYXRjaFJvdy5pZClcclxuICAgICAgLmZpcnN0KCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmb3VuZGVyOiBhd2FpdCByZXN1bHRUb0ZvdW5kZXIoZm91bmRlciksXHJcbiAgICAgIGVycm9ycyxcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxubGV0IGNhY2hlZENpdHlDb2RlOiBudW1iZXIgPSBudWxsO1xyXG5sZXQgY2l0eUNvZGVGb3VuZGVyOiBGb3VuZGVyID0gbnVsbDtcclxuZXhwb3J0IGNvbnN0IGdldEZvdW5kZXJDaXR5Q29kZSA9IGFzeW5jIChmb3VuZGVyOiBGb3VuZGVyKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICBpZiAoZm91bmRlci5tdW5pY2lwYWxpdHlUeXBlID09PSBNdW5pY2lwYWxpdHlUeXBlLkRpc3RyaWN0KSB7XHJcbiAgICBpZiAoY2l0eUNvZGVGb3VuZGVyICE9PSBmb3VuZGVyKSB7XHJcbiAgICAgIGNpdHlDb2RlRm91bmRlciA9IGZvdW5kZXI7XHJcbiAgICAgIGNhY2hlZENpdHlDb2RlID0gKFxyXG4gICAgICAgIGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAgICAgICAuZnJvbShcImNpdHlfZGlzdHJpY3RcIilcclxuICAgICAgICAgIC53aGVyZShcImNvZGVcIiwgZm91bmRlci5tdW5pY2lwYWxpdHlDb2RlKVxyXG4gICAgICAgICAgLmZpcnN0KClcclxuICAgICAgKS5jaXR5X2NvZGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2FjaGVkQ2l0eUNvZGU7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBmb3VuZGVyLm11bmljaXBhbGl0eUNvZGU7XHJcbiAgfVxyXG59O1xyXG5cclxuaW50ZXJmYWNlIEZvdW5kZXJOYW1lcyB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBmb3VuZGVyTmFtZTogc3RyaW5nO1xyXG4gIG11bmljaXBhbGl0eU5hbWU6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgcmVzdWx0VG9Gb3VuZGVyID0gYXN5bmMgKHJlc3VsdDogYW55KTogUHJvbWlzZTxGb3VuZGVyPiA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgaWNvOiByZXN1bHQuaWNvLFxyXG4gICAgb3JpZ2luYWxUeXBlOiByZXN1bHQuZm91bmRlcl90eXBlX2NvZGUsXHJcbiAgICBtdW5pY2lwYWxpdHlUeXBlOlxyXG4gICAgICByZXN1bHQuZm91bmRlcl90eXBlX2NvZGUgPT09IGNpdHlUeXBlQ29kZVxyXG4gICAgICAgID8gTXVuaWNpcGFsaXR5VHlwZS5DaXR5XHJcbiAgICAgICAgOiBNdW5pY2lwYWxpdHlUeXBlLkRpc3RyaWN0LFxyXG4gICAgbXVuaWNpcGFsaXR5Q29kZTpcclxuICAgICAgcmVzdWx0LmZvdW5kZXJfdHlwZV9jb2RlID09PSBjaXR5VHlwZUNvZGVcclxuICAgICAgICA/IHJlc3VsdC5jaXR5X2NvZGVcclxuICAgICAgICA6IHJlc3VsdC5jaXR5X2Rpc3RyaWN0X2NvZGUsXHJcbiAgICBzY2hvb2xzOiBhd2FpdCBnZXRTY2hvb2xzQnlDaXR5Q29kZShyZXN1bHQuY2l0eV9jb2RlKSxcclxuICB9O1xyXG59O1xyXG5cclxuLy8gaW4gY2FzZSBvZiBjaXRpZXMsIGxvYWQgYWxsIHNjaG9vbHMgaW4gdGhlIGNpdHksIG5vdCBqdXN0IHRoZSBvbmVzIGNvbm5lY3RlZCB0byB0aGUgZm91bmRlclxyXG5jb25zdCBnZXRTY2hvb2xzQnlDaXR5Q29kZSA9IGFzeW5jIChjaXR5Q29kZTogbnVtYmVyKTogUHJvbWlzZTxTY2hvb2xbXT4gPT4ge1xyXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuc2VsZWN0KFwicy5pem9cIiwgXCJzLnJlZGl6b1wiLCBcInMubmFtZVwiLCBcInMuY2FwYWNpdHlcIiwgXCJzbC5hZGRyZXNzX3BvaW50X2lkXCIpXHJcbiAgICAuZnJvbShcInNjaG9vbCBhcyBzXCIpXHJcbiAgICAuam9pbihcInNjaG9vbF9mb3VuZGVyIGFzIHNmXCIsIFwicy5pem9cIiwgXCJzZi5zY2hvb2xfaXpvXCIpXHJcbiAgICAuam9pbihcInNjaG9vbF9sb2NhdGlvbiBhcyBzbFwiLCBcInMuaXpvXCIsIFwic2wuc2Nob29sX2l6b1wiKVxyXG4gICAgLmpvaW4oXCJmb3VuZGVyIGFzIGZcIiwgXCJzZi5mb3VuZGVyX2lkXCIsIFwiZi5pZFwiKVxyXG4gICAgLndoZXJlKFwiZi5jaXR5X2NvZGVcIiwgY2l0eUNvZGUpO1xyXG5cclxuICByZXR1cm4gcmVzdWx0Lm1hcCgocm93KSA9PiAoe1xyXG4gICAgaXpvOiBTdHJpbmcocm93Lml6byksXHJcbiAgICByZWRpem86IFN0cmluZyhyb3cucmVkaXpvKSxcclxuICAgIG5hbWU6IFN0cmluZyhyb3cubmFtZSksXHJcbiAgICBjYXBhY2l0eTogcGFyc2VJbnQocm93LmNhcGFjaXR5KSxcclxuICAgIGxvY2F0aW9uczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgYWRkcmVzc1BvaW50SWQ6IHBhcnNlSW50KHJvdy5hZGRyZXNzX3BvaW50X2lkKSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgfSkpO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0QWxsRm91bmRlck5hbWVzID0gYXN5bmMgKCk6IFByb21pc2U8Rm91bmRlck5hbWVzW10+ID0+IHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRLbmV4RGIoKVxyXG4gICAgLnNlbGVjdChcclxuICAgICAgXCJmLmlkXCIsXHJcbiAgICAgIFwiZi5uYW1lIGFzIGZvdW5kZXJfbmFtZVwiLFxyXG4gICAgICBcImMubmFtZSBhcyBjaXR5X25hbWVcIixcclxuICAgICAgXCJkLm5hbWUgYXMgY2l0eV9kaXN0cmljdF9uYW1lXCJcclxuICAgIClcclxuICAgIC5mcm9tKFwiZm91bmRlciBhcyBmXCIpXHJcbiAgICAubGVmdEpvaW4oXCJjaXR5IGFzIGNcIiwgXCJjLmNvZGVcIiwgXCJmLmNpdHlfY29kZVwiKVxyXG4gICAgLmxlZnRKb2luKFwiY2l0eV9kaXN0cmljdCBhcyBkXCIsIFwiZC5jb2RlXCIsIFwiZi5jaXR5X2Rpc3RyaWN0X2NvZGVcIik7XHJcbiAgcmV0dXJuIHJlc3VsdC5tYXAoKHJvdykgPT4gKHtcclxuICAgIGlkOiBwYXJzZUludChyb3cuaWQpLFxyXG4gICAgZm91bmRlck5hbWU6IFN0cmluZyhyb3cuZm91bmRlcl9uYW1lKSxcclxuICAgIG11bmljaXBhbGl0eU5hbWU6IFN0cmluZyhcclxuICAgICAgcm93LmNpdHlfbmFtZSA/IHJvdy5jaXR5X25hbWUgOiByb3cuY2l0eV9kaXN0cmljdF9uYW1lXHJcbiAgICApLFxyXG4gIH0pKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaW5kTXVuaWNpcGFsaXR5UGFydEJ5TmFtZSA9IGFzeW5jIChcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgZm91bmRlcjogRm91bmRlclxyXG4pOiBQcm9taXNlPE11bmljaXBhbGl0eVBhcnRSZXN1bHQ+ID0+IHtcclxuICBjb25zdCBlcnJvcnM6IFNtZEVycm9yW10gPSBbXTtcclxuICBjb25zdCBjaXR5Q29kZSA9IGF3YWl0IGdldEZvdW5kZXJDaXR5Q29kZShmb3VuZGVyKTtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRLbmV4RGIoKVxyXG4gICAgLmZpcnN0KFwiY29kZVwiKVxyXG4gICAgLmZyb20oXCJtdW5pY2lwYWxpdHlfcGFydFwiKVxyXG4gICAgLndoZXJlKHsgbmFtZSwgY2l0eV9jb2RlOiBjaXR5Q29kZSB9KTtcclxuXHJcbiAgaWYgKHJlc3VsdCkge1xyXG4gICAgcmV0dXJuIHsgbXVuaWNpcGFsaXR5UGFydENvZGU6IHJlc3VsdC5jb2RlLCBlcnJvcnMgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgYWxsTmFtZXMgPSBhd2FpdCBnZXRBbGxNdW5pY2lwYWxpdHlQYXJ0TmFtZXMoY2l0eUNvZGUpO1xyXG4gICAgY29uc3QgbmFtZXNMaXN0ID0gYWxsTmFtZXMubWFwKChyb3cpID0+IHJvdy5uYW1lKTtcclxuICAgIGNvbnN0IGJlc3RNYXRjaCA9IGZpbmRDbG9zZXN0U3RyaW5nKG5hbWUsIG5hbWVzTGlzdCk7XHJcblxyXG4gICAgZXJyb3JzLnB1c2goe1xyXG4gICAgICBtZXNzYWdlOiBgT2JlYyBhbmkgbcSbc3Rza8OhIMSNw6FzdCAnJHtuYW1lfScgbmVleGlzdHVqZSwgbXlzbGVsaSBqc3RlICcke2Jlc3RNYXRjaH0nP2AsXHJcbiAgICAgIHN0YXJ0T2Zmc2V0OiAwLFxyXG4gICAgICBlbmRPZmZzZXQ6IDAsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtdW5pY2lwYWxpdHlQYXJ0Q29kZTogbnVsbCxcclxuICAgICAgZXJyb3JzLFxyXG4gICAgfTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZmluZE11bmljaXBhbGl0eUJ5TmFtZUFuZFR5cGUgPSBhc3luYyAoXHJcbiAgbmFtZTogc3RyaW5nLFxyXG4gIHR5cGU6IE11bmljaXBhbGl0eVR5cGUsXHJcbiAgZm91bmRlcjogRm91bmRlclxyXG4pOiBQcm9taXNlPERiTXVuaWNpcGFsaXR5UmVzdWx0PiA9PiB7XHJcbiAgY29uc3QgZXJyb3JzOiBTbWRFcnJvcltdID0gW107XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9XHJcbiAgICB0eXBlID09PSBNdW5pY2lwYWxpdHlUeXBlLkNpdHlcclxuICAgICAgPyBhd2FpdCBnZXRLbmV4RGIoKS5zZWxlY3QoXCJjb2RlXCIpLmZyb20oXCJjaXR5XCIpLndoZXJlKFwibmFtZVwiLCBuYW1lKVxyXG4gICAgICA6IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAgICAgICAuc2VsZWN0KFwiY29kZVwiKVxyXG4gICAgICAgICAgLmZyb20oXCJjaXR5X2Rpc3RyaWN0XCIpXHJcbiAgICAgICAgICAud2hlcmUoXCJuYW1lXCIsIG5hbWUpXHJcbiAgICAgICAgICAuYW5kV2hlcmUoXCJjaXR5X2NvZGVcIiwgYXdhaXQgZ2V0Rm91bmRlckNpdHlDb2RlKGZvdW5kZXIpKTtcclxuXHJcbiAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XHJcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgY29uc3QgY2l0eUNvZGUgPSBhd2FpdCBnZXRGb3VuZGVyQ2l0eUNvZGUoZm91bmRlcik7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAgICAgLnNlbGVjdChcImNpdHlfY29kZVwiLCBcIndnczg0X2xhdGl0dWRlXCIsIFwid2dzODRfbG9uZ2l0dWRlXCIpXHJcbiAgICAgICAgLmZyb20oXCJhZGRyZXNzX3BvaW50XCIpXHJcbiAgICAgICAgLmdyb3VwQnkoXCJjaXR5X2NvZGVcIilcclxuICAgICAgICAud2hlcmVJbihcclxuICAgICAgICAgIFwiY2l0eV9jb2RlXCIsXHJcbiAgICAgICAgICByZXN1bHQubWFwKChyb3cpID0+IHJvdy5jb2RlKVxyXG4gICAgICAgICk7XHJcbiAgICAgIGNvbnN0IGZvdW5kZXJQb3NpdGlvbiA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAgICAgLmZpcnN0KFwid2dzODRfbGF0aXR1ZGVcIiwgXCJ3Z3M4NF9sb25naXR1ZGVcIilcclxuICAgICAgICAuZnJvbShcImFkZHJlc3NfcG9pbnRcIilcclxuICAgICAgICAuZ3JvdXBCeShcImNpdHlfY29kZVwiKVxyXG4gICAgICAgIC53aGVyZShcImNpdHlfY29kZVwiLCBjaXR5Q29kZSk7XHJcbiAgICAgIGNvbnN0IGNsb3Nlc3RDb2RlID0gYXdhaXQgZ2V0Q2xvc2VzdENvZGUoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29kZTogY2l0eUNvZGUsXHJcbiAgICAgICAgICBsYXQ6IGZvdW5kZXJQb3NpdGlvbi53Z3M4NF9sYXRpdHVkZSxcclxuICAgICAgICAgIGxuZzogZm91bmRlclBvc2l0aW9uLndnczg0X2xvbmdpdHVkZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBvc2l0aW9ucy5tYXAoKHJvdykgPT4gKHtcclxuICAgICAgICAgIGNvZGU6IHJvdy5jaXR5X2NvZGUsXHJcbiAgICAgICAgICBsYXQ6IHJvdy53Z3M4NF9sYXRpdHVkZSxcclxuICAgICAgICAgIGxuZzogcm93Lndnczg0X2xvbmdpdHVkZSxcclxuICAgICAgICB9KSlcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHsgbXVuaWNpcGFsaXR5OiB7IGNvZGU6IGNsb3Nlc3RDb2RlLCB0eXBlIH0sIGVycm9ycyB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHsgbXVuaWNpcGFsaXR5OiB7IGNvZGU6IHJlc3VsdFswXS5jb2RlLCB0eXBlIH0sIGVycm9ycyB9O1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBhbGxOYW1lcyA9IGF3YWl0IGdldEFsbE11bmljaXBhbGl0eU5hbWVzKHR5cGUpO1xyXG4gICAgY29uc3QgbmFtZXNMaXN0ID0gYWxsTmFtZXMubWFwKChyb3cpID0+IHJvdy5uYW1lKTtcclxuICAgIGNvbnN0IGJlc3RNYXRjaCA9IGZpbmRDbG9zZXN0U3RyaW5nKG5hbWUsIG5hbWVzTGlzdCk7XHJcbiAgICBjb25zdCBiZXN0TWF0Y2hSb3cgPSBhbGxOYW1lcy5maW5kKFxyXG4gICAgICAobXVuaWNpcGFsaXR5KSA9PiBtdW5pY2lwYWxpdHkubmFtZSA9PT0gYmVzdE1hdGNoXHJcbiAgICApO1xyXG5cclxuICAgIGVycm9ycy5wdXNoKHtcclxuICAgICAgbWVzc2FnZTogYE9iZWMgYW5pIG3Em3N0c2vDoSDEjcOhc3QgJyR7bmFtZX0nIG5lZXhpc3R1amUsIG15c2xlbGkganN0ZSAnJHtiZXN0TWF0Y2h9Jz9gLFxyXG4gICAgICBzdGFydE9mZnNldDogMCxcclxuICAgICAgZW5kT2Zmc2V0OiAwLFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbXVuaWNpcGFsaXR5OiB7IGNvZGU6IGJlc3RNYXRjaFJvdy5jb2RlLCB0eXBlIH0sXHJcbiAgICAgIGVycm9ycyxcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgZ2V0QWxsTXVuaWNpcGFsaXR5TmFtZXMgPSBhc3luYyAoXHJcbiAgdHlwZTogTXVuaWNpcGFsaXR5VHlwZVxyXG4pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBjb2RlOiBudW1iZXIgfVtdPiA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAgIC5zZWxlY3QoXCJuYW1lXCIsIFwiY29kZVwiKVxyXG4gICAgICAuZnJvbSh0eXBlID09PSBNdW5pY2lwYWxpdHlUeXBlLkNpdHkgPyBcImNpdHlcIiA6IFwiY2l0eV9kaXN0cmljdFwiKVxyXG4gICkubWFwKChyb3cpID0+ICh7XHJcbiAgICBuYW1lOiByb3cubmFtZSxcclxuICAgIGNvZGU6IHJvdy5jb2RlLFxyXG4gIH0pKTtcclxufTtcclxuXHJcbmNvbnN0IGdldEFsbE11bmljaXBhbGl0eVBhcnROYW1lcyA9IGFzeW5jIChcclxuICBjaXR5Q29kZTogbnVtYmVyXHJcbik6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IGNvZGU6IG51bWJlciB9W10+ID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgYXdhaXQgZ2V0S25leERiKClcclxuICAgICAgLnNlbGVjdChcIm5hbWVcIiwgXCJjb2RlXCIpXHJcbiAgICAgIC5mcm9tKFwibXVuaWNpcGFsaXR5X3BhcnRcIilcclxuICAgICAgLndoZXJlKFwiY2l0eV9jb2RlXCIsIGNpdHlDb2RlKVxyXG4gICkubWFwKChyb3cpID0+ICh7XHJcbiAgICBuYW1lOiByb3cubmFtZSxcclxuICAgIGNvZGU6IHJvdy5jb2RlLFxyXG4gIH0pKTtcclxufTtcclxuIl19
package/dist/db/meta.js CHANGED
@@ -1,34 +1,26 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import { getKnexDb } from "./db";
11
- export const getMetaValue = (key) => __awaiter(void 0, void 0, void 0, function* () {
2
+ export const getMetaValue = async (key) => {
12
3
  const knex = getKnexDb();
13
- const result = yield knex.pluck("value").from("meta").where({ key });
4
+ const result = await knex.pluck("value").from("meta").where({ key });
14
5
  return result.length > 0 ? result[0] : undefined;
15
- });
16
- export const setMetaValue = (key, value) => __awaiter(void 0, void 0, void 0, function* () {
6
+ };
7
+ export const setMetaValue = async (key, value) => {
17
8
  const knex = getKnexDb();
18
- if ((yield getMetaValue(key)) === undefined) {
19
- yield knex.from("meta").insert({ key, value });
9
+ if (await getMetaValue(key) === undefined) {
10
+ await knex.from("meta").insert({ key, value });
20
11
  }
21
12
  else {
22
- yield knex.from("meta").update({ value }).where({ key });
13
+ await knex.from("meta").update({ value }).where({ key });
23
14
  }
24
- });
15
+ };
25
16
  export const setCurrentDatetimeMetaValue = (key) => {
26
17
  setMetaValue(key, new Date().toISOString());
27
18
  };
28
- export const getDatetimeMetaValue = (key) => __awaiter(void 0, void 0, void 0, function* () {
29
- const value = yield getMetaValue(key);
19
+ export const getDatetimeMetaValue = async (key) => {
20
+ const value = await getMetaValue(key);
30
21
  if (value === undefined) {
31
22
  return undefined;
32
23
  }
33
24
  return new Date(value);
34
- });
25
+ };
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi9tZXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxHQUFXLEVBQStCLEVBQUU7SUFDN0UsTUFBTSxJQUFJLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ25ELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxLQUFLLEVBQUUsR0FBVyxFQUFFLEtBQVUsRUFBRSxFQUFFO0lBQzVELE1BQU0sSUFBSSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ3pCLElBQUksTUFBTSxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO1FBQ3pDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNoRDtTQUFNO1FBQ0wsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUMxRDtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDekQsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUFFLEdBQVcsRUFBNkIsRUFBRTtJQUNuRixNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7UUFDdkIsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFDRCxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEtuZXhEYiB9IGZyb20gXCIuL2RiXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0TWV0YVZhbHVlID0gYXN5bmMgKGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0+IHtcclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKCk7XHJcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQga25leC5wbHVjayhcInZhbHVlXCIpLmZyb20oXCJtZXRhXCIpLndoZXJlKHsga2V5IH0pO1xyXG4gIHJldHVybiByZXN1bHQubGVuZ3RoID4gMCA/IHJlc3VsdFswXSA6IHVuZGVmaW5lZDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXRNZXRhVmFsdWUgPSBhc3luYyAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKCk7XHJcbiAgaWYgKGF3YWl0IGdldE1ldGFWYWx1ZShrZXkpID09PSB1bmRlZmluZWQpIHtcclxuICAgIGF3YWl0IGtuZXguZnJvbShcIm1ldGFcIikuaW5zZXJ0KHsga2V5LCB2YWx1ZSB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgYXdhaXQga25leC5mcm9tKFwibWV0YVwiKS51cGRhdGUoeyB2YWx1ZSB9KS53aGVyZSh7IGtleSB9KTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0Q3VycmVudERhdGV0aW1lTWV0YVZhbHVlID0gKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgc2V0TWV0YVZhbHVlKGtleSwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREYXRldGltZU1ldGFWYWx1ZSA9IGFzeW5jIChrZXk6IHN0cmluZyk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4gPT4ge1xyXG4gIGNvbnN0IHZhbHVlID0gYXdhaXQgZ2V0TWV0YVZhbHVlKGtleSk7XHJcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XHJcbn07XHJcbiJdfQ==