occam-furtle 3.0.1 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,675 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return ReleaseContext;
9
- }
10
- });
11
- var _necessary = require("necessary");
12
- var _occammodel = require("occam-model");
13
- var _occamcustomgrammars = require("occam-custom-grammars");
14
- var _furtle = /*#__PURE__*/ _interop_require_default(require("../context/file/furtle"));
15
- var _nominal = /*#__PURE__*/ _interop_require_default(require("../context/file/nominal"));
16
- var _constants = require("../constants");
17
- var _metaTypes = require("../metaTypes");
18
- var _customGrammar = require("../utilities/customGrammar");
19
- function _array_like_to_array(arr, len) {
20
- if (len == null || len > arr.length) len = arr.length;
21
- for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
22
- return arr2;
23
- }
24
- function _array_with_holes(arr) {
25
- if (Array.isArray(arr)) return arr;
26
- }
27
- function _array_without_holes(arr) {
28
- if (Array.isArray(arr)) return _array_like_to_array(arr);
29
- }
30
- function _class_call_check(instance, Constructor) {
31
- if (!(instance instanceof Constructor)) {
32
- throw new TypeError("Cannot call a class as a function");
33
- }
34
- }
35
- function _defineProperties(target, props) {
36
- for(var i = 0; i < props.length; i++){
37
- var descriptor = props[i];
38
- descriptor.enumerable = descriptor.enumerable || false;
39
- descriptor.configurable = true;
40
- if ("value" in descriptor) descriptor.writable = true;
41
- Object.defineProperty(target, descriptor.key, descriptor);
42
- }
43
- }
44
- function _create_class(Constructor, protoProps, staticProps) {
45
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
46
- if (staticProps) _defineProperties(Constructor, staticProps);
47
- return Constructor;
48
- }
49
- function _interop_require_default(obj) {
50
- return obj && obj.__esModule ? obj : {
51
- default: obj
52
- };
53
- }
54
- function _iterable_to_array(iter) {
55
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
56
- }
57
- function _iterable_to_array_limit(arr, i) {
58
- var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
59
- if (_i == null) return;
60
- var _arr = [];
61
- var _n = true;
62
- var _d = false;
63
- var _s, _e;
64
- try {
65
- for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
66
- _arr.push(_s.value);
67
- if (i && _arr.length === i) break;
68
- }
69
- } catch (err) {
70
- _d = true;
71
- _e = err;
72
- } finally{
73
- try {
74
- if (!_n && _i["return"] != null) _i["return"]();
75
- } finally{
76
- if (_d) throw _e;
77
- }
78
- }
79
- return _arr;
80
- }
81
- function _non_iterable_rest() {
82
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
83
- }
84
- function _non_iterable_spread() {
85
- throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
86
- }
87
- function _sliced_to_array(arr, i) {
88
- return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
89
- }
90
- function _to_consumable_array(arr) {
91
- return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
92
- }
93
- function _unsupported_iterable_to_array(o, minLen) {
94
- if (!o) return;
95
- if (typeof o === "string") return _array_like_to_array(o, minLen);
96
- var n = Object.prototype.toString.call(o).slice(8, -1);
97
- if (n === "Object" && o.constructor) n = o.constructor.name;
98
- if (n === "Map" || n === "Set") return Array.from(n);
99
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
100
- }
101
- var nominalLexerFromCombinedCustomGrammar = _occamcustomgrammars.lexersUtilities.nominalLexerFromCombinedCustomGrammar, nominalParserFromCombinedCustomGrammar = _occamcustomgrammars.parsersUtilities.nominalParserFromCombinedCustomGrammar, tail = _necessary.arrayUtilities.tail, push = _necessary.arrayUtilities.push, first = _necessary.arrayUtilities.first, clear = _necessary.arrayUtilities.clear, filter = _necessary.arrayUtilities.filter, resolve = _necessary.arrayUtilities.resolve, compress = _necessary.arrayUtilities.compress, isFilePathFurtleFilePath = _occammodel.filePathUtilities.isFilePathFurtleFilePath, isFilePathNominalFilePath = _occammodel.filePathUtilities.isFilePathNominalFilePath, _LEVELS = _sliced_to_array(_constants.LEVELS, 5), TRACE_LEVEL = _LEVELS[0], DEBUG_LEVEL = _LEVELS[1], INFO_LEVEL = _LEVELS[2], WARNING_LEVEL = _LEVELS[3], ERROR_LEVEL = _LEVELS[4];
102
- var ReleaseContext = /*#__PURE__*/ function() {
103
- function ReleaseContext(log1, name, json, entries, lexer, parser, verified, initialised, fileContexts, customGrammar, dependencyReleaseContexts) {
104
- _class_call_check(this, ReleaseContext);
105
- this.log = log1;
106
- this.name = name;
107
- this.json = json;
108
- this.entries = entries;
109
- this.lexer = lexer;
110
- this.parser = parser;
111
- this.verified = verified;
112
- this.initialised = initialised;
113
- this.fileContexts = fileContexts;
114
- this.customGrammar = customGrammar;
115
- this.dependencyReleaseContexts = dependencyReleaseContexts;
116
- }
117
- _create_class(ReleaseContext, [
118
- {
119
- key: "getLog",
120
- value: function getLog() {
121
- return log;
122
- }
123
- },
124
- {
125
- key: "getName",
126
- value: function getName() {
127
- return this.name;
128
- }
129
- },
130
- {
131
- key: "getJSON",
132
- value: function getJSON() {
133
- return this.json;
134
- }
135
- },
136
- {
137
- key: "getEntries",
138
- value: function getEntries() {
139
- return this.entries;
140
- }
141
- },
142
- {
143
- key: "getLexer",
144
- value: function getLexer() {
145
- return this.lexer;
146
- }
147
- },
148
- {
149
- key: "getParser",
150
- value: function getParser() {
151
- return this.parser;
152
- }
153
- },
154
- {
155
- key: "getMetaTypes",
156
- value: function getMetaTypes() {
157
- var metaTypes = (0, _metaTypes.getMetaTypes)();
158
- return metaTypes;
159
- }
160
- },
161
- {
162
- key: "isVerified",
163
- value: function isVerified() {
164
- return this.verified;
165
- }
166
- },
167
- {
168
- key: "isInitialised",
169
- value: function isInitialised() {
170
- return this.initialised;
171
- }
172
- },
173
- {
174
- key: "getFileContexts",
175
- value: function getFileContexts() {
176
- return this.fileContexts;
177
- }
178
- },
179
- {
180
- key: "getCustomGrammar",
181
- value: function getCustomGrammar() {
182
- return this.customGrammar;
183
- }
184
- },
185
- {
186
- key: "getDependencyReleaseContexts",
187
- value: function getDependencyReleaseContexts() {
188
- return this.dependencyReleaseContexts;
189
- }
190
- },
191
- {
192
- key: "isReleased",
193
- value: function isReleased() {
194
- var released = this.json !== null;
195
- return released;
196
- }
197
- },
198
- {
199
- key: "findFile",
200
- value: function findFile(filePath) {
201
- return this.entries.findFile(filePath);
202
- }
203
- },
204
- {
205
- key: "findFileContext",
206
- value: function findFileContext(filePath) {
207
- var fileContext = this.fileContexts.find(function(fileContext) {
208
- var fileContextFilePath = fileContext.getFilePath();
209
- if (fileContextFilePath === filePath) {
210
- return true;
211
- }
212
- });
213
- return fileContext;
214
- }
215
- },
216
- {
217
- key: "getTypePrefix",
218
- value: function getTypePrefix() {
219
- var typePrefix = null;
220
- var includeDependencies = false, typePrefixes = this.getTypePrefixes(includeDependencies), typePrefixesLength = typePrefixes.length;
221
- if (typePrefixesLength === 1) {
222
- var firstTypePrefix = first(typePrefixes);
223
- typePrefix = firstTypePrefix; ///
224
- }
225
- return typePrefix;
226
- }
227
- },
228
- {
229
- key: "getLabels",
230
- value: function getLabels() {
231
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
232
- var labels = [];
233
- this.fileContexts.forEach(function(fileContext) {
234
- var includeRelease = false, fileContextLabels = fileContext.getLabels(includeRelease);
235
- push(labels, fileContextLabels);
236
- });
237
- if (includeDependencies) {
238
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
239
- dependencyReleaseContexts.forEach(function(releaseContext) {
240
- var includeDependencies = false, releaseContextLabels = releaseContext.getLabels(includeDependencies);
241
- push(labels, releaseContextLabels);
242
- });
243
- }
244
- return labels;
245
- }
246
- },
247
- {
248
- key: "getTypes",
249
- value: function getTypes() {
250
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
251
- var types = [];
252
- this.fileContexts.forEach(function(fileContext) {
253
- var includeRelease = false, fileContextTypes = fileContext.getTypes(includeRelease);
254
- push(types, fileContextTypes);
255
- });
256
- if (includeDependencies) {
257
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
258
- dependencyReleaseContexts.forEach(function(releaseContext) {
259
- var includeDependencies = false, releaseContextTypes = releaseContext.getTypes(includeDependencies);
260
- push(types, releaseContextTypes);
261
- });
262
- }
263
- return types;
264
- }
265
- },
266
- {
267
- key: "getRules",
268
- value: function getRules() {
269
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
270
- var rules = [];
271
- this.fileContexts.forEach(function(fileContext) {
272
- var includeRelease = false, fileContextRules = fileContext.getRules(includeRelease);
273
- push(rules, fileContextRules);
274
- });
275
- if (includeDependencies) {
276
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
277
- dependencyReleaseContexts.forEach(function(releaseContext) {
278
- var includeDependencies = false, releaseContextRules = releaseContext.getRules(includeDependencies);
279
- push(rules, releaseContextRules);
280
- });
281
- }
282
- return rules;
283
- }
284
- },
285
- {
286
- key: "getAxioms",
287
- value: function getAxioms() {
288
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
289
- var axioms = [];
290
- this.fileContexts.forEach(function(fileContext) {
291
- var includeRelease = false, fileContextAxioms = fileContext.getAxioms(includeRelease);
292
- push(axioms, fileContextAxioms);
293
- });
294
- if (includeDependencies) {
295
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
296
- dependencyReleaseContexts.forEach(function(releaseContext) {
297
- var includeDependencies = false, releaseContextAxioms = releaseContext.getAxioms(includeDependencies);
298
- push(axioms, releaseContextAxioms);
299
- });
300
- }
301
- return axioms;
302
- }
303
- },
304
- {
305
- key: "getLemmas",
306
- value: function getLemmas() {
307
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
308
- var lemmas = [];
309
- this.fileContexts.forEach(function(fileContext) {
310
- var includeRelease = false, fileContextLemmas = fileContext.getLemmas(includeRelease);
311
- push(lemmas, fileContextLemmas);
312
- });
313
- return lemmas;
314
- }
315
- },
316
- {
317
- key: "getTheorems",
318
- value: function getTheorems() {
319
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
320
- var theorems = [];
321
- this.fileContexts.forEach(function(fileContext) {
322
- var includeRelease = false, fileContextTheorems = fileContext.getTheorems(includeRelease);
323
- push(theorems, fileContextTheorems);
324
- });
325
- if (includeDependencies) {
326
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
327
- dependencyReleaseContexts.forEach(function(releaseContext) {
328
- var includeDependencies = false, releaseContextTheorems = releaseContext.getTheorems(includeDependencies);
329
- push(theorems, releaseContextTheorems);
330
- });
331
- }
332
- return theorems;
333
- }
334
- },
335
- {
336
- key: "getProcedures",
337
- value: function getProcedures() {
338
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
339
- var procedures = [];
340
- this.fileContexts.forEach(function(fileContext) {
341
- var includeRelease = false, fileContextProcedures = fileContext.getProcedures(includeRelease);
342
- push(procedures, fileContextProcedures);
343
- });
344
- if (includeDependencies) {
345
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
346
- dependencyReleaseContexts.forEach(function(releaseContext) {
347
- var includeDependencies = false, releaseContextProcedures = releaseContext.getProcedures(includeDependencies);
348
- push(procedures, releaseContextProcedures);
349
- });
350
- }
351
- return procedures;
352
- }
353
- },
354
- {
355
- key: "getMetaLemmas",
356
- value: function getMetaLemmas() {
357
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
358
- var metaLemmas = [];
359
- this.fileContexts.forEach(function(fileContext) {
360
- var includeRelease = false, fileContextMetaLemmas = fileContext.getMetaLemmas(includeRelease);
361
- push(metaLemmas, fileContextMetaLemmas);
362
- });
363
- return metaLemmas;
364
- }
365
- },
366
- {
367
- key: "getConjectures",
368
- value: function getConjectures() {
369
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
370
- var conjectures = [];
371
- this.fileContexts.forEach(function(fileContext) {
372
- var includeRelease = false, fileContextConjectures = fileContext.getConjectures(includeRelease);
373
- push(conjectures, fileContextConjectures);
374
- });
375
- if (includeDependencies) {
376
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
377
- dependencyReleaseContexts.forEach(function(releaseContext) {
378
- var includeDependencies = false, releaseContextConjectures = releaseContext.getConjectures(includeDependencies);
379
- push(conjectures, releaseContextConjectures);
380
- });
381
- }
382
- return conjectures;
383
- }
384
- },
385
- {
386
- key: "getCombinators",
387
- value: function getCombinators() {
388
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
389
- var combinators = [];
390
- this.fileContexts.forEach(function(fileContext) {
391
- var includeRelease = false, fileContextCombinators = fileContext.getCombinators(includeRelease);
392
- push(combinators, fileContextCombinators);
393
- });
394
- if (includeDependencies) {
395
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
396
- dependencyReleaseContexts.forEach(function(releaseContext) {
397
- var includeDependencies = false, releaseContextCombinators = releaseContext.getCombinators(includeDependencies);
398
- push(combinators, releaseContextCombinators);
399
- });
400
- }
401
- return combinators;
402
- }
403
- },
404
- {
405
- key: "getTypePrefixes",
406
- value: function getTypePrefixes() {
407
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
408
- var typePrefixes = [];
409
- this.fileContexts.forEach(function(fileContext) {
410
- var includeRelease = false, fileContextTypePrefixes = fileContext.getTypePrefixes(includeRelease);
411
- push(typePrefixes, fileContextTypePrefixes);
412
- });
413
- if (includeDependencies) {
414
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
415
- dependencyReleaseContexts.forEach(function(releaseContext) {
416
- var includeDependencies = false, releaseContextTypePrefixes = releaseContext.getTypePrefixes(includeDependencies);
417
- push(typePrefixes, releaseContextTypePrefixes);
418
- });
419
- }
420
- return typePrefixes;
421
- }
422
- },
423
- {
424
- key: "getConstructors",
425
- value: function getConstructors() {
426
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
427
- var constructors = [];
428
- this.fileContexts.forEach(function(fileContext) {
429
- var includeRelease = false, fileContextConstructors = fileContext.getConstructors(includeRelease);
430
- push(constructors, fileContextConstructors);
431
- });
432
- if (includeDependencies) {
433
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
434
- dependencyReleaseContexts.forEach(function(releaseContext) {
435
- var includeDependencies = false, releaseContextConstructors = releaseContext.getConstructors(includeDependencies);
436
- push(constructors, releaseContextConstructors);
437
- });
438
- }
439
- return constructors;
440
- }
441
- },
442
- {
443
- key: "getMetatheorems",
444
- value: function getMetatheorems() {
445
- var includeDependencies = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
446
- var metatheorems = [];
447
- this.fileContexts.forEach(function(fileContext) {
448
- var includeRelease = false, fileContextMetatheorems = fileContext.getMetatheorems(includeRelease);
449
- push(metatheorems, fileContextMetatheorems);
450
- });
451
- if (includeDependencies) {
452
- var dependencyReleaseContexts = this.getDependencyReleaseContexts();
453
- dependencyReleaseContexts.forEach(function(releaseContext) {
454
- var includeDependencies = false, releaseContextMetatheorems = releaseContext.getMetatheorems(includeDependencies);
455
- push(metatheorems, releaseContextMetatheorems);
456
- });
457
- }
458
- return metatheorems;
459
- }
460
- },
461
- {
462
- key: "addFileContext",
463
- value: function addFileContext(fileContext) {
464
- this.fileContexts.push(fileContext);
465
- }
466
- },
467
- {
468
- key: "getReleaseName",
469
- value: function getReleaseName() {
470
- var name = this.getName(), releaseName = name; ///
471
- return releaseName;
472
- }
473
- },
474
- {
475
- key: "getFile",
476
- value: function getFile(filePath) {
477
- return this.entries.getFile(filePath);
478
- }
479
- },
480
- {
481
- key: "getVersion",
482
- value: function getVersion() {
483
- return this.entries.getVersion();
484
- }
485
- },
486
- {
487
- key: "getFilePaths",
488
- value: function getFilePaths() {
489
- return this.entries.getFilePaths();
490
- }
491
- },
492
- {
493
- key: "getDependencies",
494
- value: function getDependencies() {
495
- return this.entries.getDependencies();
496
- }
497
- },
498
- {
499
- key: "matchShortenedVersion",
500
- value: function matchShortenedVersion(shortenedVersion) {
501
- return this.entries.matchShortenedVersion(shortenedVersion);
502
- }
503
- },
504
- {
505
- key: "trace",
506
- value: function trace(message) {
507
- var filePath = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null, lineIndex = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
508
- var level = TRACE_LEVEL;
509
- this.writeToLog(level, message, filePath, lineIndex);
510
- }
511
- },
512
- {
513
- key: "debug",
514
- value: function debug(message) {
515
- var filePath = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null, lineIndex = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
516
- var level = DEBUG_LEVEL;
517
- this.writeToLog(level, message, filePath, lineIndex);
518
- }
519
- },
520
- {
521
- key: "info",
522
- value: function info(message) {
523
- var filePath = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null, lineIndex = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
524
- var level = INFO_LEVEL;
525
- this.writeToLog(level, message, filePath, lineIndex);
526
- }
527
- },
528
- {
529
- key: "warning",
530
- value: function warning(message) {
531
- var filePath = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null, lineIndex = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
532
- var level = WARNING_LEVEL;
533
- this.writeToLog(level, message, filePath, lineIndex);
534
- }
535
- },
536
- {
537
- key: "error",
538
- value: function error(message) {
539
- var filePath = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null, lineIndex = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
540
- var level = ERROR_LEVEL;
541
- this.writeToLog(level, message, filePath, lineIndex);
542
- }
543
- },
544
- {
545
- key: "writeToLog",
546
- value: function writeToLog(level, message, filePath, lineIndex) {
547
- this.log.write(level, message, filePath, lineIndex);
548
- }
549
- },
550
- {
551
- key: "getFileContext",
552
- value: function getFileContext() {
553
- var fileContext = null;
554
- return fileContext;
555
- }
556
- },
557
- {
558
- key: "getDepth",
559
- value: function getDepth() {
560
- var depth = -1;
561
- return depth;
562
- }
563
- },
564
- {
565
- key: "initialise",
566
- value: function initialise(releaseContexts) {
567
- var combinedCustomGrammar = (0, _customGrammar.combinedCustomGrammarFromReleaseContexts)(releaseContexts), nominalLexer = nominalLexerFromCombinedCustomGrammar(NominalLexer, combinedCustomGrammar), nominalParser = nominalParserFromCombinedCustomGrammar(NominalParser, combinedCustomGrammar), releaseContext = this, released = this.isReleased();
568
- this.dependencyReleaseContexts = tail(releaseContexts); ///
569
- this.lexer = nominalLexer; ///
570
- this.parser = nominalParser; ///
571
- clear(this.fileContexts);
572
- released ? fileContextsFromJSON(this.json, this.fileContexts, releaseContext) : fileContextsFromEntries(this.entries, this.fileContexts, releaseContext);
573
- this.initialised = true;
574
- }
575
- },
576
- {
577
- key: "verify",
578
- value: function verify() {
579
- var verifies = false;
580
- var typePrefixes = this.getTypePrefixes(), releaseContext = this, typePrefixesVerify = verifyTypePrefixes(typePrefixes, releaseContext);
581
- if (typePrefixesVerify) {
582
- var verifiedFileContexts = [], fileContextsVerify = verifyFileContexts(this.fileContexts, verifiedFileContexts, releaseContext);
583
- if (fileContextsVerify) {
584
- this.fileContexts = verifiedFileContexts; ///
585
- this.verified = true;
586
- verifies = true;
587
- }
588
- }
589
- return verifies;
590
- }
591
- },
592
- {
593
- key: "toJSON",
594
- value: function toJSON() {
595
- var fileContextsJSON = this.fileContexts.map(function(fileContext) {
596
- var fileContextJSON = fileContext.toJSON();
597
- return fileContextJSON;
598
- }), json = fileContextsJSON; ///
599
- return json;
600
- }
601
- }
602
- ], [
603
- {
604
- key: "fromLogNameJSONAndEntries",
605
- value: function fromLogNameJSONAndEntries(log1, name, json, entries) {
606
- var lexer = null, parser = null, verifies = false, initialised = false, fileContexts = [], customGrammar = (0, _customGrammar.customGrammarFromNameAndEntries)(name, entries), dependencyReleaseContexts = null, releaseContext = new ReleaseContext(log1, name, json, entries, lexer, parser, verifies, initialised, fileContexts, customGrammar, dependencyReleaseContexts);
607
- return releaseContext;
608
- }
609
- }
610
- ]);
611
- return ReleaseContext;
612
- }();
613
- function verifyTypePrefixes(typePrefixes, releaseContext) {
614
- var typePrefixesVerify = true;
615
- var typePrefixesLength = typePrefixes.length, compressedTypePrefixes = _to_consumable_array(typePrefixes);
616
- compress(compressedTypePrefixes, function(typePrefixA, typePrefixB) {
617
- var typePrefixAName = typePrefixA.getName(), typePrefixBName = typePrefixB.getName();
618
- if (typePrefixAName !== typePrefixBName) {
619
- return true;
620
- }
621
- });
622
- var compressTypePrefixesLength = compressedTypePrefixes.length;
623
- if (typePrefixesLength > compressTypePrefixesLength) {
624
- filter(compressedTypePrefixes, function(typePrefix) {
625
- var typePrefixesIncludesTypePrefix = typePrefixes.includes(typePrefix);
626
- if (!typePrefixesIncludesTypePrefix) {
627
- return true;
628
- }
629
- });
630
- var firstTypePrefix = first(typePrefixes), typePrefix = firstTypePrefix, typePrefixString = typePrefix.getString();
631
- releaseContext.info("The '".concat(typePrefixString, "' type prefix is duplicated at least once, possibly among others."));
632
- typePrefixesVerify = false;
633
- }
634
- return typePrefixesVerify;
635
- }
636
- function verifyFileContexts(fileContexts, verifiedFileContexts) {
637
- var resolved = resolve(fileContexts, verifiedFileContexts, function(fileContext) {
638
- var fileContextVerifies = fileContext.verify();
639
- if (fileContextVerifies) {
640
- return true;
641
- }
642
- }), fileContextsVerify = resolved; ///
643
- return fileContextsVerify;
644
- }
645
- function fileContextsFromJSON(json, fileContexts, releaseContext) {
646
- var fileContextsJSON = json; ///
647
- fileContextsJSON.forEach(function(fileContextJSON) {
648
- var filePath = fileContextJSON.filePath, _$json = fileContextJSON, filePathFurtleFilePath = isFilePathFurtleFilePath(filePath), filePathNominalFilePath = isFilePathNominalFilePath(filePath);
649
- if (filePathFurtleFilePath) {
650
- var furtleFileContext = _furtle.default.fromFilePath(filePath, releaseContext), fileContext = furtleFileContext; ///
651
- fileContexts.push(fileContext);
652
- fileContext.initialise(_$json);
653
- }
654
- if (filePathNominalFilePath) {
655
- var context = releaseContext, fileContext1 = _nominal.default.fromFilePath(filePath, context);
656
- fileContexts.push(fileContext1);
657
- fileContext1.initialise(_$json);
658
- }
659
- });
660
- }
661
- function fileContextsFromEntries(entries, fileContexts, releaseContext) {
662
- entries.forEachFile(function(file) {
663
- var filePath = file.getPath(), filePathFurtleFilePath = isFilePathFurtleFilePath(filePath), filePathNominalFilePath = isFilePathNominalFilePath(filePath);
664
- if (filePathFurtleFilePath) {
665
- var furtleFileContext = _furtle.default.fromFile(file, releaseContext), fileContext = furtleFileContext; ///
666
- fileContexts.push(fileContext);
667
- }
668
- if (filePathNominalFilePath) {
669
- var context = releaseContext, fileContext1 = _nominal.default.fromFile(file, context);
670
- fileContexts.push(fileContext1);
671
- }
672
- });
673
- }
674
-
675
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L3JlbGVhc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5pbXBvcnQgeyBmaWxlUGF0aFV0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1tb2RlbFwiO1xuaW1wb3J0IHsgbGV4ZXJzVXRpbGl0aWVzLCBwYXJzZXJzVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWN1c3RvbS1ncmFtbWFyc1wiO1xuXG4vLyBpbXBvcnQgTm9taW5hbExleGVyIGZyb20gXCIuLi9ub21pbmFsL2xleGVyXCI7XG4vLyBpbXBvcnQgTm9taW5hbFBhcnNlciBmcm9tIFwiLi4vbm9taW5hbC9wYXJzZXJcIjtcbmltcG9ydCBGdXJ0bGVGaWxlQ29udGV4dCBmcm9tIFwiLi4vY29udGV4dC9maWxlL2Z1cnRsZVwiO1xuaW1wb3J0IE5vbWluYWxGaWxlQ29udGV4dCBmcm9tIFwiLi4vY29udGV4dC9maWxlL25vbWluYWxcIjtcblxuaW1wb3J0IHsgTEVWRUxTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0TWV0YVR5cGVzIH0gZnJvbSBcIi4uL21ldGFUeXBlc1wiO1xuaW1wb3J0IHsgY3VzdG9tR3JhbW1hckZyb21OYW1lQW5kRW50cmllcywgY29tYmluZWRDdXN0b21HcmFtbWFyRnJvbVJlbGVhc2VDb250ZXh0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvY3VzdG9tR3JhbW1hclwiO1xuXG5jb25zdCB7IG5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIgfSA9IGxleGVyc1V0aWxpdGllcyxcbiAgICAgIHsgbm9taW5hbFBhcnNlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIgfSA9IHBhcnNlcnNVdGlsaXRpZXMsXG4gICAgICB7IHRhaWwsIHB1c2gsIGZpcnN0LCBjbGVhciwgZmlsdGVyLCByZXNvbHZlLCBjb21wcmVzcyB9ID0gYXJyYXlVdGlsaXRpZXMsXG4gICAgICB7IGlzRmlsZVBhdGhGdXJ0bGVGaWxlUGF0aCwgaXNGaWxlUGF0aE5vbWluYWxGaWxlUGF0aCB9ID0gZmlsZVBhdGhVdGlsaXRpZXMsXG4gICAgICBbIFRSQUNFX0xFVkVMLCBERUJVR19MRVZFTCwgSU5GT19MRVZFTCwgV0FSTklOR19MRVZFTCwgRVJST1JfTEVWRUwgXSA9IExFVkVMUztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVsZWFzZUNvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihsb2csIG5hbWUsIGpzb24sIGVudHJpZXMsIGxleGVyLCBwYXJzZXIsIHZlcmlmaWVkLCBpbml0aWFsaXNlZCwgZmlsZUNvbnRleHRzLCBjdXN0b21HcmFtbWFyLCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKSB7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmpzb24gPSBqc29uO1xuICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7XG4gICAgdGhpcy5sZXhlciA9IGxleGVyO1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIHRoaXMudmVyaWZpZWQgPSB2ZXJpZmllZDtcbiAgICB0aGlzLmluaXRpYWxpc2VkID0gaW5pdGlhbGlzZWQ7XG4gICAgdGhpcy5maWxlQ29udGV4dHMgPSBmaWxlQ29udGV4dHM7XG4gICAgdGhpcy5jdXN0b21HcmFtbWFyID0gY3VzdG9tR3JhbW1hcjtcbiAgICB0aGlzLmRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzO1xuICB9XG5cbiAgZ2V0TG9nKCkge1xuICAgIHJldHVybiBsb2c7XG4gIH1cblxuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICBnZXRKU09OKCkge1xuICAgIHJldHVybiB0aGlzLmpzb247XG4gIH1cblxuICBnZXRFbnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXM7XG4gIH1cblxuICBnZXRMZXhlcigpIHtcbiAgICByZXR1cm4gdGhpcy5sZXhlcjtcbiAgfVxuXG4gIGdldFBhcnNlcigpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXI7XG4gIH1cblxuICBnZXRNZXRhVHlwZXMoKSB7XG4gICAgY29uc3QgbWV0YVR5cGVzID0gZ2V0TWV0YVR5cGVzKCk7XG5cbiAgICByZXR1cm4gbWV0YVR5cGVzO1xuICB9XG5cbiAgaXNWZXJpZmllZCgpIHtcbiAgICByZXR1cm4gdGhpcy52ZXJpZmllZDtcbiAgfVxuXG4gIGlzSW5pdGlhbGlzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGlzZWQ7XG4gIH1cblxuICBnZXRGaWxlQ29udGV4dHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUNvbnRleHRzO1xuICB9XG5cbiAgZ2V0Q3VzdG9tR3JhbW1hcigpIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21HcmFtbWFyO1xuICB9XG5cbiAgZ2V0RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cygpIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzO1xuICB9XG5cbiAgaXNSZWxlYXNlZCgpIHtcbiAgICBjb25zdCByZWxlYXNlZCA9ICh0aGlzLmpzb24gIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHJlbGVhc2VkO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZVBhdGgpIHsgcmV0dXJuIHRoaXMuZW50cmllcy5maW5kRmlsZShmaWxlUGF0aCk7IH1cblxuICBmaW5kRmlsZUNvbnRleHQoZmlsZVBhdGgpIHtcbiAgICBjb25zdCBmaWxlQ29udGV4dCA9IHRoaXMuZmlsZUNvbnRleHRzLmZpbmQoKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBmaWxlQ29udGV4dEZpbGVQYXRoID0gZmlsZUNvbnRleHQuZ2V0RmlsZVBhdGgoKTtcblxuICAgICAgaWYgKGZpbGVDb250ZXh0RmlsZVBhdGggPT09IGZpbGVQYXRoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbGVDb250ZXh0O1xuICB9XG5cbiAgZ2V0VHlwZVByZWZpeCgpIHtcbiAgICBsZXQgdHlwZVByZWZpeCA9IG51bGw7XG5cbiAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgdHlwZVByZWZpeGVzID0gdGhpcy5nZXRUeXBlUHJlZml4ZXMoaW5jbHVkZURlcGVuZGVuY2llcyksXG4gICAgICAgICAgdHlwZVByZWZpeGVzTGVuZ3RoID0gdHlwZVByZWZpeGVzLmxlbmd0aDtcblxuICAgIGlmICh0eXBlUHJlZml4ZXNMZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGZpcnN0VHlwZVByZWZpeCA9IGZpcnN0KHR5cGVQcmVmaXhlcyk7XG5cbiAgICAgIHR5cGVQcmVmaXggPSBmaXJzdFR5cGVQcmVmaXg7IC8vL1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlUHJlZml4O1xuICB9XG5cbiAgZ2V0TGFiZWxzKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgbGFiZWxzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0TGFiZWxzID0gZmlsZUNvbnRleHQuZ2V0TGFiZWxzKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChsYWJlbHMsIGZpbGVDb250ZXh0TGFiZWxzKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzID0gdGhpcy5nZXREZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKCk7XG5cbiAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dExhYmVscyA9IHJlbGVhc2VDb250ZXh0LmdldExhYmVscyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKGxhYmVscywgcmVsZWFzZUNvbnRleHRMYWJlbHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxuXG4gIGdldFR5cGVzKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgdHlwZXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRUeXBlcyA9IGZpbGVDb250ZXh0LmdldFR5cGVzKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaCh0eXBlcywgZmlsZUNvbnRleHRUeXBlcyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyA9IHRoaXMuZ2V0RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cygpO1xuXG4gICAgICBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRUeXBlcyA9IHJlbGVhc2VDb250ZXh0LmdldFR5cGVzKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2godHlwZXMsIHJlbGVhc2VDb250ZXh0VHlwZXMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzO1xuICB9XG5cbiAgZ2V0UnVsZXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBydWxlcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dFJ1bGVzID0gZmlsZUNvbnRleHQuZ2V0UnVsZXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKHJ1bGVzLCBmaWxlQ29udGV4dFJ1bGVzKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzID0gdGhpcy5nZXREZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKCk7XG5cbiAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dFJ1bGVzID0gcmVsZWFzZUNvbnRleHQuZ2V0UnVsZXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaChydWxlcywgcmVsZWFzZUNvbnRleHRSdWxlcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZXM7XG4gIH1cblxuICBnZXRBeGlvbXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBheGlvbXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRBeGlvbXMgPSBmaWxlQ29udGV4dC5nZXRBeGlvbXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKGF4aW9tcywgZmlsZUNvbnRleHRBeGlvbXMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSB0aGlzLmdldERlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMoKTtcblxuICAgICAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0QXhpb21zID0gcmVsZWFzZUNvbnRleHQuZ2V0QXhpb21zKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2goYXhpb21zLCByZWxlYXNlQ29udGV4dEF4aW9tcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXhpb21zO1xuICB9XG5cbiAgZ2V0TGVtbWFzKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgbGVtbWFzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0TGVtbWFzID0gZmlsZUNvbnRleHQuZ2V0TGVtbWFzKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChsZW1tYXMsIGZpbGVDb250ZXh0TGVtbWFzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBsZW1tYXM7XG4gIH1cblxuICBnZXRUaGVvcmVtcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHRoZW9yZW1zID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0VGhlb3JlbXMgPSBmaWxlQ29udGV4dC5nZXRUaGVvcmVtcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2godGhlb3JlbXMsIGZpbGVDb250ZXh0VGhlb3JlbXMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSB0aGlzLmdldERlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMoKTtcblxuICAgICAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0VGhlb3JlbXMgPSByZWxlYXNlQ29udGV4dC5nZXRUaGVvcmVtcyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKHRoZW9yZW1zLCByZWxlYXNlQ29udGV4dFRoZW9yZW1zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGVvcmVtcztcbiAgfVxuXG4gIGdldFByb2NlZHVyZXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBwcm9jZWR1cmVzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0UHJvY2VkdXJlcyA9IGZpbGVDb250ZXh0LmdldFByb2NlZHVyZXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKHByb2NlZHVyZXMsIGZpbGVDb250ZXh0UHJvY2VkdXJlcyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyA9IHRoaXMuZ2V0RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cygpO1xuXG4gICAgICBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICByZWxlYXNlQ29udGV4dFByb2NlZHVyZXMgPSByZWxlYXNlQ29udGV4dC5nZXRQcm9jZWR1cmVzKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2gocHJvY2VkdXJlcywgcmVsZWFzZUNvbnRleHRQcm9jZWR1cmVzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZWR1cmVzO1xuICB9XG5cbiAgZ2V0TWV0YUxlbW1hcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1ldGFMZW1tYXMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRNZXRhTGVtbWFzID0gZmlsZUNvbnRleHQuZ2V0TWV0YUxlbW1hcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2gobWV0YUxlbW1hcywgZmlsZUNvbnRleHRNZXRhTGVtbWFzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZXRhTGVtbWFzO1xuICB9XG5cbiAgZ2V0Q29uamVjdHVyZXMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBjb25qZWN0dXJlcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dENvbmplY3R1cmVzID0gZmlsZUNvbnRleHQuZ2V0Q29uamVjdHVyZXMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKGNvbmplY3R1cmVzLCBmaWxlQ29udGV4dENvbmplY3R1cmVzKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzID0gdGhpcy5nZXREZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKCk7XG5cbiAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dENvbmplY3R1cmVzID0gcmVsZWFzZUNvbnRleHQuZ2V0Q29uamVjdHVyZXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaChjb25qZWN0dXJlcywgcmVsZWFzZUNvbnRleHRDb25qZWN0dXJlcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uamVjdHVyZXM7XG4gIH1cblxuICBnZXRDb21iaW5hdG9ycyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbWJpbmF0b3JzID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0Q29tYmluYXRvcnMgPSBmaWxlQ29udGV4dC5nZXRDb21iaW5hdG9ycyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2goY29tYmluYXRvcnMsIGZpbGVDb250ZXh0Q29tYmluYXRvcnMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSB0aGlzLmdldERlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMoKTtcblxuICAgICAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0Q29tYmluYXRvcnMgPSByZWxlYXNlQ29udGV4dC5nZXRDb21iaW5hdG9ycyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKGNvbWJpbmF0b3JzLCByZWxlYXNlQ29udGV4dENvbWJpbmF0b3JzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb21iaW5hdG9ycztcbiAgfVxuXG4gIGdldFR5cGVQcmVmaXhlcyhpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVQcmVmaXhlcyA9IFtdO1xuXG4gICAgdGhpcy5maWxlQ29udGV4dHMuZm9yRWFjaCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVSZWxlYXNlID0gZmFsc2UsXG4gICAgICAgICAgICBmaWxlQ29udGV4dFR5cGVQcmVmaXhlcyA9IGZpbGVDb250ZXh0LmdldFR5cGVQcmVmaXhlcyhpbmNsdWRlUmVsZWFzZSk7XG5cbiAgICAgIHB1c2godHlwZVByZWZpeGVzLCBmaWxlQ29udGV4dFR5cGVQcmVmaXhlcyk7XG4gICAgfSk7XG5cbiAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyA9IHRoaXMuZ2V0RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cygpO1xuXG4gICAgICBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzLmZvckVhY2goKHJlbGVhc2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRUeXBlUHJlZml4ZXMgPSByZWxlYXNlQ29udGV4dC5nZXRUeXBlUHJlZml4ZXMoaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICAgICAgcHVzaCh0eXBlUHJlZml4ZXMsIHJlbGVhc2VDb250ZXh0VHlwZVByZWZpeGVzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlUHJlZml4ZXM7XG4gIH1cblxuICBnZXRDb25zdHJ1Y3RvcnMoaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBbXTtcblxuICAgIHRoaXMuZmlsZUNvbnRleHRzLmZvckVhY2goKGZpbGVDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlUmVsZWFzZSA9IGZhbHNlLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRDb25zdHJ1Y3RvcnMgPSBmaWxlQ29udGV4dC5nZXRDb25zdHJ1Y3RvcnMoaW5jbHVkZVJlbGVhc2UpO1xuXG4gICAgICBwdXNoKGNvbnN0cnVjdG9ycywgZmlsZUNvbnRleHRDb25zdHJ1Y3RvcnMpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMgPSB0aGlzLmdldERlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMoKTtcblxuICAgICAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cy5mb3JFYWNoKChyZWxlYXNlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gZmFsc2UsXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0Q29uc3RydWN0b3JzID0gcmVsZWFzZUNvbnRleHQuZ2V0Q29uc3RydWN0b3JzKGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIHB1c2goY29uc3RydWN0b3JzLCByZWxlYXNlQ29udGV4dENvbnN0cnVjdG9ycyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc3RydWN0b3JzO1xuICB9XG5cbiAgZ2V0TWV0YXRoZW9yZW1zKGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgbWV0YXRoZW9yZW1zID0gW107XG5cbiAgICB0aGlzLmZpbGVDb250ZXh0cy5mb3JFYWNoKChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVJlbGVhc2UgPSBmYWxzZSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0TWV0YXRoZW9yZW1zID0gZmlsZUNvbnRleHQuZ2V0TWV0YXRoZW9yZW1zKGluY2x1ZGVSZWxlYXNlKTtcblxuICAgICAgcHVzaChtZXRhdGhlb3JlbXMsIGZpbGVDb250ZXh0TWV0YXRoZW9yZW1zKTtcbiAgICB9KTtcblxuICAgIGlmIChpbmNsdWRlRGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzID0gdGhpcy5nZXREZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKCk7XG5cbiAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMuZm9yRWFjaCgocmVsZWFzZUNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgaW5jbHVkZURlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dE1ldGF0aGVvcmVtcyA9IHJlbGVhc2VDb250ZXh0LmdldE1ldGF0aGVvcmVtcyhpbmNsdWRlRGVwZW5kZW5jaWVzKTtcblxuICAgICAgICBwdXNoKG1ldGF0aGVvcmVtcywgcmVsZWFzZUNvbnRleHRNZXRhdGhlb3JlbXMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGF0aGVvcmVtcztcbiAgfVxuXG4gIGFkZEZpbGVDb250ZXh0KGZpbGVDb250ZXh0KSB7XG4gICAgdGhpcy5maWxlQ29udGV4dHMucHVzaChmaWxlQ29udGV4dCk7XG4gIH1cblxuICBnZXRSZWxlYXNlTmFtZSgpIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKCksXG4gICAgICAgICAgcmVsZWFzZU5hbWUgPSBuYW1lOyAvLy9cblxuICAgIHJldHVybiByZWxlYXNlTmFtZTtcbiAgfVxuXG4gIGdldEZpbGUoZmlsZVBhdGgpIHsgcmV0dXJuIHRoaXMuZW50cmllcy5nZXRGaWxlKGZpbGVQYXRoKTsgfVxuXG4gIGdldFZlcnNpb24oKSB7IHJldHVybiB0aGlzLmVudHJpZXMuZ2V0VmVyc2lvbigpOyB9XG5cbiAgZ2V0RmlsZVBhdGhzKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzLmdldEZpbGVQYXRocygpOyB9XG5cbiAgZ2V0RGVwZW5kZW5jaWVzKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzLmdldERlcGVuZGVuY2llcygpOyB9XG5cbiAgbWF0Y2hTaG9ydGVuZWRWZXJzaW9uKHNob3J0ZW5lZFZlcnNpb24pIHsgcmV0dXJuIHRoaXMuZW50cmllcy5tYXRjaFNob3J0ZW5lZFZlcnNpb24oc2hvcnRlbmVkVmVyc2lvbik7IH1cblxuICB0cmFjZShtZXNzYWdlLCBmaWxlUGF0aCA9IG51bGwsIGxpbmVJbmRleCA9IG51bGwpIHtcbiAgICBjb25zdCBsZXZlbCA9IFRSQUNFX0xFVkVMO1xuXG4gICAgdGhpcy53cml0ZVRvTG9nKGxldmVsLCBtZXNzYWdlLCBmaWxlUGF0aCwgbGluZUluZGV4KTtcbiAgfVxuXG4gIGRlYnVnKG1lc3NhZ2UsIGZpbGVQYXRoID0gbnVsbCwgbGluZUluZGV4ID0gbnVsbCkge1xuICAgIGNvbnN0IGxldmVsID0gREVCVUdfTEVWRUxcblxuICAgIHRoaXMud3JpdGVUb0xvZyhsZXZlbCwgbWVzc2FnZSwgZmlsZVBhdGgsIGxpbmVJbmRleCk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2UsIGZpbGVQYXRoID0gbnVsbCwgbGluZUluZGV4ID0gbnVsbCkge1xuICAgIGNvbnN0IGxldmVsID0gSU5GT19MRVZFTDtcblxuICAgIHRoaXMud3JpdGVUb0xvZyhsZXZlbCwgbWVzc2FnZSwgZmlsZVBhdGgsIGxpbmVJbmRleCk7XG4gIH1cblxuICB3YXJuaW5nKG1lc3NhZ2UsIGZpbGVQYXRoID0gbnVsbCwgbGluZUluZGV4ID0gbnVsbCkge1xuICAgIGNvbnN0IGxldmVsID0gV0FSTklOR19MRVZFTDtcblxuICAgIHRoaXMud3JpdGVUb0xvZyhsZXZlbCwgbWVzc2FnZSwgZmlsZVBhdGgsIGxpbmVJbmRleCk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlLCBmaWxlUGF0aCA9IG51bGwsIGxpbmVJbmRleCA9IG51bGwpIHtcbiAgICBjb25zdCBsZXZlbCA9IEVSUk9SX0xFVkVMO1xuXG4gICAgdGhpcy53cml0ZVRvTG9nKGxldmVsLCBtZXNzYWdlLCBmaWxlUGF0aCwgbGluZUluZGV4KTtcbiAgfVxuXG4gIHdyaXRlVG9Mb2cobGV2ZWwsIG1lc3NhZ2UsIGZpbGVQYXRoLCBsaW5lSW5kZXgpIHtcbiAgICB0aGlzLmxvZy53cml0ZShsZXZlbCwgbWVzc2FnZSwgZmlsZVBhdGgsIGxpbmVJbmRleCk7XG4gIH1cblxuICBnZXRGaWxlQ29udGV4dCgpIHtcbiAgICBjb25zdCBmaWxlQ29udGV4dCA9IG51bGw7XG5cbiAgICByZXR1cm4gZmlsZUNvbnRleHQ7XG4gIH1cblxuICBnZXREZXB0aCgpIHtcbiAgICBjb25zdCBkZXB0aCA9IC0xO1xuXG4gICAgcmV0dXJuIGRlcHRoO1xuICB9XG5cbiAgaW5pdGlhbGlzZShyZWxlYXNlQ29udGV4dHMpIHtcbiAgICBjb25zdCBjb21iaW5lZEN1c3RvbUdyYW1tYXIgPSBjb21iaW5lZEN1c3RvbUdyYW1tYXJGcm9tUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0cyksXG4gICAgICAgICAgbm9taW5hbExleGVyID0gbm9taW5hbExleGVyRnJvbUNvbWJpbmVkQ3VzdG9tR3JhbW1hcihOb21pbmFsTGV4ZXIsIGNvbWJpbmVkQ3VzdG9tR3JhbW1hciksXG4gICAgICAgICAgbm9taW5hbFBhcnNlciA9IG5vbWluYWxQYXJzZXJGcm9tQ29tYmluZWRDdXN0b21HcmFtbWFyKE5vbWluYWxQYXJzZXIsIGNvbWJpbmVkQ3VzdG9tR3JhbW1hciksXG4gICAgICAgICAgcmVsZWFzZUNvbnRleHQgPSB0aGlzLCAgLy8vXG4gICAgICAgICAgcmVsZWFzZWQgPSB0aGlzLmlzUmVsZWFzZWQoKTtcblxuICAgIHRoaXMuZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyA9IHRhaWwocmVsZWFzZUNvbnRleHRzKTsgLy8vXG5cbiAgICB0aGlzLmxleGVyID0gbm9taW5hbExleGVyOyAvLy9cblxuICAgIHRoaXMucGFyc2VyID0gbm9taW5hbFBhcnNlcjsgLy8vXG5cbiAgICBjbGVhcih0aGlzLmZpbGVDb250ZXh0cyk7XG5cbiAgICByZWxlYXNlZCA/XG4gICAgICBmaWxlQ29udGV4dHNGcm9tSlNPTih0aGlzLmpzb24sIHRoaXMuZmlsZUNvbnRleHRzLCByZWxlYXNlQ29udGV4dCkgOlxuICAgICAgICBmaWxlQ29udGV4dHNGcm9tRW50cmllcyh0aGlzLmVudHJpZXMsIHRoaXMuZmlsZUNvbnRleHRzLCByZWxlYXNlQ29udGV4dCk7XG5cbiAgICB0aGlzLmluaXRpYWxpc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHZlcmlmeSgpIHtcbiAgICBsZXQgdmVyaWZpZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHR5cGVQcmVmaXhlcyA9IHRoaXMuZ2V0VHlwZVByZWZpeGVzKCksXG4gICAgICAgICAgcmVsZWFzZUNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICB0eXBlUHJlZml4ZXNWZXJpZnkgPSB2ZXJpZnlUeXBlUHJlZml4ZXModHlwZVByZWZpeGVzLCByZWxlYXNlQ29udGV4dCk7XG5cbiAgICBpZiAodHlwZVByZWZpeGVzVmVyaWZ5KSB7XG4gICAgICBjb25zdCB2ZXJpZmllZEZpbGVDb250ZXh0cyA9IFtdLFxuICAgICAgICAgICAgZmlsZUNvbnRleHRzVmVyaWZ5ID0gdmVyaWZ5RmlsZUNvbnRleHRzKHRoaXMuZmlsZUNvbnRleHRzLCB2ZXJpZmllZEZpbGVDb250ZXh0cywgcmVsZWFzZUNvbnRleHQpO1xuXG4gICAgICBpZiAoZmlsZUNvbnRleHRzVmVyaWZ5KSB7XG4gICAgICAgIHRoaXMuZmlsZUNvbnRleHRzID0gdmVyaWZpZWRGaWxlQ29udGV4dHM7IC8vL1xuXG4gICAgICAgIHRoaXMudmVyaWZpZWQgPSB0cnVlO1xuXG4gICAgICAgIHZlcmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmVyaWZpZXM7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgZmlsZUNvbnRleHRzSlNPTiA9IHRoaXMuZmlsZUNvbnRleHRzLm1hcCgoZmlsZUNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZXh0SlNPTiA9IGZpbGVDb250ZXh0LnRvSlNPTigpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmlsZUNvbnRleHRKU09OO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGpzb24gPSBmaWxlQ29udGV4dHNKU09OOyAgLy8vXG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTG9nTmFtZUpTT05BbmRFbnRyaWVzKGxvZywgbmFtZSwganNvbiwgZW50cmllcykge1xuICAgIGNvbnN0IGxleGVyID0gbnVsbCxcbiAgICAgICAgICBwYXJzZXIgPSBudWxsLFxuICAgICAgICAgIHZlcmlmaWVzID0gZmFsc2UsXG4gICAgICAgICAgaW5pdGlhbGlzZWQgPSBmYWxzZSxcbiAgICAgICAgICBmaWxlQ29udGV4dHMgPSBbXSxcbiAgICAgICAgICBjdXN0b21HcmFtbWFyID0gY3VzdG9tR3JhbW1hckZyb21OYW1lQW5kRW50cmllcyhuYW1lLCBlbnRyaWVzKSxcbiAgICAgICAgICBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzID0gbnVsbCxcbiAgICAgICAgICByZWxlYXNlQ29udGV4dCA9IG5ldyBSZWxlYXNlQ29udGV4dChsb2csIG5hbWUsIGpzb24sIGVudHJpZXMsIGxleGVyLCBwYXJzZXIsIHZlcmlmaWVzLCBpbml0aWFsaXNlZCwgZmlsZUNvbnRleHRzLCBjdXN0b21HcmFtbWFyLCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKTtcblxuICAgIHJldHVybiByZWxlYXNlQ29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiB2ZXJpZnlUeXBlUHJlZml4ZXModHlwZVByZWZpeGVzLCByZWxlYXNlQ29udGV4dCkge1xuICBsZXQgdHlwZVByZWZpeGVzVmVyaWZ5ID0gdHJ1ZTtcblxuICBjb25zdCB0eXBlUHJlZml4ZXNMZW5ndGggPSB0eXBlUHJlZml4ZXMubGVuZ3RoLFxuICAgICAgICBjb21wcmVzc2VkVHlwZVByZWZpeGVzID0gWyAgLy8vXG4gICAgICAgICAgLi4udHlwZVByZWZpeGVzLFxuICAgICAgICBdO1xuXG4gIGNvbXByZXNzKGNvbXByZXNzZWRUeXBlUHJlZml4ZXMsICh0eXBlUHJlZml4QSwgdHlwZVByZWZpeEIpID0+IHtcbiAgICBjb25zdCB0eXBlUHJlZml4QU5hbWUgPSB0eXBlUHJlZml4QS5nZXROYW1lKCksXG4gICAgICAgICAgdHlwZVByZWZpeEJOYW1lID0gdHlwZVByZWZpeEIuZ2V0TmFtZSgpO1xuXG4gICAgaWYgKHR5cGVQcmVmaXhBTmFtZSAhPT0gdHlwZVByZWZpeEJOYW1lKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXByZXNzVHlwZVByZWZpeGVzTGVuZ3RoID0gY29tcHJlc3NlZFR5cGVQcmVmaXhlcy5sZW5ndGg7XG5cbiAgaWYgKHR5cGVQcmVmaXhlc0xlbmd0aCA+IGNvbXByZXNzVHlwZVByZWZpeGVzTGVuZ3RoKSB7XG4gICAgZmlsdGVyKGNvbXByZXNzZWRUeXBlUHJlZml4ZXMsICh0eXBlUHJlZml4KSA9PiB7XG4gICAgICBjb25zdCB0eXBlUHJlZml4ZXNJbmNsdWRlc1R5cGVQcmVmaXggPSB0eXBlUHJlZml4ZXMuaW5jbHVkZXModHlwZVByZWZpeCk7XG5cbiAgICAgIGlmICghdHlwZVByZWZpeGVzSW5jbHVkZXNUeXBlUHJlZml4KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZmlyc3RUeXBlUHJlZml4ID0gZmlyc3QodHlwZVByZWZpeGVzKSxcbiAgICAgICAgICB0eXBlUHJlZml4ID0gZmlyc3RUeXBlUHJlZml4LCAvLy9cbiAgICAgICAgICB0eXBlUHJlZml4U3RyaW5nID0gdHlwZVByZWZpeC5nZXRTdHJpbmcoKTtcblxuICAgIHJlbGVhc2VDb250ZXh0LmluZm8oYFRoZSAnJHt0eXBlUHJlZml4U3RyaW5nfScgdHlwZSBwcmVmaXggaXMgZHVwbGljYXRlZCBhdCBsZWFzdCBvbmNlLCBwb3NzaWJseSBhbW9uZyBvdGhlcnMuYClcblxuICAgIHR5cGVQcmVmaXhlc1ZlcmlmeSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVQcmVmaXhlc1ZlcmlmeTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RmlsZUNvbnRleHRzKGZpbGVDb250ZXh0cywgdmVyaWZpZWRGaWxlQ29udGV4dHMpIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGZpbGVDb250ZXh0cywgdmVyaWZpZWRGaWxlQ29udGV4dHMsIChmaWxlQ29udGV4dCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZXh0VmVyaWZpZXMgPSBmaWxlQ29udGV4dC52ZXJpZnkoKTtcblxuICAgICAgICAgIGlmIChmaWxlQ29udGV4dFZlcmlmaWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBmaWxlQ29udGV4dHNWZXJpZnkgPSByZXNvbHZlZDsgIC8vL1xuXG4gIHJldHVybiBmaWxlQ29udGV4dHNWZXJpZnk7XG59XG5cbmZ1bmN0aW9uIGZpbGVDb250ZXh0c0Zyb21KU09OKGpzb24sZmlsZUNvbnRleHRzLCByZWxlYXNlQ29udGV4dCkge1xuICBjb25zdCBmaWxlQ29udGV4dHNKU09OID0ganNvbjsgIC8vL1xuXG4gIGZpbGVDb250ZXh0c0pTT04uZm9yRWFjaCgoZmlsZUNvbnRleHRKU09OKSA9PiB7XG4gICAgY29uc3QgeyBmaWxlUGF0aCB9ID0gZmlsZUNvbnRleHRKU09OLFxuICAgICAgICAgIGpzb24gPSBmaWxlQ29udGV4dEpTT04sIC8vL1xuICAgICAgICAgIGZpbGVQYXRoRnVydGxlRmlsZVBhdGggPSBpc0ZpbGVQYXRoRnVydGxlRmlsZVBhdGgoZmlsZVBhdGgpLFxuICAgICAgICAgIGZpbGVQYXRoTm9taW5hbEZpbGVQYXRoID0gaXNGaWxlUGF0aE5vbWluYWxGaWxlUGF0aChmaWxlUGF0aCk7XG5cbiAgICBpZiAoZmlsZVBhdGhGdXJ0bGVGaWxlUGF0aCkge1xuICAgICAgY29uc3QgZnVydGxlRmlsZUNvbnRleHQgPSBGdXJ0bGVGaWxlQ29udGV4dC5mcm9tRmlsZVBhdGgoZmlsZVBhdGgsIHJlbGVhc2VDb250ZXh0KSxcbiAgICAgICAgICAgIGZpbGVDb250ZXh0ID0gZnVydGxlRmlsZUNvbnRleHQ7ICAvLy9cblxuICAgICAgZmlsZUNvbnRleHRzLnB1c2goZmlsZUNvbnRleHQpO1xuXG4gICAgICBmaWxlQ29udGV4dC5pbml0aWFsaXNlKGpzb24pO1xuICAgIH1cblxuICAgIGlmIChmaWxlUGF0aE5vbWluYWxGaWxlUGF0aCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHJlbGVhc2VDb250ZXh0LCAvLy9cbiAgICAgICAgICAgIGZpbGVDb250ZXh0ID0gTm9taW5hbEZpbGVDb250ZXh0LmZyb21GaWxlUGF0aChmaWxlUGF0aCwgY29udGV4dCk7XG5cbiAgICAgIGZpbGVDb250ZXh0cy5wdXNoKGZpbGVDb250ZXh0KTtcblxuICAgICAgZmlsZUNvbnRleHQuaW5pdGlhbGlzZShqc29uKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaWxlQ29udGV4dHNGcm9tRW50cmllcyhlbnRyaWVzLCBmaWxlQ29udGV4dHMsIHJlbGVhc2VDb250ZXh0KSB7XG4gIGVudHJpZXMuZm9yRWFjaEZpbGUoKGZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUuZ2V0UGF0aCgpLFxuICAgICAgICAgIGZpbGVQYXRoRnVydGxlRmlsZVBhdGggPSBpc0ZpbGVQYXRoRnVydGxlRmlsZVBhdGgoZmlsZVBhdGgpLFxuICAgICAgICAgIGZpbGVQYXRoTm9taW5hbEZpbGVQYXRoID0gaXNGaWxlUGF0aE5vbWluYWxGaWxlUGF0aChmaWxlUGF0aCk7XG5cbiAgICBpZiAoZmlsZVBhdGhGdXJ0bGVGaWxlUGF0aCkge1xuICAgICAgY29uc3QgZnVydGxlRmlsZUNvbnRleHQgPSBGdXJ0bGVGaWxlQ29udGV4dC5mcm9tRmlsZShmaWxlLCByZWxlYXNlQ29udGV4dCksXG4gICAgICAgICAgICBmaWxlQ29udGV4dCA9IGZ1cnRsZUZpbGVDb250ZXh0OyAgLy8vXG5cbiAgICAgIGZpbGVDb250ZXh0cy5wdXNoKGZpbGVDb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZVBhdGhOb21pbmFsRmlsZVBhdGgpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSByZWxlYXNlQ29udGV4dCwgLy8vXG4gICAgICAgICAgICBmaWxlQ29udGV4dCA9IE5vbWluYWxGaWxlQ29udGV4dC5mcm9tRmlsZShmaWxlLCBjb250ZXh0KTtcblxuICAgICAgZmlsZUNvbnRleHRzLnB1c2goZmlsZUNvbnRleHQpO1xuICAgIH1cbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiUmVsZWFzZUNvbnRleHQiLCJub21pbmFsTGV4ZXJGcm9tQ29tYmluZWRDdXN0b21HcmFtbWFyIiwibGV4ZXJzVXRpbGl0aWVzIiwibm9taW5hbFBhcnNlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIiLCJwYXJzZXJzVXRpbGl0aWVzIiwidGFpbCIsImFycmF5VXRpbGl0aWVzIiwicHVzaCIsImZpcnN0IiwiY2xlYXIiLCJmaWx0ZXIiLCJyZXNvbHZlIiwiY29tcHJlc3MiLCJpc0ZpbGVQYXRoRnVydGxlRmlsZVBhdGgiLCJmaWxlUGF0aFV0aWxpdGllcyIsImlzRmlsZVBhdGhOb21pbmFsRmlsZVBhdGgiLCJMRVZFTFMiLCJUUkFDRV9MRVZFTCIsIkRFQlVHX0xFVkVMIiwiSU5GT19MRVZFTCIsIldBUk5JTkdfTEVWRUwiLCJFUlJPUl9MRVZFTCIsImxvZyIsIm5hbWUiLCJqc29uIiwiZW50cmllcyIsImxleGVyIiwicGFyc2VyIiwidmVyaWZpZWQiLCJpbml0aWFsaXNlZCIsImZpbGVDb250ZXh0cyIsImN1c3RvbUdyYW1tYXIiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzIiwiZ2V0TG9nIiwiZ2V0TmFtZSIsImdldEpTT04iLCJnZXRFbnRyaWVzIiwiZ2V0TGV4ZXIiLCJnZXRQYXJzZXIiLCJnZXRNZXRhVHlwZXMiLCJtZXRhVHlwZXMiLCJpc1ZlcmlmaWVkIiwiaXNJbml0aWFsaXNlZCIsImdldEZpbGVDb250ZXh0cyIsImdldEN1c3RvbUdyYW1tYXIiLCJnZXREZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzIiwiaXNSZWxlYXNlZCIsInJlbGVhc2VkIiwiZmluZEZpbGUiLCJmaWxlUGF0aCIsImZpbmRGaWxlQ29udGV4dCIsImZpbGVDb250ZXh0IiwiZmluZCIsImZpbGVDb250ZXh0RmlsZVBhdGgiLCJnZXRGaWxlUGF0aCIsImdldFR5cGVQcmVmaXgiLCJ0eXBlUHJlZml4IiwiaW5jbHVkZURlcGVuZGVuY2llcyIsInR5cGVQcmVmaXhlcyIsImdldFR5cGVQcmVmaXhlcyIsInR5cGVQcmVmaXhlc0xlbmd0aCIsImxlbmd0aCIsImZpcnN0VHlwZVByZWZpeCIsImdldExhYmVscyIsImxhYmVscyIsImZvckVhY2giLCJpbmNsdWRlUmVsZWFzZSIsImZpbGVDb250ZXh0TGFiZWxzIiwicmVsZWFzZUNvbnRleHQiLCJyZWxlYXNlQ29udGV4dExhYmVscyIsImdldFR5cGVzIiwidHlwZXMiLCJmaWxlQ29udGV4dFR5cGVzIiwicmVsZWFzZUNvbnRleHRUeXBlcyIsImdldFJ1bGVzIiwicnVsZXMiLCJmaWxlQ29udGV4dFJ1bGVzIiwicmVsZWFzZUNvbnRleHRSdWxlcyIsImdldEF4aW9tcyIsImF4aW9tcyIsImZpbGVDb250ZXh0QXhpb21zIiwicmVsZWFzZUNvbnRleHRBeGlvbXMiLCJnZXRMZW1tYXMiLCJsZW1tYXMiLCJmaWxlQ29udGV4dExlbW1hcyIsImdldFRoZW9yZW1zIiwidGhlb3JlbXMiLCJmaWxlQ29udGV4dFRoZW9yZW1zIiwicmVsZWFzZUNvbnRleHRUaGVvcmVtcyIsImdldFByb2NlZHVyZXMiLCJwcm9jZWR1cmVzIiwiZmlsZUNvbnRleHRQcm9jZWR1cmVzIiwicmVsZWFzZUNvbnRleHRQcm9jZWR1cmVzIiwiZ2V0TWV0YUxlbW1hcyIsIm1ldGFMZW1tYXMiLCJmaWxlQ29udGV4dE1ldGFMZW1tYXMiLCJnZXRDb25qZWN0dXJlcyIsImNvbmplY3R1cmVzIiwiZmlsZUNvbnRleHRDb25qZWN0dXJlcyIsInJlbGVhc2VDb250ZXh0Q29uamVjdHVyZXMiLCJnZXRDb21iaW5hdG9ycyIsImNvbWJpbmF0b3JzIiwiZmlsZUNvbnRleHRDb21iaW5hdG9ycyIsInJlbGVhc2VDb250ZXh0Q29tYmluYXRvcnMiLCJmaWxlQ29udGV4dFR5cGVQcmVmaXhlcyIsInJlbGVhc2VDb250ZXh0VHlwZVByZWZpeGVzIiwiZ2V0Q29uc3RydWN0b3JzIiwiY29uc3RydWN0b3JzIiwiZmlsZUNvbnRleHRDb25zdHJ1Y3RvcnMiLCJyZWxlYXNlQ29udGV4dENvbnN0cnVjdG9ycyIsImdldE1ldGF0aGVvcmVtcyIsIm1ldGF0aGVvcmVtcyIsImZpbGVDb250ZXh0TWV0YXRoZW9yZW1zIiwicmVsZWFzZUNvbnRleHRNZXRhdGhlb3JlbXMiLCJhZGRGaWxlQ29udGV4dCIsImdldFJlbGVhc2VOYW1lIiwicmVsZWFzZU5hbWUiLCJnZXRGaWxlIiwiZ2V0VmVyc2lvbiIsImdldEZpbGVQYXRocyIsImdldERlcGVuZGVuY2llcyIsIm1hdGNoU2hvcnRlbmVkVmVyc2lvbiIsInNob3J0ZW5lZFZlcnNpb24iLCJ0cmFjZSIsIm1lc3NhZ2UiLCJsaW5lSW5kZXgiLCJsZXZlbCIsIndyaXRlVG9Mb2ciLCJkZWJ1ZyIsImluZm8iLCJ3YXJuaW5nIiwiZXJyb3IiLCJ3cml0ZSIsImdldEZpbGVDb250ZXh0IiwiZ2V0RGVwdGgiLCJkZXB0aCIsImluaXRpYWxpc2UiLCJyZWxlYXNlQ29udGV4dHMiLCJjb21iaW5lZEN1c3RvbUdyYW1tYXIiLCJjb21iaW5lZEN1c3RvbUdyYW1tYXJGcm9tUmVsZWFzZUNvbnRleHRzIiwibm9taW5hbExleGVyIiwiTm9taW5hbExleGVyIiwibm9taW5hbFBhcnNlciIsIk5vbWluYWxQYXJzZXIiLCJmaWxlQ29udGV4dHNGcm9tSlNPTiIsImZpbGVDb250ZXh0c0Zyb21FbnRyaWVzIiwidmVyaWZ5IiwidmVyaWZpZXMiLCJ0eXBlUHJlZml4ZXNWZXJpZnkiLCJ2ZXJpZnlUeXBlUHJlZml4ZXMiLCJ2ZXJpZmllZEZpbGVDb250ZXh0cyIsImZpbGVDb250ZXh0c1ZlcmlmeSIsInZlcmlmeUZpbGVDb250ZXh0cyIsInRvSlNPTiIsImZpbGVDb250ZXh0c0pTT04iLCJtYXAiLCJmaWxlQ29udGV4dEpTT04iLCJmcm9tTG9nTmFtZUpTT05BbmRFbnRyaWVzIiwiY3VzdG9tR3JhbW1hckZyb21OYW1lQW5kRW50cmllcyIsImNvbXByZXNzZWRUeXBlUHJlZml4ZXMiLCJ0eXBlUHJlZml4QSIsInR5cGVQcmVmaXhCIiwidHlwZVByZWZpeEFOYW1lIiwidHlwZVByZWZpeEJOYW1lIiwiY29tcHJlc3NUeXBlUHJlZml4ZXNMZW5ndGgiLCJ0eXBlUHJlZml4ZXNJbmNsdWRlc1R5cGVQcmVmaXgiLCJpbmNsdWRlcyIsInR5cGVQcmVmaXhTdHJpbmciLCJnZXRTdHJpbmciLCJyZXNvbHZlZCIsImZpbGVDb250ZXh0VmVyaWZpZXMiLCJmaWxlUGF0aEZ1cnRsZUZpbGVQYXRoIiwiZmlsZVBhdGhOb21pbmFsRmlsZVBhdGgiLCJmdXJ0bGVGaWxlQ29udGV4dCIsIkZ1cnRsZUZpbGVDb250ZXh0IiwiZnJvbUZpbGVQYXRoIiwiY29udGV4dCIsIk5vbWluYWxGaWxlQ29udGV4dCIsImZvckVhY2hGaWxlIiwiZmlsZSIsImdldFBhdGgiLCJmcm9tRmlsZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7ZUFzQnFCQTs7O3lCQXBCVTswQkFFRzttQ0FDZ0I7NkRBSXBCOzhEQUNDO3lCQUVSO3lCQUNNOzZCQUM2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFMUYsSUFBTSxBQUFFQyx3Q0FBMENDLG9DQUFlLENBQXpERCx1Q0FDRixBQUFFRSx5Q0FBMkNDLHFDQUFnQixDQUEzREQsd0NBQ0FFLE9BQXdEQyx5QkFBYyxDQUF0RUQsTUFBTUUsT0FBa0RELHlCQUFjLENBQWhFQyxNQUFNQyxRQUE0Q0YseUJBQWMsQ0FBMURFLE9BQU9DLFFBQXFDSCx5QkFBYyxDQUFuREcsT0FBT0MsU0FBOEJKLHlCQUFjLENBQTVDSSxRQUFRQyxVQUFzQkwseUJBQWMsQ0FBcENLLFNBQVNDLFdBQWFOLHlCQUFjLENBQTNCTSxVQUMzQ0MsMkJBQXdEQyw2QkFBaUIsQ0FBekVELDBCQUEwQkUsNEJBQThCRCw2QkFBaUIsQ0FBL0NDLDJCQUMyQ0MsMkJBQUFBLGlCQUFNLE1BQTNFQyxjQUFxRUQsWUFBeERFLGNBQXdERixZQUEzQ0csYUFBMkNILFlBQS9CSSxnQkFBK0JKLFlBQWhCSyxjQUFnQkw7QUFFOUQsSUFBQSxBQUFNaEIsK0JBQU47YUFBTUEsZUFDUHNCLElBQUcsRUFBRUMsSUFBSSxFQUFFQyxJQUFJLEVBQUVDLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBRUMsV0FBVyxFQUFFQyxZQUFZLEVBQUVDLGFBQWEsRUFBRUMseUJBQXlCO2dDQUQvR2hDO1FBRWpCLElBQUksQ0FBQ3NCLEdBQUcsR0FBR0E7UUFDWCxJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJ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