occam-languages 0.0.128 → 0.0.129

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.
@@ -9,83 +9,135 @@ function _export(target, all) {
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- get createReleaseContext () {
13
- return createReleaseContext;
12
+ get createReleaseContexts () {
13
+ return createReleaseContexts;
14
14
  },
15
15
  get default () {
16
16
  return _default;
17
17
  },
18
- get initialiseReleaseContext () {
19
- return initialiseReleaseContext;
18
+ get initialiseReleaseContexts () {
19
+ return initialiseReleaseContexts;
20
20
  },
21
- get verifyReleaseContext () {
22
- return verifyReleaseContext;
21
+ get verifyReleaseContexts () {
22
+ return verifyReleaseContexts;
23
23
  }
24
24
  });
25
+ const _occamdirectedgraphs = require("occam-directed-graphs");
25
26
  const _necessary = require("necessary");
27
+ const _constants = require("../constants");
26
28
  const _dependency = require("../utilities/dependency");
27
- const { last } = _necessary.arrayUtilities;
28
- function initialiseReleaseContext(dependency, context) {
29
- const { log, releaseContextMap } = context, dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName] || null;
29
+ const { first, last } = _necessary.arrayUtilities;
30
+ async function createReleaseContexts(dependency, context) {
31
+ let releaseContextsCreated = false;
32
+ const dependentNames = [], releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
33
+ if (releaseContextCreated) {
34
+ releaseContextsCreated = true;
35
+ }
36
+ return releaseContextsCreated;
37
+ }
38
+ function initialiseReleaseContexts(dependency, context) {
39
+ let releaseContextsInitialised = false;
40
+ const directedGraph = _occamdirectedgraphs.DirectedGraph.fromNothing(), visitedDependencyNames = [];
41
+ addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
42
+ const cyclicDependenciesPresent = checkCyclicDependenciesPresent(directedGraph, context);
43
+ if (!cyclicDependenciesPresent) {
44
+ const { releaseContextMap } = context, releaseNames = Object.keys(releaseContextMap), orderedVertexNames = directedGraph.getOrderedVertexNames(), orderedDependencyNames = orderedVertexNames; ///
45
+ releaseNames.forEach((releaseName)=>{
46
+ const releaseContext = releaseContextMap[releaseName];
47
+ initialiseReleaseContext(releaseContext, orderedDependencyNames, context);
48
+ });
49
+ releaseContextsInitialised = true;
50
+ }
51
+ return releaseContextsInitialised;
52
+ }
53
+ async function verifyReleaseContexts(dependency, context) {
54
+ let releaseContextsVerify = false;
55
+ const dependencyName = dependency.getName(), releaseName = dependencyName, dependentName = null, dependentReleased = false, releaseContextVerifies = await verifyReleaseContext(releaseName, dependentName, dependentReleased, context);
56
+ if (releaseContextVerifies) {
57
+ releaseContextsVerify = true;
58
+ }
59
+ return releaseContextsVerify;
60
+ }
61
+ const _default = {
62
+ createReleaseContexts,
63
+ initialiseReleaseContexts,
64
+ verifyReleaseContexts
65
+ };
66
+ function addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context) {
67
+ const dependencyName = dependency.getName(), visitedDependencyNameIncludesDependencyName = visitedDependencyNames.includes(dependencyName);
68
+ if (visitedDependencyNameIncludesDependencyName) {
69
+ return;
70
+ }
71
+ const visiteddependencyName = dependencyName; ///
72
+ visitedDependencyNames.push(visiteddependencyName);
73
+ const { log, releaseContextMap } = context, releaseName = dependencyName, releaseContext = releaseContextMap[releaseName] || null;
30
74
  if (releaseContext === null) {
31
- log.warning(`Unable to initialise the '${dependencyName}' context because it has not been created.`);
32
- } else {
33
- const releaseContextInitialised = releaseContext.isInitialised();
34
- if (!releaseContextInitialised) {
35
- initialiseDependencyReleaseContexts(dependency, releaseContext, context);
36
- const releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap);
37
- log.info(`Initialising the '${dependencyName}' context...`);
38
- const { FileContextFromFilePath } = context;
39
- releaseContext.initialise(releaseContexts, FileContextFromFilePath);
40
- log.debug(`...initialised the '${dependencyName}' context.`);
41
- }
75
+ const dependencyString = dependency.getString();
76
+ log.warning(`No package context has been created for the '${dependencyString}' dependency. `);
77
+ return;
42
78
  }
79
+ const dependencies = releaseContext.getDependencies(), targetVertexName = dependencyName; ///
80
+ dependencies.forEachDependency((dependency)=>{
81
+ const dependencyName = dependency.getName(), sourceVertexName = dependencyName; ///
82
+ directedGraph.addEdgeBySourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
83
+ addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
84
+ });
85
+ }
86
+ function initialiseReleaseContext(releaseContext, orderedDependencyNames, context) {
87
+ const { log, releaseContextMap, FileContextFromFilePath } = context, releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap), releaseContextName = releaseContext.getName();
88
+ releaseContexts.sort((releaseContextA, releaseContextB)=>{
89
+ const releaseContextAName = releaseContextA.getName(), releaseContextBName = releaseContextB.getName(), dependencyNameA = releaseContextAName, dependencyNameB = releaseContextBName, indexA = orderedDependencyNames.indexOf(dependencyNameA), indexB = orderedDependencyNames.indexOf(dependencyNameB);
90
+ return indexA - indexB;
91
+ });
92
+ log.info(`Initialising the '${releaseContextName}' package context...`);
93
+ releaseContext.initialise(releaseContexts, FileContextFromFilePath);
94
+ log.debug(`...initialised the '${releaseContextName}' package context.`);
43
95
  }
44
96
  async function createReleaseContext(dependency, dependentNames, context) {
45
97
  let releaseContextCreated = false;
46
- const { log, releaseContextMap } = context, dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName] || null;
98
+ const { log, releaseContextMap, releaseContextFromDependency } = context, dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName] || null;
47
99
  if (releaseContext !== null) {
48
100
  const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
49
101
  if (releaseMatchesDependency) {
50
- log.debug(`The '${releaseName}' context has already been created.`);
102
+ log.debug(`The '${releaseName}' package context has already been created.`);
51
103
  releaseContextCreated = true;
52
104
  }
53
105
  } else {
54
106
  const dependencyString = dependency.asString(), dependentNamesLength = dependentNames.length;
55
107
  if (dependentNamesLength === 0) {
56
- log.info(`Creating the '${releaseName}' context...`);
108
+ log.info(`Creating the '${releaseName}' package context...`);
57
109
  } else {
58
110
  const lastDependentName = last(dependentNames), dependentName = lastDependentName; ///
59
- log.info(`Creating the '${releaseName}' context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
111
+ log.info(`Creating the '${releaseName}' package context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
60
112
  }
61
- const { releaseContextFromDependency } = context, releaseContext = await releaseContextFromDependency(dependency, context);
113
+ const releaseContext = await releaseContextFromDependency(dependency, context);
62
114
  if (releaseContext !== null) {
63
115
  const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
64
116
  if (releaseMatchesDependency) {
65
117
  releaseContextMap[releaseName] = releaseContext;
66
- const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(dependency, releaseContext, dependentNames, context);
118
+ const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context);
67
119
  if (dependencyReleaseContextsCreated) {
68
120
  releaseContextCreated = true;
69
121
  }
70
122
  }
71
123
  } else {
72
124
  const dependencyName = dependency.getName(), releaseName = dependencyName; ///
73
- log.warning(`The '${releaseName}' context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
125
+ log.warning(`The '${releaseName}' package context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
74
126
  }
75
- releaseContextCreated ? log.debug(`...created the '${releaseName}' context.`) : log.warning(`...unable to create the '${releaseName}' context.`);
127
+ releaseContextCreated ? log.debug(`...created the '${releaseName}' package context.`) : log.warning(`...unable to create the '${releaseName}' package context.`);
76
128
  }
77
129
  return releaseContextCreated;
78
130
  }
79
131
  async function verifyReleaseContext(releaseName, dependentName, dependentReleased, releaseContextMap) {
80
132
  let releaseContextVerifies = false;
81
- const releaseContext = releaseContextMap[releaseName];
133
+ const releaseContext = releaseContextMap[releaseName] || null;
82
134
  if (releaseContext !== null) {
83
135
  const released = releaseContext.isReleased();
84
136
  if (released) {
85
137
  releaseContextVerifies = true;
86
138
  } else {
87
139
  if (dependentReleased) {
88
- releaseContext.warning(`The '${releaseName}' project cannot be verifies because its '${dependentName}' dependent is a package.`);
140
+ releaseContext.warning(`The '${releaseName}' project cannot be verified because its '${dependentName}' dependent is a package.`);
89
141
  } else {
90
142
  const dependentName = releaseName, dependentReleased = released, dependencyReleaseContextsVerify = await verifyDependencyReleaseContexts(releaseContext, dependentName, dependentReleased, releaseContextMap);
91
143
  if (dependencyReleaseContextsVerify) {
@@ -106,25 +158,17 @@ async function verifyReleaseContext(releaseName, dependentName, dependentRelease
106
158
  }
107
159
  return releaseContextVerifies;
108
160
  }
109
- const _default = {
110
- createReleaseContext,
111
- verifyReleaseContext,
112
- initialiseReleaseContext
113
- };
114
- async function createDependencyReleaseContexts(dependency, releaseContext, dependentNames, context) {
161
+ async function createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context) {
115
162
  let dependencyReleaseContextsCreated;
116
- const dependencyName = dependency.getName(), dependencies = releaseContext.getDependencies();
163
+ const name = releaseContext.getName(), dependencies = releaseContext.getDependencies(), dependencyName = name; ///
117
164
  dependentNames = [
118
165
  ...dependentNames,
119
166
  dependencyName
120
167
  ]; ///
121
168
  dependencyReleaseContextsCreated = await (0, _dependency.asyncEveryDependency)(dependencies, async (dependency)=>{
122
- const cyclicDependencyExists = checkCyclicDependencyExists(dependency, dependentNames, context);
123
- if (!cyclicDependencyExists) {
124
- const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
125
- if (releaseContextCreated) {
126
- return true;
127
- }
169
+ const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
170
+ if (releaseContextCreated) {
171
+ return true;
128
172
  }
129
173
  });
130
174
  return dependencyReleaseContextsCreated;
@@ -138,40 +182,22 @@ async function verifyDependencyReleaseContexts(releaseContext, dependentName, de
138
182
  });
139
183
  return dependencyReleaseContextsVerify;
140
184
  }
141
- function retrieveReleaseContexts(releaseContext, releaseContextMap) {
142
- const releaseContexts = [], remainingReleaseContext = releaseContext, remainingReleaseContexts = [
143
- remainingReleaseContext
144
- ];
145
- let remainingReleaseContextsLength = remainingReleaseContexts.length;
146
- while(remainingReleaseContextsLength > 0){
147
- const remainingReleaseContext = remainingReleaseContexts.shift(), releaseContext = remainingReleaseContext; ///
148
- releaseContexts.push(releaseContext);
149
- const dependencies = releaseContext.getDependencies();
150
- dependencies.forEachDependency((dependency)=>{
151
- const dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName], releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext), remainingReleaseContextsIncludesReleaseContext = remainingReleaseContexts.includes(releaseContext);
152
- if (!releaseContextsIncludesReleaseContext && !remainingReleaseContextsIncludesReleaseContext) {
153
- const remainingReleaseContext = releaseContext; ///
154
- remainingReleaseContexts.push(remainingReleaseContext);
155
- }
156
- });
157
- remainingReleaseContextsLength = remainingReleaseContexts.length;
185
+ function retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts = []) {
186
+ const releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext);
187
+ if (releaseContextsIncludesReleaseContext) {
188
+ return;
158
189
  }
190
+ releaseContexts.push(releaseContext);
191
+ const dependencies = releaseContext.getDependencies();
192
+ dependencies.forEachDependency((dependency)=>{
193
+ const dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName];
194
+ retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts);
195
+ });
159
196
  return releaseContexts;
160
197
  }
161
- function checkCyclicDependencyExists(dependency, dependentNames, context) {
162
- const dependencyName = dependency.getName(), dependentNamesIncludesDependencyName = dependentNames.includes(dependencyName), cyclicDependencyExists = dependentNamesIncludesDependencyName; ///
163
- if (cyclicDependencyExists) {
164
- const { log } = context, firstDependentName = first(dependentNames), dependencyNames = [
165
- ...dependentNames,
166
- firstDependentName
167
- ], dependencyNamesString = dependencyNames.join(`' -> '`);
168
- log.warning(`There is a cyclic dependency, '${dependencyNamesString}'.`);
169
- }
170
- return cyclicDependencyExists;
171
- }
172
198
  function checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context) {
173
199
  let releaseMatchesDependency = true;
174
- const shortenedVersion = dependency.getShortedVersion();
200
+ const shortenedVersion = dependency.getShortenedVersion();
175
201
  if (shortenedVersion !== null) {
176
202
  const entriesMatchShortenedVersion = releaseContext.matchShortenedVersion(shortenedVersion);
177
203
  if (!entriesMatchShortenedVersion) {
@@ -182,11 +208,18 @@ function checkReleaseMatchesDependency(releaseContext, dependency, dependentName
182
208
  }
183
209
  return releaseMatchesDependency;
184
210
  }
185
- function initialiseDependencyReleaseContexts(dependency, releaseContext, context) {
186
- const dependencies = releaseContext.getDependencies();
187
- dependencies.forEachDependency((dependency)=>{
188
- initialiseReleaseContext(dependency, context);
189
- });
211
+ function checkCyclicDependenciesPresent(directedGraph, context) {
212
+ let cyclicDependenciesPresent = false;
213
+ const firstCycle = directedGraph.getFirstCycle();
214
+ if (firstCycle !== null) {
215
+ const { log } = context, vertexNames = firstCycle.getVertexNames(), dependencyNames = vertexNames, firstDependencyName = first(dependencyNames), cyclicDependencyNames = [
216
+ ...dependencyNames,
217
+ firstDependencyName
218
+ ], cycleString = cyclicDependencyNames.join(_constants.SINGLE_SPACE);
219
+ log.warning(`There is at least one '${cycleString}'. cyclic dependency`);
220
+ cyclicDependenciesPresent = true;
221
+ }
222
+ return cyclicDependenciesPresent;
190
223
  }
191
224
 
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdmVyaWZpY2F0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IHsgYXN5bmNFdmVyeURlcGVuZGVuY3kgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2RlcGVuZGVuY3lcIjtcblxuY29uc3QgeyBsYXN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpc2VSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgbG9nLCByZWxlYXNlQ29udGV4dE1hcCB9ID0gY29udGV4dCxcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZSwgLy8vXG4gICAgICAgIHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdIHx8IG51bGw7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ID09PSBudWxsKSB7XG4gICAgbG9nLndhcm5pbmcoYFVuYWJsZSB0byBpbml0aWFsaXNlIHRoZSAnJHtkZXBlbmRlbmN5TmFtZX0nIGNvbnRleHQgYmVjYXVzZSBpdCBoYXMgbm90IGJlZW4gY3JlYXRlZC5gKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByZWxlYXNlQ29udGV4dEluaXRpYWxpc2VkID0gcmVsZWFzZUNvbnRleHQuaXNJbml0aWFsaXNlZCgpO1xuXG4gICAgaWYgKCFyZWxlYXNlQ29udGV4dEluaXRpYWxpc2VkKSB7XG4gICAgICBpbml0aWFsaXNlRGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyhkZXBlbmRlbmN5LCByZWxlYXNlQ29udGV4dCwgY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0cyA9IHJldHJpZXZlUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCByZWxlYXNlQ29udGV4dE1hcCk7XG5cbiAgICAgIGxvZy5pbmZvKGBJbml0aWFsaXNpbmcgdGhlICcke2RlcGVuZGVuY3lOYW1lfScgY29udGV4dC4uLmApO1xuXG4gICAgICBjb25zdCB7IEZpbGVDb250ZXh0RnJvbUZpbGVQYXRoIH0gPSBjb250ZXh0O1xuXG4gICAgICByZWxlYXNlQ29udGV4dC5pbml0aWFsaXNlKHJlbGVhc2VDb250ZXh0cywgRmlsZUNvbnRleHRGcm9tRmlsZVBhdGgpO1xuXG4gICAgICBsb2cuZGVidWcoYC4uLmluaXRpYWxpc2VkIHRoZSAnJHtkZXBlbmRlbmN5TmFtZX0nIGNvbnRleHQuYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgeyBsb2csIHJlbGVhc2VDb250ZXh0TWFwIH0gPSBjb250ZXh0LFxuICAgICAgICBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICByZWxlYXNlTmFtZSA9IGRlcGVuZGVuY3lOYW1lLCAvLy9cbiAgICAgICAgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV0gfHwgbnVsbDtcblxuICBpZiAocmVsZWFzZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICBjb25zdCByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgJyR7cmVsZWFzZU5hbWV9JyBjb250ZXh0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC5gKTtcblxuICAgICAgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeVN0cmluZyA9IGRlcGVuZGVuY3kuYXNTdHJpbmcoKSxcbiAgICAgICAgICBkZXBlbmRlbnROYW1lc0xlbmd0aCA9IGRlcGVuZGVudE5hbWVzLmxlbmd0aDtcblxuICAgIGlmIChkZXBlbmRlbnROYW1lc0xlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nLmluZm8oYENyZWF0aW5nIHRoZSAnJHtyZWxlYXNlTmFtZX0nIGNvbnRleHQuLi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFzdERlcGVuZGVudE5hbWUgPSBsYXN0KGRlcGVuZGVudE5hbWVzKSxcbiAgICAgICAgICAgIGRlcGVuZGVudE5hbWUgPSBsYXN0RGVwZW5kZW50TmFtZTsgIC8vL1xuXG4gICAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgdGhlICcke3JlbGVhc2VOYW1lfScgY29udGV4dCBnaXZlbiB0aGUgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGFudCdzICcke2RlcGVuZGVuY3lTdHJpbmd9JyBkZXBlbmRlbmN5Li4uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyByZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5IH0gPSBjb250ZXh0LFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0ID0gYXdhaXQgcmVsZWFzZUNvbnRleHRGcm9tRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBjb250ZXh0KTtcblxuICAgIGlmIChyZWxlYXNlQ29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5ID0gY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSkge1xuICAgICAgICByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV0gPSByZWxlYXNlQ29udGV4dDtcblxuICAgICAgICBjb25zdCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCA9IGF3YWl0IGNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMoZGVwZW5kZW5jeSwgcmVsZWFzZUNvbnRleHQsIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQpIHtcbiAgICAgICAgICByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgICAgICByZWxlYXNlTmFtZSA9IGRlcGVuZGVuY3lOYW1lOyAvLy9cblxuICAgICAgbG9nLndhcm5pbmcoYFRoZSAnJHtyZWxlYXNlTmFtZX0nIGNvbnRleHQgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBlcmhhcHMgdGhlICdtZXRhLmpzb24nIGZpbGUgaXMgbWlzc2luZyBvciBpbnZhbGlkLiBPciB0aGVyZSBjb3VsZCBiZSBhIGRlcGVuZGVuY3kgbWlzbWF0Y2guYCk7XG4gICAgfVxuXG4gICAgcmVsZWFzZUNvbnRleHRDcmVhdGVkID9cbiAgICAgIGxvZy5kZWJ1ZyhgLi4uY3JlYXRlZCB0aGUgJyR7cmVsZWFzZU5hbWV9JyBjb250ZXh0LmApIDpcbiAgICAgICAgbG9nLndhcm5pbmcoYC4uLnVuYWJsZSB0byBjcmVhdGUgdGhlICcke3JlbGVhc2VOYW1lfScgY29udGV4dC5gKTtcbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dENyZWF0ZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlSZWxlYXNlQ29udGV4dChyZWxlYXNlTmFtZSwgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIHJlbGVhc2VDb250ZXh0TWFwKSB7XG4gIGxldCByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gZmFsc2U7XG5cbiAgY29uc3QgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV07XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcmVsZWFzZWQgPSByZWxlYXNlQ29udGV4dC5pc1JlbGVhc2VkKCk7XG5cbiAgICBpZiAocmVsZWFzZWQpIHtcbiAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVwZW5kZW50UmVsZWFzZWQpIHtcbiAgICAgICAgcmVsZWFzZUNvbnRleHQud2FybmluZyhgVGhlICcke3JlbGVhc2VOYW1lfScgcHJvamVjdCBjYW5ub3QgYmUgdmVyaWZpZXMgYmVjYXVzZSBpdHMgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGVudCBpcyBhIHBhY2thZ2UuYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZXBlbmRlbnROYW1lID0gcmVsZWFzZU5hbWUsICAvLy9cbiAgICAgICAgICAgICAgZGVwZW5kZW50UmVsZWFzZWQgPSByZWxlYXNlZCwgLy8vXG4gICAgICAgICAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkgPSBhd2FpdCB2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgcmVsZWFzZUNvbnRleHRNYXApO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5KSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZUNvbnRleHRWZXJpZmllZCA9IHJlbGVhc2VDb250ZXh0Lmhhc1ZlcmlmaWVkKCk7XG5cbiAgICAgICAgICBpZiAocmVsZWFzZUNvbnRleHRWZXJpZmllZCkge1xuICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0LmluZm8oYFZlcmlmeWluZyB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0Li4uYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcmlmaWVzID0gYXdhaXQgcmVsZWFzZUNvbnRleHQudmVyaWZ5KCk7XG5cbiAgICAgICAgICAgIGlmICh2ZXJpZmllcykge1xuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dC5pbmZvKGAuLi52ZXJpZmllZCB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0LmApO1xuXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dFZlcmlmaWVzO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNyZWF0ZVJlbGVhc2VDb250ZXh0LFxuICB2ZXJpZnlSZWxlYXNlQ29udGV4dCxcbiAgaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0XG59O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG5cbiAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgZGVwZW5kZW50TmFtZXMgPSBbIC4uLmRlcGVuZGVudE5hbWVzLCBkZXBlbmRlbmN5TmFtZSBdOyAgLy8vXG5cbiAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSBhd2FpdCBhc3luY0V2ZXJ5RGVwZW5kZW5jeShkZXBlbmRlbmNpZXMsIGFzeW5jIChkZXBlbmRlbmN5KSA9PiB7XG4gICAgY29uc3QgY3ljbGljRGVwZW5kZW5jeUV4aXN0cyA9IGNoZWNrQ3ljbGljRGVwZW5kZW5jeUV4aXN0cyhkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgICBpZiAoIWN5Y2xpY0RlcGVuZGVuY3lFeGlzdHMpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA9IGF3YWl0IGNyZWF0ZVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHJlbGVhc2VDb250ZXh0Q3JlYXRlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIHJlbGVhc2VDb250ZXh0TWFwKSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHJlbGVhc2VDb250ZXh0LmdldERlcGVuZGVuY2llcygpLFxuICAgICAgICBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5ID0gYXdhaXQgYXN5bmNFdmVyeURlcGVuZGVuY3koZGVwZW5kZW5jaWVzLCBhc3luYyAoZGVwZW5kZW5jeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICByZWxlYXNlTmFtZSA9IG5hbWUsIC8vL1xuICAgICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSBhd2FpdCB2ZXJpZnlSZWxlYXNlQ29udGV4dChyZWxlYXNlTmFtZSwgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIHJlbGVhc2VDb250ZXh0TWFwKTtcblxuICAgICAgICAgIGlmIChyZWxlYXNlQ29udGV4dFZlcmlmaWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gIHJldHVybiBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5O1xufVxuXG5mdW5jdGlvbiByZXRyaWV2ZVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgcmVsZWFzZUNvbnRleHRNYXApIHtcbiAgY29uc3QgcmVsZWFzZUNvbnRleHRzID0gW10sXG4gICAgICAgIHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHQsICAvLy9cbiAgICAgICAgcmVtYWluaW5nUmVsZWFzZUNvbnRleHRzID0gW1xuICAgICAgICAgIHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0XG4gICAgICAgIF07XG5cbiAgbGV0IHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0c0xlbmd0aCA9IHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0cy5sZW5ndGg7XG5cbiAgd2hpbGUgKHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0c0xlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZW1haW5pbmdSZWxlYXNlQ29udGV4dCA9IHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0cy5zaGlmdCgpLFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0ID0gcmVtYWluaW5nUmVsZWFzZUNvbnRleHQ7ICAvLy9cblxuICAgIHJlbGVhc2VDb250ZXh0cy5wdXNoKHJlbGVhc2VDb250ZXh0KTtcblxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHJlbGVhc2VDb250ZXh0LmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgZGVwZW5kZW5jaWVzLmZvckVhY2hEZXBlbmRlbmN5KChkZXBlbmRlbmN5KSA9PiB7XG4gICAgICBjb25zdCBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZSwgLy8vXG4gICAgICAgICAgICByZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0TWFwW3JlbGVhc2VOYW1lXSxcbiAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dHMuaW5jbHVkZXMocmVsZWFzZUNvbnRleHQpLFxuICAgICAgICAgICAgcmVtYWluaW5nUmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCA9IHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0cy5pbmNsdWRlcyhyZWxlYXNlQ29udGV4dCk7XG5cbiAgICAgIGlmICghcmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCAmJiAhcmVtYWluaW5nUmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdSZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0OyAvLy9cblxuICAgICAgICByZW1haW5pbmdSZWxlYXNlQ29udGV4dHMucHVzaChyZW1haW5pbmdSZWxlYXNlQ29udGV4dCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZW1haW5pbmdSZWxlYXNlQ29udGV4dHNMZW5ndGggPSByZW1haW5pbmdSZWxlYXNlQ29udGV4dHMubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0cztcbn1cblxuZnVuY3Rpb24gY2hlY2tDeWNsaWNEZXBlbmRlbmN5RXhpc3RzKGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KSB7XG4gIGNvbnN0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgIGRlcGVuZGVudE5hbWVzSW5jbHVkZXNEZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVudE5hbWVzLmluY2x1ZGVzKGRlcGVuZGVuY3lOYW1lKSxcbiAgICAgICAgY3ljbGljRGVwZW5kZW5jeUV4aXN0cyA9IGRlcGVuZGVudE5hbWVzSW5jbHVkZXNEZXBlbmRlbmN5TmFtZTsgIC8vL1xuXG4gIGlmIChjeWNsaWNEZXBlbmRlbmN5RXhpc3RzKSB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGNvbnRleHQsXG4gICAgICAgICAgZmlyc3REZXBlbmRlbnROYW1lID0gZmlyc3QoZGVwZW5kZW50TmFtZXMpLFxuICAgICAgICAgIGRlcGVuZGVuY3lOYW1lcyA9IFsgIC8vL1xuICAgICAgICAgICAgLi4uZGVwZW5kZW50TmFtZXMsXG4gICAgICAgICAgICBmaXJzdERlcGVuZGVudE5hbWVcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRlcGVuZGVuY3lOYW1lc1N0cmluZyA9IGRlcGVuZGVuY3lOYW1lcy5qb2luKGAnIC0+ICdgKTtcblxuICAgIGxvZy53YXJuaW5nKGBUaGVyZSBpcyBhIGN5Y2xpYyBkZXBlbmRlbmN5LCAnJHtkZXBlbmRlbmN5TmFtZXNTdHJpbmd9Jy5gKTtcbiAgfVxuXG4gIHJldHVybiBjeWNsaWNEZXBlbmRlbmN5RXhpc3RzO1xufVxuXG5mdW5jdGlvbiBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IHRydWU7XG5cbiAgY29uc3Qgc2hvcnRlbmVkVmVyc2lvbiA9IGRlcGVuZGVuY3kuZ2V0U2hvcnRlZFZlcnNpb24oKTtcblxuICBpZiAoc2hvcnRlbmVkVmVyc2lvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGVudHJpZXNNYXRjaFNob3J0ZW5lZFZlcnNpb24gPSByZWxlYXNlQ29udGV4dC5tYXRjaFNob3J0ZW5lZFZlcnNpb24oc2hvcnRlbmVkVmVyc2lvbik7XG5cbiAgICBpZiAoIWVudHJpZXNNYXRjaFNob3J0ZW5lZFZlcnNpb24pIHtcbiAgICAgIGNvbnN0IHsgbG9nIH0gPSBjb250ZXh0LFxuICAgICAgICAgICAgdmVyc2lvbiA9IHJlbGVhc2VDb250ZXh0LmdldFZlcnNpb24oKSxcbiAgICAgICAgICAgIGxhc3REZXBlbmRlbnROYW1lID0gbGFzdChkZXBlbmRlbnROYW1lcyksXG4gICAgICAgICAgICBkZXBlbmRlbnROYW1lID0gbGFzdERlcGVuZGVudE5hbWUsICAvLy9cbiAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXBlbmRlbmN5U3RyaW5nID0gZGVwZW5kZW5jeS5hc1N0cmluZygpO1xuXG4gICAgICBsb2cud2FybmluZyhgVGhlICcke2RlcGVuZGVudE5hbWV9JyBkZXBlbmRlbnQgcmVxdWlyZXMgdGhlICcke2RlcGVuZGVuY3lTdHJpbmd9JyBkZXBlbmRlbmN5IGJ1dCBhIGNvbnRleHQgd2l0aCB2ZXJzaW9uICcke3ZlcnNpb25TdHJpbmd9JyB3YXMgcHJvdmlkZWQuYCk7XG5cbiAgICAgIHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpc2VEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIHJlbGVhc2VDb250ZXh0LCBjb250ZXh0KSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHJlbGVhc2VDb250ZXh0LmdldERlcGVuZGVuY2llcygpO1xuXG4gIGRlcGVuZGVuY2llcy5mb3JFYWNoRGVwZW5kZW5jeSgoZGVwZW5kZW5jeSkgPT4geyAgLy8vXG4gICAgaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGNvbnRleHQpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVSZWxlYXNlQ29udGV4dCIsImluaXRpYWxpc2VSZWxlYXNlQ29udGV4dCIsInZlcmlmeVJlbGVhc2VDb250ZXh0IiwibGFzdCIsImFycmF5VXRpbGl0aWVzIiwiZGVwZW5kZW5jeSIsImNvbnRleHQiLCJsb2ciLCJyZWxlYXNlQ29udGV4dE1hcCIsImRlcGVuZGVuY3lOYW1lIiwiZ2V0TmFtZSIsInJlbGVhc2VOYW1lIiwicmVsZWFzZUNvbnRleHQiLCJ3YXJuaW5nIiwicmVsZWFzZUNvbnRleHRJbml0aWFsaXNlZCIsImlzSW5pdGlhbGlzZWQiLCJpbml0aWFsaXNlRGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsInJlbGVhc2VDb250ZXh0cyIsInJldHJpZXZlUmVsZWFzZUNvbnRleHRzIiwiaW5mbyIsIkZpbGVDb250ZXh0RnJvbUZpbGVQYXRoIiwiaW5pdGlhbGlzZSIsImRlYnVnIiwiZGVwZW5kZW50TmFtZXMiLCJyZWxlYXNlQ29udGV4dENyZWF0ZWQiLCJyZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kiLCJjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSIsImRlcGVuZGVuY3lTdHJpbmciLCJhc1N0cmluZyIsImRlcGVuZGVudE5hbWVzTGVuZ3RoIiwibGVuZ3RoIiwibGFzdERlcGVuZGVudE5hbWUiLCJkZXBlbmRlbnROYW1lIiwicmVsZWFzZUNvbnRleHRGcm9tRGVwZW5kZW5jeSIsImRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkIiwiY3JlYXRlRGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsImRlcGVuZGVudFJlbGVhc2VkIiwicmVsZWFzZUNvbnRleHRWZXJpZmllcyIsInJlbGVhc2VkIiwiaXNSZWxlYXNlZCIsImRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkiLCJ2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzIiwicmVsZWFzZUNvbnRleHRWZXJpZmllZCIsImhhc1ZlcmlmaWVkIiwidmVyaWZpZXMiLCJ2ZXJpZnkiLCJkZXBlbmRlbmNpZXMiLCJnZXREZXBlbmRlbmNpZXMiLCJhc3luY0V2ZXJ5RGVwZW5kZW5jeSIsImN5Y2xpY0RlcGVuZGVuY3lFeGlzdHMiLCJjaGVja0N5Y2xpY0RlcGVuZGVuY3lFeGlzdHMiLCJuYW1lIiwicmVtYWluaW5nUmVsZWFzZUNvbnRleHQiLCJyZW1haW5pbmdSZWxlYXNlQ29udGV4dHMiLCJyZW1haW5pbmdSZWxlYXNlQ29udGV4dHNMZW5ndGgiLCJzaGlmdCIsInB1c2giLCJmb3JFYWNoRGVwZW5kZW5jeSIsInJlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQiLCJpbmNsdWRlcyIsInJlbWFpbmluZ1JlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQiLCJkZXBlbmRlbnROYW1lc0luY2x1ZGVzRGVwZW5kZW5jeU5hbWUiLCJmaXJzdERlcGVuZGVudE5hbWUiLCJmaXJzdCIsImRlcGVuZGVuY3lOYW1lcyIsImRlcGVuZGVuY3lOYW1lc1N0cmluZyIsImpvaW4iLCJzaG9ydGVuZWRWZXJzaW9uIiwiZ2V0U2hvcnRlZFZlcnNpb24iLCJlbnRyaWVzTWF0Y2hTaG9ydGVuZWRWZXJzaW9uIiwibWF0Y2hTaG9ydGVuZWRWZXJzaW9uIiwidmVyc2lvbiIsImdldFZlcnNpb24iLCJ2ZXJzaW9uU3RyaW5nIiwidG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQW1Dc0JBO2VBQUFBOztRQXFHdEI7ZUFBQTs7UUFoSWdCQztlQUFBQTs7UUFzRk1DO2VBQUFBOzs7MkJBNUZTOzRCQUVNO0FBRXJDLE1BQU0sRUFBRUMsSUFBSSxFQUFFLEdBQUdDLHlCQUFjO0FBRXhCLFNBQVNILHlCQUF5QkksVUFBVSxFQUFFQyxPQUFPO0lBQzFELE1BQU0sRUFBRUMsR0FBRyxFQUFFQyxpQkFBaUIsRUFBRSxHQUFHRixTQUM3QkcsaUJBQWlCSixXQUFXSyxPQUFPLElBQ25DQyxjQUFjRixnQkFDZEcsaUJBQWlCSixpQkFBaUIsQ0FBQ0csWUFBWSxJQUFJO0lBRXpELElBQUlDLG1CQUFtQixNQUFNO1FBQzNCTCxJQUFJTSxP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
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdmVyaWZpY2F0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBEaXJlY3RlZEdyYXBoIH0gZnJvbSBcIm9jY2FtLWRpcmVjdGVkLWdyYXBoc1wiO1xuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7ICBTSU5HTEVfU1BBQ0V9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFzeW5jRXZlcnlEZXBlbmRlbmN5IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9kZXBlbmRlbmN5XCI7XG5cbmNvbnN0IHsgZmlyc3QsIGxhc3QgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdCBkZXBlbmRlbnROYW1lcyA9IFtdLFxuICAgICAgICByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSBhd2FpdCBjcmVhdGVSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0Q3JlYXRlZCkge1xuICAgIHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXNlUmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VDb250ZXh0c0luaXRpYWxpc2VkID0gZmFsc2U7XG5cbiAgY29uc3QgZGlyZWN0ZWRHcmFwaCA9IERpcmVjdGVkR3JhcGguZnJvbU5vdGhpbmcoKSxcbiAgICAgICAgdmlzaXRlZERlcGVuZGVuY3lOYW1lcyA9IFtdO1xuXG4gIGFkZERlcGVuZGVuY3lSZWxhdGlvbnMoZGVwZW5kZW5jeSwgZGlyZWN0ZWRHcmFwaCwgdmlzaXRlZERlcGVuZGVuY3lOYW1lcywgY29udGV4dCk7XG5cbiAgY29uc3QgY3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudCA9IGNoZWNrQ3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudChkaXJlY3RlZEdyYXBoLCBjb250ZXh0KTtcblxuICBpZiAoIWN5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQpIHtcbiAgICBjb25zdCB7IHJlbGVhc2VDb250ZXh0TWFwIH0gPSBjb250ZXh0LFxuICAgICAgICAgIHJlbGVhc2VOYW1lcyA9IE9iamVjdC5rZXlzKHJlbGVhc2VDb250ZXh0TWFwKSxcbiAgICAgICAgICBvcmRlcmVkVmVydGV4TmFtZXMgPSBkaXJlY3RlZEdyYXBoLmdldE9yZGVyZWRWZXJ0ZXhOYW1lcygpLFxuICAgICAgICAgIG9yZGVyZWREZXBlbmRlbmN5TmFtZXMgPSBvcmRlcmVkVmVydGV4TmFtZXM7ICAvLy9cblxuICAgIHJlbGVhc2VOYW1lcy5mb3JFYWNoKChyZWxlYXNlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV07XG5cbiAgICAgIGluaXRpYWxpc2VSZWxlYXNlQ29udGV4dChyZWxlYXNlQ29udGV4dCwgb3JkZXJlZERlcGVuZGVuY3lOYW1lcywgY29udGV4dCk7XG4gICAgfSk7XG5cbiAgICByZWxlYXNlQ29udGV4dHNJbml0aWFsaXNlZCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVsZWFzZUNvbnRleHRzSW5pdGlhbGlzZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlSZWxlYXNlQ29udGV4dHMoZGVwZW5kZW5jeSwgY29udGV4dCkge1xuICBsZXQgcmVsZWFzZUNvbnRleHRzVmVyaWZ5ID0gZmFsc2U7XG5cbiAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZSwgLy8vXG4gICAgICAgIGRlcGVuZGVudE5hbWUgPSBudWxsLFxuICAgICAgICBkZXBlbmRlbnRSZWxlYXNlZCA9IGZhbHNlLFxuICAgICAgICByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gYXdhaXQgdmVyaWZ5UmVsZWFzZUNvbnRleHQocmVsZWFzZU5hbWUsIGRlcGVuZGVudE5hbWUsIGRlcGVuZGVudFJlbGVhc2VkLCBjb250ZXh0KTtcblxuICBpZiAocmVsZWFzZUNvbnRleHRWZXJpZmllcykge1xuICAgIHJlbGVhc2VDb250ZXh0c1ZlcmlmeSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVsZWFzZUNvbnRleHRzVmVyaWZ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNyZWF0ZVJlbGVhc2VDb250ZXh0cyxcbiAgaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0cyxcbiAgdmVyaWZ5UmVsZWFzZUNvbnRleHRzXG59O1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5UmVsYXRpb25zKGRlcGVuZGVuY3ksIGRpcmVjdGVkR3JhcGgsIHZpc2l0ZWREZXBlbmRlbmN5TmFtZXMsIGNvbnRleHQpIHtcbiAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgdmlzaXRlZERlcGVuZGVuY3lOYW1lSW5jbHVkZXNEZXBlbmRlbmN5TmFtZSA9IHZpc2l0ZWREZXBlbmRlbmN5TmFtZXMuaW5jbHVkZXMoZGVwZW5kZW5jeU5hbWUpO1xuXG4gIGlmICh2aXNpdGVkRGVwZW5kZW5jeU5hbWVJbmNsdWRlc0RlcGVuZGVuY3lOYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdmlzaXRlZGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeU5hbWU7IC8vL1xuXG4gIHZpc2l0ZWREZXBlbmRlbmN5TmFtZXMucHVzaCh2aXNpdGVkZGVwZW5kZW5jeU5hbWUpO1xuXG4gIGNvbnN0IHsgbG9nLCByZWxlYXNlQ29udGV4dE1hcCB9ID0gY29udGV4dCxcbiAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZSwgLy8vXG4gICAgICAgIHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdIHx8IG51bGw7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeVN0cmluZyA9IGRlcGVuZGVuY3kuZ2V0U3RyaW5nKCk7XG5cbiAgICBsb2cud2FybmluZyhgTm8gcGFja2FnZSBjb250ZXh0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSAnJHtkZXBlbmRlbmN5U3RyaW5nfScgZGVwZW5kZW5jeS4gYCk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXBlbmRlbmNpZXMgPSByZWxlYXNlQ29udGV4dC5nZXREZXBlbmRlbmNpZXMoKSxcbiAgICAgICAgdGFyZ2V0VmVydGV4TmFtZSA9IGRlcGVuZGVuY3lOYW1lOyAgLy8vXG5cbiAgZGVwZW5kZW5jaWVzLmZvckVhY2hEZXBlbmRlbmN5KChkZXBlbmRlbmN5KSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgIHNvdXJjZVZlcnRleE5hbWUgPSBkZXBlbmRlbmN5TmFtZTsgIC8vL1xuXG4gICAgZGlyZWN0ZWRHcmFwaC5hZGRFZGdlQnlTb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgIGFkZERlcGVuZGVuY3lSZWxhdGlvbnMoZGVwZW5kZW5jeSwgZGlyZWN0ZWRHcmFwaCwgdmlzaXRlZERlcGVuZGVuY3lOYW1lcywgY29udGV4dCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbml0aWFsaXNlUmVsZWFzZUNvbnRleHQocmVsZWFzZUNvbnRleHQsIG9yZGVyZWREZXBlbmRlbmN5TmFtZXMsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBsb2csIHJlbGVhc2VDb250ZXh0TWFwLCBGaWxlQ29udGV4dEZyb21GaWxlUGF0aCB9ID0gY29udGV4dCxcbiAgICAgICAgcmVsZWFzZUNvbnRleHRzID0gcmV0cmlldmVSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIHJlbGVhc2VDb250ZXh0TWFwKSxcbiAgICAgICAgcmVsZWFzZUNvbnRleHROYW1lID0gcmVsZWFzZUNvbnRleHQuZ2V0TmFtZSgpO1xuXG4gIHJlbGVhc2VDb250ZXh0cy5zb3J0KChyZWxlYXNlQ29udGV4dEEsIHJlbGVhc2VDb250ZXh0QikgPT4ge1xuICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0QU5hbWUgPSByZWxlYXNlQ29udGV4dEEuZ2V0TmFtZSgpLFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0Qk5hbWUgPSByZWxlYXNlQ29udGV4dEIuZ2V0TmFtZSgpLFxuICAgICAgICAgIGRlcGVuZGVuY3lOYW1lQSA9IHJlbGVhc2VDb250ZXh0QU5hbWUsICAvLy9cbiAgICAgICAgICBkZXBlbmRlbmN5TmFtZUIgPSByZWxlYXNlQ29udGV4dEJOYW1lLCAgLy8vXG4gICAgICAgICAgaW5kZXhBID0gb3JkZXJlZERlcGVuZGVuY3lOYW1lcy5pbmRleE9mKGRlcGVuZGVuY3lOYW1lQSksXG4gICAgICAgICAgaW5kZXhCID0gb3JkZXJlZERlcGVuZGVuY3lOYW1lcy5pbmRleE9mKGRlcGVuZGVuY3lOYW1lQik7XG5cbiAgICByZXR1cm4gKGluZGV4QSAtIGluZGV4Qik7XG4gIH0pO1xuXG4gIGxvZy5pbmZvKGBJbml0aWFsaXNpbmcgdGhlICcke3JlbGVhc2VDb250ZXh0TmFtZX0nIHBhY2thZ2UgY29udGV4dC4uLmApO1xuXG4gIHJlbGVhc2VDb250ZXh0LmluaXRpYWxpc2UocmVsZWFzZUNvbnRleHRzLCBGaWxlQ29udGV4dEZyb21GaWxlUGF0aCk7XG5cbiAgbG9nLmRlYnVnKGAuLi5pbml0aWFsaXNlZCB0aGUgJyR7cmVsZWFzZUNvbnRleHROYW1lfScgcGFja2FnZSBjb250ZXh0LmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgeyBsb2csIHJlbGVhc2VDb250ZXh0TWFwLCByZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5IH0gPSBjb250ZXh0LFxuICAgICAgICBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICByZWxlYXNlTmFtZSA9IGRlcGVuZGVuY3lOYW1lLCAvLy9cbiAgICAgICAgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV0gfHwgbnVsbDtcblxuICBpZiAocmVsZWFzZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICBjb25zdCByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLmApO1xuXG4gICAgICByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5U3RyaW5nID0gZGVwZW5kZW5jeS5hc1N0cmluZygpLFxuICAgICAgICAgIGRlcGVuZGVudE5hbWVzTGVuZ3RoID0gZGVwZW5kZW50TmFtZXMubGVuZ3RoO1xuXG4gICAgaWYgKGRlcGVuZGVudE5hbWVzTGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgdGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0Li4uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxhc3REZXBlbmRlbnROYW1lID0gbGFzdChkZXBlbmRlbnROYW1lcyksXG4gICAgICAgICAgICBkZXBlbmRlbnROYW1lID0gbGFzdERlcGVuZGVudE5hbWU7ICAvLy9cblxuICAgICAgbG9nLmluZm8oYENyZWF0aW5nIHRoZSAnJHtyZWxlYXNlTmFtZX0nIHBhY2thZ2UgY29udGV4dCBnaXZlbiB0aGUgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGFudCdzICcke2RlcGVuZGVuY3lTdHJpbmd9JyBkZXBlbmRlbmN5Li4uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZUNvbnRleHQgPSBhd2FpdCByZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlbGVhc2VDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgICBpZiAocmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5KSB7XG4gICAgICAgIHJlbGVhc2VDb250ZXh0TWFwW3JlbGVhc2VOYW1lXSA9IHJlbGVhc2VDb250ZXh0O1xuXG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkID0gYXdhaXQgY3JlYXRlRGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCkge1xuICAgICAgICAgIHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgICAgIHJlbGVhc2VOYW1lID0gZGVwZW5kZW5jeU5hbWU7IC8vL1xuXG4gICAgICBsb2cud2FybmluZyhgVGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBQZXJoYXBzIHRoZSAnbWV0YS5qc29uJyBmaWxlIGlzIG1pc3Npbmcgb3IgaW52YWxpZC4gT3IgdGhlcmUgY291bGQgYmUgYSBkZXBlbmRlbmN5IG1pc21hdGNoLmApO1xuICAgIH1cblxuICAgIHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA/XG4gICAgICBsb2cuZGVidWcoYC4uLmNyZWF0ZWQgdGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0LmApIDpcbiAgICAgICAgbG9nLndhcm5pbmcoYC4uLnVuYWJsZSB0byBjcmVhdGUgdGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0LmApO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0Q3JlYXRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UmVsZWFzZUNvbnRleHQocmVsZWFzZU5hbWUsIGRlcGVuZGVudE5hbWUsIGRlcGVuZGVudFJlbGVhc2VkLCByZWxlYXNlQ29udGV4dE1hcCkge1xuICBsZXQgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IGZhbHNlO1xuXG4gIGNvbnN0IHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdIHx8IG51bGw7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcmVsZWFzZWQgPSByZWxlYXNlQ29udGV4dC5pc1JlbGVhc2VkKCk7XG5cbiAgICBpZiAocmVsZWFzZWQpIHtcbiAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVwZW5kZW50UmVsZWFzZWQpIHtcbiAgICAgICAgcmVsZWFzZUNvbnRleHQud2FybmluZyhgVGhlICcke3JlbGVhc2VOYW1lfScgcHJvamVjdCBjYW5ub3QgYmUgdmVyaWZpZWQgYmVjYXVzZSBpdHMgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGVudCBpcyBhIHBhY2thZ2UuYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZXBlbmRlbnROYW1lID0gcmVsZWFzZU5hbWUsICAvLy9cbiAgICAgICAgICAgICAgZGVwZW5kZW50UmVsZWFzZWQgPSByZWxlYXNlZCwgLy8vXG4gICAgICAgICAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkgPSBhd2FpdCB2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgcmVsZWFzZUNvbnRleHRNYXApO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5KSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZUNvbnRleHRWZXJpZmllZCA9IHJlbGVhc2VDb250ZXh0Lmhhc1ZlcmlmaWVkKCk7XG5cbiAgICAgICAgICBpZiAocmVsZWFzZUNvbnRleHRWZXJpZmllZCkge1xuICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0LmluZm8oYFZlcmlmeWluZyB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0Li4uYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcmlmaWVzID0gYXdhaXQgcmVsZWFzZUNvbnRleHQudmVyaWZ5KCk7XG5cbiAgICAgICAgICAgIGlmICh2ZXJpZmllcykge1xuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dC5pbmZvKGAuLi52ZXJpZmllZCB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0LmApO1xuXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dFZlcmlmaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG5cbiAgY29uc3QgbmFtZSA9IHJlbGVhc2VDb250ZXh0LmdldE5hbWUoKSxcbiAgICAgICAgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCksXG4gICAgICAgIGRlcGVuZGVuY3lOYW1lID0gbmFtZTsgIC8vL1xuXG4gIGRlcGVuZGVudE5hbWVzID0gWyAuLi5kZXBlbmRlbnROYW1lcywgZGVwZW5kZW5jeU5hbWUgXTsgIC8vL1xuXG4gIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkID0gYXdhaXQgYXN5bmNFdmVyeURlcGVuZGVuY3koZGVwZW5kZW5jaWVzLCBhc3luYyAoZGVwZW5kZW5jeSkgPT4ge1xuICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA9IGF3YWl0IGNyZWF0ZVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgIGlmIChyZWxlYXNlQ29udGV4dENyZWF0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgcmVsZWFzZUNvbnRleHRNYXApIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCksXG4gICAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkgPSBhd2FpdCBhc3luY0V2ZXJ5RGVwZW5kZW5jeShkZXBlbmRlbmNpZXMsIGFzeW5jIChkZXBlbmRlbmN5KSA9PiB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VOYW1lID0gbmFtZSwgLy8vXG4gICAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IGF3YWl0IHZlcmlmeVJlbGVhc2VDb250ZXh0KHJlbGVhc2VOYW1lLCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgcmVsZWFzZUNvbnRleHRNYXApO1xuXG4gICAgICAgICAgaWYgKHJlbGVhc2VDb250ZXh0VmVyaWZpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgcmV0dXJuIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnk7XG59XG5cbmZ1bmN0aW9uIHJldHJpZXZlUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCByZWxlYXNlQ29udGV4dE1hcCwgcmVsZWFzZUNvbnRleHRzID0gW10pIHtcbiAgY29uc3QgcmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0cy5pbmNsdWRlcyhyZWxlYXNlQ29udGV4dCk7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZWxlYXNlQ29udGV4dHMucHVzaChyZWxlYXNlQ29udGV4dCk7XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgZGVwZW5kZW5jaWVzLmZvckVhY2hEZXBlbmRlbmN5KChkZXBlbmRlbmN5KSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgICByZWxlYXNlTmFtZSA9IGRlcGVuZGVuY3lOYW1lLCAvLy9cbiAgICAgICAgICByZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0TWFwW3JlbGVhc2VOYW1lXTtcblxuICAgIHJldHJpZXZlUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCByZWxlYXNlQ29udGV4dE1hcCwgcmVsZWFzZUNvbnRleHRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0cztcbn1cblxuZnVuY3Rpb24gY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KSB7XG4gIGxldCByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSB0cnVlO1xuXG4gIGNvbnN0IHNob3J0ZW5lZFZlcnNpb24gPSBkZXBlbmRlbmN5LmdldFNob3J0ZW5lZFZlcnNpb24oKTtcblxuICBpZiAoc2hvcnRlbmVkVmVyc2lvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGVudHJpZXNNYXRjaFNob3J0ZW5lZFZlcnNpb24gPSByZWxlYXNlQ29udGV4dC5tYXRjaFNob3J0ZW5lZFZlcnNpb24oc2hvcnRlbmVkVmVyc2lvbik7XG5cbiAgICBpZiAoIWVudHJpZXNNYXRjaFNob3J0ZW5lZFZlcnNpb24pIHtcbiAgICAgIGNvbnN0IHsgbG9nIH0gPSBjb250ZXh0LFxuICAgICAgICAgICAgdmVyc2lvbiA9IHJlbGVhc2VDb250ZXh0LmdldFZlcnNpb24oKSxcbiAgICAgICAgICAgIGxhc3REZXBlbmRlbnROYW1lID0gbGFzdChkZXBlbmRlbnROYW1lcyksXG4gICAgICAgICAgICBkZXBlbmRlbnROYW1lID0gbGFzdERlcGVuZGVudE5hbWUsICAvLy9cbiAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXBlbmRlbmN5U3RyaW5nID0gZGVwZW5kZW5jeS5hc1N0cmluZygpO1xuXG4gICAgICBsb2cud2FybmluZyhgVGhlICcke2RlcGVuZGVudE5hbWV9JyBkZXBlbmRlbnQgcmVxdWlyZXMgdGhlICcke2RlcGVuZGVuY3lTdHJpbmd9JyBkZXBlbmRlbmN5IGJ1dCBhIGNvbnRleHQgd2l0aCB2ZXJzaW9uICcke3ZlcnNpb25TdHJpbmd9JyB3YXMgcHJvdmlkZWQuYCk7XG5cbiAgICAgIHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudChkaXJlY3RlZEdyYXBoLCBjb250ZXh0KSB7XG4gIGxldCBjeWNsaWNEZXBlbmRlbmNpZXNQcmVzZW50ID0gZmFsc2U7XG5cbiAgY29uc3QgZmlyc3RDeWNsZSA9IGRpcmVjdGVkR3JhcGguZ2V0Rmlyc3RDeWNsZSgpO1xuXG4gIGlmIChmaXJzdEN5Y2xlICE9PSBudWxsKSB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGNvbnRleHQsXG4gICAgICAgICAgdmVydGV4TmFtZXMgPSBmaXJzdEN5Y2xlLmdldFZlcnRleE5hbWVzKCksXG4gICAgICAgICAgZGVwZW5kZW5jeU5hbWVzID0gdmVydGV4TmFtZXMsICAvLy9cbiAgICAgICAgICBmaXJzdERlcGVuZGVuY3lOYW1lID0gZmlyc3QoZGVwZW5kZW5jeU5hbWVzKSxcbiAgICAgICAgICBjeWNsaWNEZXBlbmRlbmN5TmFtZXMgPSBbXG4gICAgICAgICAgICAuLi5kZXBlbmRlbmN5TmFtZXMsXG4gICAgICAgICAgICBmaXJzdERlcGVuZGVuY3lOYW1lXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjeWNsZVN0cmluZyA9IGN5Y2xpY0RlcGVuZGVuY3lOYW1lcy5qb2luKFNJTkdMRV9TUEFDRSk7XG5cbiAgICBsb2cud2FybmluZyhgVGhlcmUgaXMgYXQgbGVhc3Qgb25lICcke2N5Y2xlU3RyaW5nfScuIGN5Y2xpYyBkZXBlbmRlbmN5YCk7XG5cbiAgICBjeWNsaWNEZXBlbmRlbmNpZXNQcmVzZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBjeWNsaWNEZXBlbmRlbmNpZXNQcmVzZW50O1xufVxuIl0sIm5hbWVzIjpbImNyZWF0ZVJlbGVhc2VDb250ZXh0cyIsImluaXRpYWxpc2VSZWxlYXNlQ29udGV4dHMiLCJ2ZXJpZnlSZWxlYXNlQ29udGV4dHMiLCJmaXJzdCIsImxhc3QiLCJhcnJheVV0aWxpdGllcyIsImRlcGVuZGVuY3kiLCJjb250ZXh0IiwicmVsZWFzZUNvbnRleHRzQ3JlYXRlZCIsImRlcGVuZGVudE5hbWVzIiwicmVsZWFzZUNvbnRleHRDcmVhdGVkIiwiY3JlYXRlUmVsZWFzZUNvbnRleHQiLCJyZWxlYXNlQ29udGV4dHNJbml0aWFsaXNlZCIsImRpcmVjdGVkR3JhcGgiLCJEaXJlY3RlZEdyYXBoIiwiZnJvbU5vdGhpbmciLCJ2aXNpdGVkRGVwZW5kZW5jeU5hbWVzIiwiYWRkRGVwZW5kZW5jeVJlbGF0aW9ucyIsImN5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQiLCJjaGVja0N5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQiLCJyZWxlYXNlQ29udGV4dE1hcCIsInJlbGVhc2VOYW1lcyIsIk9iamVjdCIsImtleXMiLCJvcmRlcmVkVmVydGV4TmFtZXMiLCJnZXRPcmRlcmVkVmVydGV4TmFtZXMiLCJvcmRlcmVkRGVwZW5kZW5jeU5hbWVzIiwiZm9yRWFjaCIsInJlbGVhc2VOYW1lIiwicmVsZWFzZUNvbnRleHQiLCJpbml0aWFsaXNlUmVsZWFzZUNvbnRleHQiLCJyZWxlYXNlQ29udGV4dHNWZXJpZnkiLCJkZXBlbmRlbmN5TmFtZSIsImdldE5hbWUiLCJkZXBlbmRlbnROYW1lIiwiZGVwZW5kZW50UmVsZWFzZWQiLCJyZWxlYXNlQ29udGV4dFZlcmlmaWVzIiwidmVyaWZ5UmVsZWFzZUNvbnRleHQiLCJ2aXNpdGVkRGVwZW5kZW5jeU5hbWVJbmNsdWRlc0RlcGVuZGVuY3lOYW1lIiwiaW5jbHVkZXMiLCJ2aXNpdGVkZGVwZW5kZW5jeU5hbWUiLCJwdXNoIiwibG9nIiwiZGVwZW5kZW5jeVN0cmluZyIsImdldFN0cmluZyIsIndhcm5pbmciLCJkZXBlbmRlbmNpZXMiLCJnZXREZXBlbmRlbmNpZXMiLCJ0YXJnZXRWZXJ0ZXhOYW1lIiwiZm9yRWFjaERlcGVuZGVuY3kiLCJzb3VyY2VWZXJ0ZXhOYW1lIiwiYWRkRWRnZUJ5U291cmNlVmVydGV4TmFtZUFuZFRhcmdldFZlcnRleE5hbWUiLCJGaWxlQ29udGV4dEZyb21GaWxlUGF0aCIsInJlbGVhc2VDb250ZXh0cyIsInJldHJpZXZlUmVsZWFzZUNvbnRleHRzIiwicmVsZWFzZUNvbnRleHROYW1lIiwic29ydCIsInJlbGVhc2VDb250ZXh0QSIsInJlbGVhc2VDb250ZXh0QiIsInJlbGVhc2VDb250ZXh0QU5hbWUiLCJyZWxlYXNlQ29udGV4dEJOYW1lIiwiZGVwZW5kZW5jeU5hbWVBIiwiZGVwZW5kZW5jeU5hbWVCIiwiaW5kZXhBIiwiaW5kZXhPZiIsImluZGV4QiIsImluZm8iLCJpbml0aWFsaXNlIiwiZGVidWciLCJyZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5IiwicmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5IiwiY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kiLCJhc1N0cmluZyIsImRlcGVuZGVudE5hbWVzTGVuZ3RoIiwibGVuZ3RoIiwibGFzdERlcGVuZGVudE5hbWUiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCIsImNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMiLCJyZWxlYXNlZCIsImlzUmVsZWFzZWQiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5IiwidmVyaWZ5RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsInJlbGVhc2VDb250ZXh0VmVyaWZpZWQiLCJoYXNWZXJpZmllZCIsInZlcmlmaWVzIiwidmVyaWZ5IiwibmFtZSIsImFzeW5jRXZlcnlEZXBlbmRlbmN5IiwicmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCIsInNob3J0ZW5lZFZlcnNpb24iLCJnZXRTaG9ydGVuZWRWZXJzaW9uIiwiZW50cmllc01hdGNoU2hvcnRlbmVkVmVyc2lvbiIsIm1hdGNoU2hvcnRlbmVkVmVyc2lvbiIsInZlcnNpb24iLCJnZXRWZXJzaW9uIiwidmVyc2lvblN0cmluZyIsInRvU3RyaW5nIiwiZmlyc3RDeWNsZSIsImdldEZpcnN0Q3ljbGUiLCJ2ZXJ0ZXhOYW1lcyIsImdldFZlcnRleE5hbWVzIiwiZGVwZW5kZW5jeU5hbWVzIiwiZmlyc3REZXBlbmRlbmN5TmFtZSIsImN5Y2xpY0RlcGVuZGVuY3lOYW1lcyIsImN5Y2xlU3RyaW5nIiwiam9pbiIsIlNJTkdMRV9TUEFDRSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBVXNCQTtlQUFBQTs7UUF5RHRCO2VBQUE7O1FBNUNnQkM7ZUFBQUE7O1FBNEJNQztlQUFBQTs7O3FDQWpEUTsyQkFDQzsyQkFFRjs0QkFDUTtBQUVyQyxNQUFNLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFFLEdBQUdDLHlCQUFjO0FBRS9CLGVBQWVMLHNCQUFzQk0sVUFBVSxFQUFFQyxPQUFPO0lBQzdELElBQUlDLHlCQUF5QjtJQUU3QixNQUFNQyxpQkFBaUIsRUFBRSxFQUNuQkMsd0JBQXdCLE1BQU1DLHFCQUFxQkwsWUFBWUcsZ0JBQWdCRjtJQUVyRixJQUFJRyx1QkFBdUI7UUFDekJGLHlCQUF5QjtJQUMzQjtJQUVBLE9BQU9BO0FBQ1Q7QUFFTyxTQUFTUCwwQkFBMEJL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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-languages",
3
3
  "author": "James Smith",
4
- "version": "0.0.128",
4
+ "version": "0.0.129",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-languages",
7
7
  "description": "Occam's common language functionality.",
@@ -12,6 +12,7 @@
12
12
  "dependencies": {
13
13
  "necessary": "^17.1.7",
14
14
  "occam-custom-grammars": "^6.0.17",
15
+ "occam-directed-graphs": "^3.0.87",
15
16
  "occam-parsers": "^23.1.50"
16
17
  },
17
18
  "devDependencies": {
@@ -1,42 +1,140 @@
1
1
  "use strict";
2
2
 
3
+ import { DirectedGraph } from "occam-directed-graphs";
3
4
  import { arrayUtilities } from "necessary";
4
5
 
6
+ import { SINGLE_SPACE} from "../constants";
5
7
  import { asyncEveryDependency } from "../utilities/dependency";
6
8
 
7
- const { last } = arrayUtilities;
9
+ const { first, last } = arrayUtilities;
10
+
11
+ export async function createReleaseContexts(dependency, context) {
12
+ let releaseContextsCreated = false;
13
+
14
+ const dependentNames = [],
15
+ releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
16
+
17
+ if (releaseContextCreated) {
18
+ releaseContextsCreated = true;
19
+ }
20
+
21
+ return releaseContextsCreated;
22
+ }
23
+
24
+ export function initialiseReleaseContexts(dependency, context) {
25
+ let releaseContextsInitialised = false;
26
+
27
+ const directedGraph = DirectedGraph.fromNothing(),
28
+ visitedDependencyNames = [];
29
+
30
+ addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
31
+
32
+ const cyclicDependenciesPresent = checkCyclicDependenciesPresent(directedGraph, context);
33
+
34
+ if (!cyclicDependenciesPresent) {
35
+ const { releaseContextMap } = context,
36
+ releaseNames = Object.keys(releaseContextMap),
37
+ orderedVertexNames = directedGraph.getOrderedVertexNames(),
38
+ orderedDependencyNames = orderedVertexNames; ///
39
+
40
+ releaseNames.forEach((releaseName) => {
41
+ const releaseContext = releaseContextMap[releaseName];
42
+
43
+ initialiseReleaseContext(releaseContext, orderedDependencyNames, context);
44
+ });
45
+
46
+ releaseContextsInitialised = true;
47
+ }
48
+
49
+ return releaseContextsInitialised;
50
+ }
51
+
52
+ export async function verifyReleaseContexts(dependency, context) {
53
+ let releaseContextsVerify = false;
54
+
55
+ const dependencyName = dependency.getName(),
56
+ releaseName = dependencyName, ///
57
+ dependentName = null,
58
+ dependentReleased = false,
59
+ releaseContextVerifies = await verifyReleaseContext(releaseName, dependentName, dependentReleased, context);
60
+
61
+ if (releaseContextVerifies) {
62
+ releaseContextsVerify = true;
63
+ }
64
+
65
+ return releaseContextsVerify;
66
+ }
67
+
68
+ export default {
69
+ createReleaseContexts,
70
+ initialiseReleaseContexts,
71
+ verifyReleaseContexts
72
+ };
73
+
74
+ function addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context) {
75
+ const dependencyName = dependency.getName(),
76
+ visitedDependencyNameIncludesDependencyName = visitedDependencyNames.includes(dependencyName);
77
+
78
+ if (visitedDependencyNameIncludesDependencyName) {
79
+ return;
80
+ }
81
+
82
+ const visiteddependencyName = dependencyName; ///
83
+
84
+ visitedDependencyNames.push(visiteddependencyName);
8
85
 
9
- export function initialiseReleaseContext(dependency, context) {
10
86
  const { log, releaseContextMap } = context,
11
- dependencyName = dependency.getName(),
12
87
  releaseName = dependencyName, ///
13
88
  releaseContext = releaseContextMap[releaseName] || null;
14
89
 
15
90
  if (releaseContext === null) {
16
- log.warning(`Unable to initialise the '${dependencyName}' context because it has not been created.`);
17
- } else {
18
- const releaseContextInitialised = releaseContext.isInitialised();
91
+ const dependencyString = dependency.getString();
19
92
 
20
- if (!releaseContextInitialised) {
21
- initialiseDependencyReleaseContexts(dependency, releaseContext, context);
93
+ log.warning(`No package context has been created for the '${dependencyString}' dependency. `);
22
94
 
23
- const releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap);
95
+ return;
96
+ }
24
97
 
25
- log.info(`Initialising the '${dependencyName}' context...`);
98
+ const dependencies = releaseContext.getDependencies(),
99
+ targetVertexName = dependencyName; ///
26
100
 
27
- const { FileContextFromFilePath } = context;
101
+ dependencies.forEachDependency((dependency) => {
102
+ const dependencyName = dependency.getName(),
103
+ sourceVertexName = dependencyName; ///
28
104
 
29
- releaseContext.initialise(releaseContexts, FileContextFromFilePath);
105
+ directedGraph.addEdgeBySourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
30
106
 
31
- log.debug(`...initialised the '${dependencyName}' context.`);
32
- }
33
- }
107
+ addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
108
+ });
34
109
  }
35
110
 
36
- export async function createReleaseContext(dependency, dependentNames, context) {
111
+ function initialiseReleaseContext(releaseContext, orderedDependencyNames, context) {
112
+ const { log, releaseContextMap, FileContextFromFilePath } = context,
113
+ releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap),
114
+ releaseContextName = releaseContext.getName();
115
+
116
+ releaseContexts.sort((releaseContextA, releaseContextB) => {
117
+ const releaseContextAName = releaseContextA.getName(),
118
+ releaseContextBName = releaseContextB.getName(),
119
+ dependencyNameA = releaseContextAName, ///
120
+ dependencyNameB = releaseContextBName, ///
121
+ indexA = orderedDependencyNames.indexOf(dependencyNameA),
122
+ indexB = orderedDependencyNames.indexOf(dependencyNameB);
123
+
124
+ return (indexA - indexB);
125
+ });
126
+
127
+ log.info(`Initialising the '${releaseContextName}' package context...`);
128
+
129
+ releaseContext.initialise(releaseContexts, FileContextFromFilePath);
130
+
131
+ log.debug(`...initialised the '${releaseContextName}' package context.`);
132
+ }
133
+
134
+ async function createReleaseContext(dependency, dependentNames, context) {
37
135
  let releaseContextCreated = false;
38
136
 
39
- const { log, releaseContextMap } = context,
137
+ const { log, releaseContextMap, releaseContextFromDependency } = context,
40
138
  dependencyName = dependency.getName(),
41
139
  releaseName = dependencyName, ///
42
140
  releaseContext = releaseContextMap[releaseName] || null;
@@ -45,7 +143,7 @@ export async function createReleaseContext(dependency, dependentNames, context)
45
143
  const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
46
144
 
47
145
  if (releaseMatchesDependency) {
48
- log.debug(`The '${releaseName}' context has already been created.`);
146
+ log.debug(`The '${releaseName}' package context has already been created.`);
49
147
 
50
148
  releaseContextCreated = true;
51
149
  }
@@ -54,16 +152,15 @@ export async function createReleaseContext(dependency, dependentNames, context)
54
152
  dependentNamesLength = dependentNames.length;
55
153
 
56
154
  if (dependentNamesLength === 0) {
57
- log.info(`Creating the '${releaseName}' context...`);
155
+ log.info(`Creating the '${releaseName}' package context...`);
58
156
  } else {
59
157
  const lastDependentName = last(dependentNames),
60
158
  dependentName = lastDependentName; ///
61
159
 
62
- log.info(`Creating the '${releaseName}' context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
160
+ log.info(`Creating the '${releaseName}' package context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
63
161
  }
64
162
 
65
- const { releaseContextFromDependency } = context,
66
- releaseContext = await releaseContextFromDependency(dependency, context);
163
+ const releaseContext = await releaseContextFromDependency(dependency, context);
67
164
 
68
165
  if (releaseContext !== null) {
69
166
  const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
@@ -71,7 +168,7 @@ export async function createReleaseContext(dependency, dependentNames, context)
71
168
  if (releaseMatchesDependency) {
72
169
  releaseContextMap[releaseName] = releaseContext;
73
170
 
74
- const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(dependency, releaseContext, dependentNames, context);
171
+ const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context);
75
172
 
76
173
  if (dependencyReleaseContextsCreated) {
77
174
  releaseContextCreated = true;
@@ -81,21 +178,21 @@ export async function createReleaseContext(dependency, dependentNames, context)
81
178
  const dependencyName = dependency.getName(),
82
179
  releaseName = dependencyName; ///
83
180
 
84
- log.warning(`The '${releaseName}' context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
181
+ log.warning(`The '${releaseName}' package context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
85
182
  }
86
183
 
87
184
  releaseContextCreated ?
88
- log.debug(`...created the '${releaseName}' context.`) :
89
- log.warning(`...unable to create the '${releaseName}' context.`);
185
+ log.debug(`...created the '${releaseName}' package context.`) :
186
+ log.warning(`...unable to create the '${releaseName}' package context.`);
90
187
  }
91
188
 
92
189
  return releaseContextCreated;
93
190
  }
94
191
 
95
- export async function verifyReleaseContext(releaseName, dependentName, dependentReleased, releaseContextMap) {
192
+ async function verifyReleaseContext(releaseName, dependentName, dependentReleased, releaseContextMap) {
96
193
  let releaseContextVerifies = false;
97
194
 
98
- const releaseContext = releaseContextMap[releaseName];
195
+ const releaseContext = releaseContextMap[releaseName] || null;
99
196
 
100
197
  if (releaseContext !== null) {
101
198
  const released = releaseContext.isReleased();
@@ -104,7 +201,7 @@ export async function verifyReleaseContext(releaseName, dependentName, dependent
104
201
  releaseContextVerifies = true;
105
202
  } else {
106
203
  if (dependentReleased) {
107
- releaseContext.warning(`The '${releaseName}' project cannot be verifies because its '${dependentName}' dependent is a package.`);
204
+ releaseContext.warning(`The '${releaseName}' project cannot be verified because its '${dependentName}' dependent is a package.`);
108
205
  } else {
109
206
  const dependentName = releaseName, ///
110
207
  dependentReleased = released, ///
@@ -134,29 +231,20 @@ export async function verifyReleaseContext(releaseName, dependentName, dependent
134
231
  return releaseContextVerifies;
135
232
  }
136
233
 
137
- export default {
138
- createReleaseContext,
139
- verifyReleaseContext,
140
- initialiseReleaseContext
141
- };
142
-
143
- async function createDependencyReleaseContexts(dependency, releaseContext, dependentNames, context) {
234
+ async function createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context) {
144
235
  let dependencyReleaseContextsCreated;
145
236
 
146
- const dependencyName = dependency.getName(),
147
- dependencies = releaseContext.getDependencies();
237
+ const name = releaseContext.getName(),
238
+ dependencies = releaseContext.getDependencies(),
239
+ dependencyName = name; ///
148
240
 
149
241
  dependentNames = [ ...dependentNames, dependencyName ]; ///
150
242
 
151
243
  dependencyReleaseContextsCreated = await asyncEveryDependency(dependencies, async (dependency) => {
152
- const cyclicDependencyExists = checkCyclicDependencyExists(dependency, dependentNames, context);
153
-
154
- if (!cyclicDependencyExists) {
155
- const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
244
+ const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
156
245
 
157
- if (releaseContextCreated) {
158
- return true;
159
- }
246
+ if (releaseContextCreated) {
247
+ return true;
160
248
  }
161
249
  });
162
250
 
@@ -178,67 +266,32 @@ async function verifyDependencyReleaseContexts(releaseContext, dependentName, de
178
266
  return dependencyReleaseContextsVerify;
179
267
  }
180
268
 
181
- function retrieveReleaseContexts(releaseContext, releaseContextMap) {
182
- const releaseContexts = [],
183
- remainingReleaseContext = releaseContext, ///
184
- remainingReleaseContexts = [
185
- remainingReleaseContext
186
- ];
187
-
188
- let remainingReleaseContextsLength = remainingReleaseContexts.length;
189
-
190
- while (remainingReleaseContextsLength > 0) {
191
- const remainingReleaseContext = remainingReleaseContexts.shift(),
192
- releaseContext = remainingReleaseContext; ///
193
-
194
- releaseContexts.push(releaseContext);
195
-
196
- const dependencies = releaseContext.getDependencies();
197
-
198
- dependencies.forEachDependency((dependency) => {
199
- const dependencyName = dependency.getName(),
200
- releaseName = dependencyName, ///
201
- releaseContext = releaseContextMap[releaseName],
202
- releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext),
203
- remainingReleaseContextsIncludesReleaseContext = remainingReleaseContexts.includes(releaseContext);
204
-
205
- if (!releaseContextsIncludesReleaseContext && !remainingReleaseContextsIncludesReleaseContext) {
206
- const remainingReleaseContext = releaseContext; ///
269
+ function retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts = []) {
270
+ const releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext);
207
271
 
208
- remainingReleaseContexts.push(remainingReleaseContext);
209
- }
210
- });
211
-
212
- remainingReleaseContextsLength = remainingReleaseContexts.length;
272
+ if (releaseContextsIncludesReleaseContext) {
273
+ return;
213
274
  }
214
275
 
215
- return releaseContexts;
216
- }
276
+ releaseContexts.push(releaseContext);
217
277
 
218
- function checkCyclicDependencyExists(dependency, dependentNames, context) {
219
- const dependencyName = dependency.getName(),
220
- dependentNamesIncludesDependencyName = dependentNames.includes(dependencyName),
221
- cyclicDependencyExists = dependentNamesIncludesDependencyName; ///
278
+ const dependencies = releaseContext.getDependencies();
222
279
 
223
- if (cyclicDependencyExists) {
224
- const { log } = context,
225
- firstDependentName = first(dependentNames),
226
- dependencyNames = [ ///
227
- ...dependentNames,
228
- firstDependentName
229
- ],
230
- dependencyNamesString = dependencyNames.join(`' -> '`);
280
+ dependencies.forEachDependency((dependency) => {
281
+ const dependencyName = dependency.getName(),
282
+ releaseName = dependencyName, ///
283
+ releaseContext = releaseContextMap[releaseName];
231
284
 
232
- log.warning(`There is a cyclic dependency, '${dependencyNamesString}'.`);
233
- }
285
+ retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts);
286
+ });
234
287
 
235
- return cyclicDependencyExists;
288
+ return releaseContexts;
236
289
  }
237
290
 
238
291
  function checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context) {
239
292
  let releaseMatchesDependency = true;
240
293
 
241
- const shortenedVersion = dependency.getShortedVersion();
294
+ const shortenedVersion = dependency.getShortenedVersion();
242
295
 
243
296
  if (shortenedVersion !== null) {
244
297
  const entriesMatchShortenedVersion = releaseContext.matchShortenedVersion(shortenedVersion);
@@ -260,10 +313,26 @@ function checkReleaseMatchesDependency(releaseContext, dependency, dependentName
260
313
  return releaseMatchesDependency;
261
314
  }
262
315
 
263
- function initialiseDependencyReleaseContexts(dependency, releaseContext, context) {
264
- const dependencies = releaseContext.getDependencies();
316
+ function checkCyclicDependenciesPresent(directedGraph, context) {
317
+ let cyclicDependenciesPresent = false;
265
318
 
266
- dependencies.forEachDependency((dependency) => { ///
267
- initialiseReleaseContext(dependency, context);
268
- });
319
+ const firstCycle = directedGraph.getFirstCycle();
320
+
321
+ if (firstCycle !== null) {
322
+ const { log } = context,
323
+ vertexNames = firstCycle.getVertexNames(),
324
+ dependencyNames = vertexNames, ///
325
+ firstDependencyName = first(dependencyNames),
326
+ cyclicDependencyNames = [
327
+ ...dependencyNames,
328
+ firstDependencyName
329
+ ],
330
+ cycleString = cyclicDependencyNames.join(SINGLE_SPACE);
331
+
332
+ log.warning(`There is at least one '${cycleString}'. cyclic dependency`);
333
+
334
+ cyclicDependenciesPresent = true;
335
+ }
336
+
337
+ return cyclicDependenciesPresent;
269
338
  }