occam-directed-graphs 3.0.37 → 3.0.41

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.
@@ -11,10 +11,17 @@ Object.defineProperty(exports, "default", {
11
11
  var _necessary = require("necessary");
12
12
  var _edge = /*#__PURE__*/ _interop_require_default(require("./edge"));
13
13
  var _cycle = /*#__PURE__*/ _interop_require_default(require("./cycle"));
14
- var _partialCycle = /*#__PURE__*/ _interop_require_default(require("./partialCycle"));
15
- var _directedAcyclicGraph = /*#__PURE__*/ _interop_require_default(require("./directedAcyclicGraph"));
16
- var _vertex = require("./utilities/vertex");
17
- var _edge1 = require("./utilities/edge");
14
+ var _vertex = /*#__PURE__*/ _interop_require_default(require("./vertex"));
15
+ var _index = require("./utilities/index");
16
+ var _vertex1 = require("./utilities/vertex");
17
+ function _array_like_to_array(arr, len) {
18
+ if (len == null || len > arr.length) len = arr.length;
19
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
20
+ return arr2;
21
+ }
22
+ function _array_without_holes(arr) {
23
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
24
+ }
18
25
  function _class_call_check(instance, Constructor) {
19
26
  if (!(instance instanceof Constructor)) {
20
27
  throw new TypeError("Cannot call a class as a function");
@@ -39,203 +46,227 @@ function _interop_require_default(obj) {
39
46
  default: obj
40
47
  };
41
48
  }
42
- var first = _necessary.arrayUtilities.first, filter = _necessary.arrayUtilities.filter;
49
+ function _iterable_to_array(iter) {
50
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
51
+ }
52
+ function _non_iterable_spread() {
53
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
54
+ }
55
+ function _to_consumable_array(arr) {
56
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
57
+ }
58
+ function _unsupported_iterable_to_array(o, minLen) {
59
+ if (!o) return;
60
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
61
+ var n = Object.prototype.toString.call(o).slice(8, -1);
62
+ if (n === "Object" && o.constructor) n = o.constructor.name;
63
+ if (n === "Map" || n === "Set") return Array.from(n);
64
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
65
+ }
66
+ var first = _necessary.arrayUtilities.first;
43
67
  var DirectedGraph = /*#__PURE__*/ function() {
44
- function DirectedGraph(cyclicEdges, directedAcyclicGraph) {
68
+ function DirectedGraph(vertexMap) {
45
69
  _class_call_check(this, DirectedGraph);
46
- this.cyclicEdges = cyclicEdges;
47
- this.directedAcyclicGraph = directedAcyclicGraph;
70
+ this.vertexMap = vertexMap;
48
71
  }
49
72
  _create_class(DirectedGraph, [
50
73
  {
51
- key: "getCyclicEdges",
52
- value: function getCyclicEdges() {
53
- return this.cyclicEdges;
74
+ key: "getVertexNap",
75
+ value: function getVertexNap() {
76
+ return this.vertexMap;
54
77
  }
55
78
  },
56
79
  {
57
- key: "getDirectedAcyclicGraph",
58
- value: function getDirectedAcyclicGraph() {
59
- return this.directedAcyclicGraph;
80
+ key: "getVertexes",
81
+ value: function getVertexes() {
82
+ var vertexMapValues = Object.values(this.vertexMap), vertexes = vertexMapValues; ///
83
+ return vertexes;
60
84
  }
61
85
  },
62
86
  {
63
87
  key: "getVertexNames",
64
88
  value: function getVertexNames() {
65
- return this.directedAcyclicGraph.getVertexNames();
89
+ var vertexMapKeys = Object.keys(this.vertexMap), vertexNames = vertexMapKeys; ///
90
+ return vertexNames;
66
91
  }
67
92
  },
68
93
  {
69
94
  key: "getOrderedVertexNames",
70
95
  value: function getOrderedVertexNames() {
71
- return this.directedAcyclicGraph.getOrderedVertexNames();
72
- }
73
- },
74
- {
75
- key: "addVertexByVertexName",
76
- value: function addVertexByVertexName(vertexName) {
77
- this.directedAcyclicGraph.addVertexByVertexName(vertexName);
96
+ var vertexes = this.getVertexes();
97
+ (0, _vertex1.orderVertexes)(vertexes);
98
+ var orderedVertexes = vertexes, orderedVertexNames = (0, _vertex1.vertexNamesFromVertexes)(orderedVertexes);
99
+ return orderedVertexNames;
78
100
  }
79
101
  },
80
102
  {
81
- key: "isEdgePresentByVertexNames",
82
- value: function isEdgePresentByVertexNames(sourceVertexName, targetVertexName) {
83
- return this.directedAcyclicGraph.isEdgePresentByVertexNames(sourceVertexName, targetVertexName);
103
+ key: "getVertexByVertexName",
104
+ value: function getVertexByVertexName(vertexName) {
105
+ var vertexPresent = this.isVertexPresentByVertexName(vertexName), vertex = vertexPresent ? this.vertexMap[vertexName] : null;
106
+ return vertex;
84
107
  }
85
108
  },
86
109
  {
87
- key: "isVertexPresentByVertexName",
88
- value: function isVertexPresentByVertexName(vertexName) {
89
- return this.directedAcyclicGraph.isVertexPresentByVertexName(vertexName);
90
- }
91
- },
92
- {
93
- key: "getSuccessorVertexNamesByVertexName",
94
- value: function getSuccessorVertexNamesByVertexName(vertexName) {
95
- return this.directedAcyclicGraph.getSuccessorVertexNamesByVertexName(vertexName);
96
- }
97
- },
98
- {
99
- key: "getPredecessorVertexNamesByVertexName",
100
- value: function getPredecessorVertexNamesByVertexName(vertexName) {
101
- return this.directedAcyclicGraph.getPredecessorVertexNamesByVertexName(vertexName);
110
+ key: "getEdgesBySourceVertexName",
111
+ value: function getEdgesBySourceVertexName(sourceVertexName) {
112
+ var edges = [], sourceVertex = this.getVertexByVertexName(sourceVertexName);
113
+ if (sourceVertex !== null) {
114
+ var immediateSuccessorVertexes = sourceVertex.getImmediateSuccessorVertexes(), immediateSuccessorVertexNames = (0, _vertex1.vertexNamesFromVertexes)(immediateSuccessorVertexes), targetVertexNames = immediateSuccessorVertexNames; ///
115
+ targetVertexNames.forEach(function(targetVertexName) {
116
+ var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
117
+ edges.push(edge);
118
+ });
119
+ }
120
+ return edges;
102
121
  }
103
122
  },
104
123
  {
105
- key: "getImmediatePredecessorVertexNamesByVertexName",
106
- value: function getImmediatePredecessorVertexNamesByVertexName(vertexName) {
107
- var includeCyclicEdges = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
108
- var immediatePredecessorVertexNames = this.directedAcyclicGraph.getImmediatePredecessorVertexNamesByVertexName(vertexName);
109
- if (includeCyclicEdges) {
110
- this.cyclicEdges.forEach(function(cyclicEdge) {
111
- var cyclicEdgeTargetVertexName = cyclicEdge.getTargetVertexName();
112
- if (cyclicEdgeTargetVertexName === vertexName) {
113
- var cyclicEdgeSourceVertexName = cyclicEdge.getSourceVertexName(), immediatePredecessorVertexName = cyclicEdgeSourceVertexName; ///
114
- immediatePredecessorVertexNames.push(immediatePredecessorVertexName);
115
- }
124
+ key: "getEdgesByTargetVertexName",
125
+ value: function getEdgesByTargetVertexName(targetVertexName) {
126
+ var edges = [], targetVertex = this.getVertexByVertexName(targetVertexName);
127
+ if (targetVertex !== null) {
128
+ var immediatePredecessorVertexes = targetVertex.getImmediatePredecessorVertexes(), immediatePredecessorVertexNames = (0, _vertex1.vertexNamesFromVertexes)(immediatePredecessorVertexes), sourceVertexNames = immediatePredecessorVertexNames; ///
129
+ sourceVertexNames.forEach(function(sourceVertexName) {
130
+ var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
131
+ edges.push(edge);
116
132
  });
117
133
  }
118
- return immediatePredecessorVertexNames;
134
+ return edges;
119
135
  }
120
136
  },
121
137
  {
122
- key: "getImmediateSuccessorVertexNamesByVertexName",
123
- value: function getImmediateSuccessorVertexNamesByVertexName(vertexName) {
124
- var includeCyclicEdges = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
125
- var immediateSuccessorVertexNames = this.directedAcyclicGraph.getImmediateSuccessorVertexNamesByVertexName(vertexName);
126
- if (includeCyclicEdges) {
127
- this.cyclicEdges.forEach(function(cyclicEdge) {
128
- var cyclicEdgeSourceVertexName = cyclicEdge.getSourceVertexName();
129
- if (cyclicEdgeSourceVertexName === vertexName) {
130
- var cyclicEdgeTargetVertexName = cyclicEdge.getTargetVertexName(), immediateSuccessorVertexName = cyclicEdgeTargetVertexName; ///
131
- immediateSuccessorVertexNames.push(immediateSuccessorVertexName);
138
+ key: "getFirstCycle",
139
+ value: function getFirstCycle() {
140
+ var firstCycle = null;
141
+ var cyclesPresent = this.areCyclesPresent();
142
+ if (cyclesPresent) {
143
+ var cyclicEdges = this.getCyclicEdges(), firstCyclicEdge = first(cyclicEdges), sourceVertexName = firstCyclicEdge.getSourceVertexName(), targetVertexName = firstCyclicEdge.getTargetVertexName(), sourceVertex = this.getVertexByVertexName(sourceVertexName), targetVertex = this.getVertexByVertexName(targetVertexName);
144
+ targetVertex.forwardsDepthFirstSearch(function(vertex, predecessorVertexes) {
145
+ var terminate = false;
146
+ if (vertex === sourceVertex) {
147
+ terminate = true;
148
+ var cycle = _cycle.default.fromSourceVertexAndPredecessorVertexes(sourceVertex, predecessorVertexes); ///
149
+ firstCycle = cycle; ///
132
150
  }
151
+ return terminate;
133
152
  });
134
153
  }
135
- return immediateSuccessorVertexNames;
154
+ return firstCycle;
136
155
  }
137
156
  },
138
157
  {
139
- key: "areCyclesPresentByVertexName",
140
- value: function areCyclesPresentByVertexName(vertexName) {
141
- var cyclesPresent = false;
142
- var vertexPresent = this.directedAcyclicGraph.isVertexPresentByVertexName(vertexName);
143
- if (vertexPresent) {
144
- var firstCycle = this.getFirstCycleByVertexName(vertexName);
145
- cyclesPresent = firstCycle !== null;
146
- }
147
- return cyclesPresent;
158
+ key: "getCyclicEdges",
159
+ value: function getCyclicEdges() {
160
+ var cyclicEdges = [], vertexes = this.getVertexes();
161
+ vertexes.forEach(function(vertex) {
162
+ var sourceVertex = vertex, sourceVertexIndex = sourceVertex.getIndex();
163
+ vertex.forEachImmediateSuccessorVertex(function(immediateSuccessorVertex) {
164
+ var targetVertex = immediateSuccessorVertex, targetVertexIndex = targetVertex.getIndex();
165
+ if (targetVertexIndex < sourceVertexIndex) {
166
+ var sourceVertexName = sourceVertex.getName(), targetVertexName = targetVertex.getName(), edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName), cyclicEdge = edge; ///
167
+ cyclicEdges.push(cyclicEdge);
168
+ }
169
+ });
170
+ sourceVertex;
171
+ });
172
+ return cyclicEdges;
148
173
  }
149
174
  },
150
175
  {
151
- key: "getFirstCycleByVertexName",
152
- value: function getFirstCycleByVertexName(vertexName) {
153
- var _this = this;
154
- var firstCycle = null;
155
- var vertex = this.directedAcyclicGraph.getVertexByVertexName(vertexName), cyclicEdges = this.cyclicEdges.slice(), partialCycles = [], cycles = [];
156
- (0, _vertex.forwardsDepthFirstSearch)(vertex, function(visitedVertex, getPredecessorVertices) {
157
- var visitedVertexName = visitedVertex.getName(), sourceVertexName = visitedVertexName; ///
158
- filter(cyclicEdges, function(cyclicEdge) {
159
- var matches = cyclicEdge.matchSourceVertexName(sourceVertexName);
160
- if (matches) {
161
- var predecessorVertices = getPredecessorVertices(), partialCycle = _partialCycle.default.fromCyclicEdgeAndPredecessorVertices(cyclicEdge, predecessorVertices);
162
- partialCycles.push(partialCycle);
163
- } else {
176
+ key: "areCyclesPresent",
177
+ value: function areCyclesPresent() {
178
+ var vertexes = this.getVertexes(), cyclesPresent = vertexes.some(function(vertex) {
179
+ var sourceVertex = vertex, sourceVertexIndex = sourceVertex.getIndex(), cyclicEdgePresent = vertex.someImmediateSuccessorVertex(function(immediateSuccessorVertex) {
180
+ var targetVertex = immediateSuccessorVertex, targetVertexIndex = targetVertex.getIndex();
181
+ if (targetVertexIndex < sourceVertexIndex) {
164
182
  return true;
165
183
  }
166
184
  });
167
- var cyclicEdgesLength = cyclicEdges.length, terminate = cyclicEdgesLength === 0;
168
- return terminate;
169
- });
170
- partialCycles.some(function(partialCycle) {
171
- var targetVertexName = partialCycle.getTargetVertexName(), targetVertex = _this.directedAcyclicGraph.getVertexByVertexName(targetVertexName);
172
- (0, _vertex.forwardsDepthFirstSearch)(targetVertex, function(visitedVertex, getPredecessorVertices) {
173
- var visitedVertexName = visitedVertex.getName();
174
- if (visitedVertexName === vertexName) {
175
- var predecessorVertices = getPredecessorVertices(), successorVertices = predecessorVertices, cycle = _cycle.default.fromVertexNamePartialCycleAndSuccessorVertices(vertexName, partialCycle, successorVertices);
176
- cycles.push(cycle);
177
- }
178
- var cyclesLength = cycles.length, terminate = cyclesLength > 0;
179
- return terminate;
180
- });
185
+ if (cyclicEdgePresent) {
186
+ return true;
187
+ }
181
188
  });
182
- var cyclesLength = cycles.length;
183
- if (cyclesLength > 0) {
184
- firstCycle = first(cycles);
185
- }
186
- return firstCycle;
189
+ return cyclesPresent;
187
190
  }
188
191
  },
189
192
  {
190
- key: "getFirstCycle",
191
- value: function getFirstCycle() {
192
- var firstCyclicEdge = first(this.cyclicEdges), cyclicEdge = firstCyclicEdge, sourceVertexName = cyclicEdge.getSourceVertexName(), vertexName = sourceVertexName, firstCycle = this.getFirstCycleByVertexName(vertexName);
193
- return firstCycle;
193
+ key: "isEdgePresent",
194
+ value: function isEdgePresent(edge) {
195
+ var edgePresent = false;
196
+ var sourceVertexName = edge.getSourceVertexName(), sourceVertex = this.getVertexByVertexName(sourceVertexName);
197
+ if (sourceVertex !== null) {
198
+ var targetVertexName = edge.getTargetVertexName(), targetVertex = this.getVertexByVertexName(targetVertexName);
199
+ if (targetVertex !== null) {
200
+ edgePresent = sourceVertex.isEdgePresentByTargetVertex(targetVertex);
201
+ }
202
+ }
203
+ return edgePresent;
194
204
  }
195
205
  },
196
206
  {
197
- key: "areCyclesPresent",
198
- value: function areCyclesPresent() {
199
- var cyclicEdgesLength = this.cyclicEdges.length, cyclesPresent = cyclicEdgesLength > 0;
200
- return cyclesPresent;
207
+ key: "isVertexPresentByVertexName",
208
+ value: function isVertexPresentByVertexName(vertexName) {
209
+ var vertexNames = this.getVertexNames(), vertexNamesIncludesVertexName = vertexNames.includes(vertexName), vertexPresent = vertexNamesIncludesVertexName; ///
210
+ return vertexPresent;
201
211
  }
202
212
  },
203
213
  {
204
- key: "addVerticesByVertexNames",
205
- value: function addVerticesByVertexNames(vertexNames) {
206
- var _this = this;
207
- vertexNames.forEach(function(vertexName) {
208
- return _this.addVertexByVertexName(vertexName);
209
- });
214
+ key: "addVertexByVertexName",
215
+ value: function addVertexByVertexName(vertexName) {
216
+ var vertexPresent = this.isVertexPresentByVertexName(vertexName);
217
+ if (!vertexPresent) {
218
+ var vertexNames = this.getVertexNames(), vertexNamesLength = vertexNames.length, name = vertexName, index = vertexNamesLength, vertex = _vertex.default.fromNameAndIndex(name, index);
219
+ this.setVertexByVertexName(vertexName, vertex);
220
+ }
221
+ var vertex1 = this.getVertexByVertexName(vertexName);
222
+ return vertex1;
210
223
  }
211
224
  },
212
225
  {
213
226
  key: "removeVertexByVertexName",
214
227
  value: function removeVertexByVertexName(vertexName) {
215
- this.directedAcyclicGraph.removeVertexByVertexName(vertexName);
216
- this.filterCyclicEdges();
217
- }
218
- },
219
- {
220
- key: "removeVerticesByVertexNames",
221
- value: function removeVerticesByVertexNames(vertexNames) {
222
- var _this = this;
223
- vertexNames.forEach(function(vertexName) {
224
- return _this.removeVertexByVertexName(vertexName);
228
+ var vertexPresent = this.isVertexPresentByVertexName(vertexName);
229
+ if (!vertexPresent) {
230
+ return;
231
+ }
232
+ var vertex = this.getVertexByVertexName(vertexName);
233
+ vertex.forEachImmediateSuccessorVertex(function(immediateSuccessVertex) {
234
+ var immediatePredecessorVertex = vertex; ///
235
+ immediateSuccessVertex.removeImmediatePredecessorVertex(immediatePredecessorVertex);
236
+ });
237
+ vertex.forEachImmediatePredecessorVertex(function(immediatePredecessorVertex) {
238
+ var immediateSuccessVertex = vertex; ///
239
+ immediatePredecessorVertex.removeImmediateSuccessorVertex(immediateSuccessVertex);
240
+ });
241
+ this.deleteVertexByVertexName(vertexName);
242
+ var vertexes = this.getVertexes(), deletedVertex = vertex, deletedVertexIndex = deletedVertex.getIndex();
243
+ vertexes.forEach(function(vertex) {
244
+ var vertexIndex = vertex.getIndex();
245
+ if (vertexIndex > deletedVertexIndex) {
246
+ vertex.decrementIndex();
247
+ }
225
248
  });
249
+ this.filterCyclicEdges();
226
250
  }
227
251
  },
228
252
  {
229
253
  key: "addEdge",
230
254
  value: function addEdge(edge) {
231
- var success = this.directedAcyclicGraph.addEdge(edge);
232
- if (!success) {
233
- var cyclicEdgesIncludesEdge = (0, _edge1.checkEdgesIncludesEdge)(edge, this.cyclicEdges);
234
- if (!cyclicEdgesIncludesEdge) {
235
- var cyclicEdge = edge; ///
236
- this.cyclicEdges.push(cyclicEdge);
237
- }
255
+ var sourceVertexName = edge.getSourceVertexName(), targetVertexName = edge.getTargetVertexName();
256
+ if (sourceVertexName === targetVertexName) {
257
+ return;
258
+ }
259
+ var sourceVertex = this.addVertexByVertexName(sourceVertexName), targetVertex = this.addVertexByVertexName(targetVertexName), edgePresent = sourceVertex.isEdgePresentByTargetVertex(targetVertex);
260
+ if (edgePresent) {
261
+ return;
238
262
  }
263
+ var sourceVertexIndex = sourceVertex.getIndex(), targetVertexIndex = targetVertex.getIndex();
264
+ if (sourceVertexIndex > targetVertexIndex) {
265
+ this.reorderVertexesBySourceVertexAndTargetVertex(sourceVertex, targetVertex);
266
+ }
267
+ var immediatePredecessorVertex = sourceVertex, immediateSuccessorVertex = targetVertex; ///
268
+ immediatePredecessorVertex.addImmediateSuccessorVertex(immediateSuccessorVertex);
269
+ immediateSuccessorVertex.addImmediatePredecessorVertex(immediatePredecessorVertex);
239
270
  }
240
271
  },
241
272
  {
@@ -243,30 +274,26 @@ var DirectedGraph = /*#__PURE__*/ function() {
243
274
  value: function addEdges(edges) {
244
275
  var _this = this;
245
276
  edges.forEach(function(edge) {
246
- return _this.addEdge(edge);
277
+ _this.addEdge(edge);
247
278
  });
248
279
  }
249
280
  },
250
281
  {
251
282
  key: "removeEdge",
252
- value: function removeEdge(edge) {
253
- var removeStrandedVertices = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
254
- var cyclicEdgesIncludesEdge = (0, _edge1.checkEdgesIncludesEdge)(edge, this.cyclicEdges), edgePresent = this.directedAcyclicGraph.isEdgePresent(edge), edgeCyclic = cyclicEdgesIncludesEdge; ///
255
- if (false) {
256
- ///
257
- } else if (edgeCyclic) {
258
- var cyclicEdge = edge; ///
259
- (0, _edge1.removeEdgeFromEdges)(cyclicEdge, this.cyclicEdges);
260
- } else if (edgePresent) {
261
- this.directedAcyclicGraph.removeEdge(edge);
262
- if (removeStrandedVertices) {
263
- var sourceVertexName = edge.getSourceVertexName(), targetVertexName = edge.getTargetVertexName(), sourceVertex = this.directedAcyclicGraph.getVertexByVertexName(sourceVertexName), targetVertex = this.directedAcyclicGraph.getVertexByVertexName(targetVertexName), sourceVertexStranded = sourceVertex.isStranded(), targetVertexStranded = targetVertex.isStranded();
264
- if (sourceVertexStranded) {
265
- this.directedAcyclicGraph.removeVertexByVertexName(sourceVertexName);
266
- }
267
- if (targetVertexStranded) {
268
- this.directedAcyclicGraph.removeVertexByVertexName(targetVertexName);
269
- }
283
+ value: function removeEdge(edge, removeStrandedVertexes) {
284
+ var sourceVertexName = edge.getSourceVertexName(), targetVertexName = edge.getTargetVertexName(), sourceVertex = this.addVertexByVertexName(sourceVertexName), targetVertex = this.addVertexByVertexName(targetVertexName), edgePresent = sourceVertex.isEdgePresentByTargetVertex(targetVertex);
285
+ if (!edgePresent) {
286
+ return;
287
+ }
288
+ sourceVertex.removeImmediateSuccessorVertex(targetVertex);
289
+ targetVertex.removeImmediatePredecessorVertex(sourceVertex);
290
+ if (removeStrandedVertexes) {
291
+ var sourceVertexStranded = sourceVertex.isStranded(), targetVertexStranded = targetVertex.isStranded();
292
+ if (sourceVertexStranded) {
293
+ this.removeVertexByVertexName(sourceVertexName);
294
+ }
295
+ if (targetVertexStranded) {
296
+ this.removeVertexByVertexName(targetVertexName);
270
297
  }
271
298
  }
272
299
  this.filterCyclicEdges();
@@ -275,76 +302,63 @@ var DirectedGraph = /*#__PURE__*/ function() {
275
302
  {
276
303
  key: "removeEdges",
277
304
  value: function removeEdges(edges) {
278
- var removeStrandedVertices = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
305
+ var removeStrandedVertexes = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
279
306
  var _this = this;
280
307
  edges.forEach(function(edge) {
281
- return _this.removeEdge(edge, removeStrandedVertices);
308
+ _this.removeEdge(edge, removeStrandedVertexes);
282
309
  });
283
310
  }
284
311
  },
285
312
  {
286
- key: "addEdgeByVertexNames",
287
- value: function addEdgeByVertexNames(sourceVertexName, targetVertexName) {
288
- var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
289
- this.addEdge(edge);
290
- }
291
- },
292
- {
293
- key: "removeEdgeByVertexNames",
294
- value: function removeEdgeByVertexNames(sourceVertexName, targetVertexName) {
295
- var removeStrandedVertices = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
296
- var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
297
- this.removeEdge(edge, removeStrandedVertices);
313
+ key: "removeAllEdgesAndVertexes",
314
+ value: function removeAllEdgesAndVertexes() {
315
+ this.vertexMap = {};
298
316
  }
299
317
  },
300
318
  {
301
- key: "removeEdgesByTargetVertexName",
302
- value: function removeEdgesByTargetVertexName(targetVertexName) {
303
- var removeStrandedVertices = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
304
- var cyclicEdges = (0, _edge1.edgesByTargetVertexName)(targetVertexName, this.cyclicEdges), edges = this.directedAcyclicGraph.getEdgesByTargetVertexName(targetVertexName);
305
- this.removeEdges(cyclicEdges, removeStrandedVertices);
306
- this.removeEdges(edges, removeStrandedVertices);
319
+ key: "reorderVertexesBySourceVertexAndTargetVertex",
320
+ value: function reorderVertexesBySourceVertexAndTargetVertex(sourceVertex, targetVertex) {
321
+ var sourceVertexReachable = targetVertex.isVertexReachable(sourceVertex);
322
+ if (sourceVertexReachable) {
323
+ return;
324
+ }
325
+ var forwardsVisitedVertexes = targetVertex.retrieveForwardsVisitedVertexes(), backwardsVisitedVertexes = sourceVertex.retrieveBackwardsVisitedVertexes();
326
+ (0, _vertex1.orderVertexes)(backwardsVisitedVertexes);
327
+ (0, _vertex1.orderVertexes)(forwardsVisitedVertexes);
328
+ var visitedVertexes = _to_consumable_array(backwardsVisitedVertexes).concat(_to_consumable_array(forwardsVisitedVertexes)), visitedIndexes = (0, _index.indexesFromVertexes)(visitedVertexes);
329
+ (0, _index.orderIndexes)(visitedIndexes);
330
+ visitedVertexes.forEach(function(visitedVertex, index) {
331
+ var visitedIndex = visitedIndexes[index];
332
+ index = visitedIndex; ///
333
+ visitedVertex.setIndex(index);
334
+ });
307
335
  }
308
336
  },
309
337
  {
310
- key: "removeEdgesBySourceVertexName",
311
- value: function removeEdgesBySourceVertexName(sourceVertexName) {
312
- var removeStrandedVertices = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
313
- var cyclicEdges = (0, _edge1.edgesBySourceVertexName)(sourceVertexName, this.cyclicEdges), edges = this.directedAcyclicGraph.getEdgesBySourceVertexName(sourceVertexName);
314
- this.removeEdges(cyclicEdges, removeStrandedVertices);
315
- this.removeEdges(edges, removeStrandedVertices);
338
+ key: "filterCyclicEdges",
339
+ value: function filterCyclicEdges() {
340
+ var cyclicEdges = this.getCyclicEdges(), edges = cyclicEdges; ///
341
+ this.removeEdges(edges);
342
+ this.addEdges(edges);
316
343
  }
317
344
  },
318
345
  {
319
- key: "removeAllEdgesAndVertices",
320
- value: function removeAllEdgesAndVertices() {
321
- this.directedAcyclicGraph = _directedAcyclicGraph.default.fromNothing();
322
- this.cyclicEdges = [];
346
+ key: "setVertexByVertexName",
347
+ value: function setVertexByVertexName(vertexName, vertex) {
348
+ this.vertexMap[vertexName] = vertex;
323
349
  }
324
350
  },
325
351
  {
326
- key: "filterCyclicEdges",
327
- value: function filterCyclicEdges() {
328
- var _this = this;
329
- filter(this.cyclicEdges, function(cyclicEdge) {
330
- var sourceVertexName = cyclicEdge.getSourceVertexName(), targetVertexName = cyclicEdge.getTargetVertexName(), sourceVertexPresent = _this.isVertexPresentByVertexName(sourceVertexName), targetVertexPresent = _this.isVertexPresentByVertexName(targetVertexName);
331
- if (sourceVertexPresent && targetVertexPresent) {
332
- return true;
333
- }
334
- });
335
- filter(this.cyclicEdges, function(cyclicEdge) {
336
- var edge = cyclicEdge, success = _this.directedAcyclicGraph.addEdge(edge);
337
- if (!success) {
338
- return true;
339
- }
340
- });
352
+ key: "deleteVertexByVertexName",
353
+ value: function deleteVertexByVertexName(vertexName) {
354
+ delete this.vertexMap[vertexName];
341
355
  }
342
356
  }
343
357
  ], [
344
358
  {
345
359
  key: "fromNothing",
346
360
  value: function fromNothing() {
347
- var cyclicEdges = [], directedAcyclicGraph = _directedAcyclicGraph.default.fromNothing(), directedGraph = new DirectedGraph(cyclicEdges, directedAcyclicGraph);
361
+ var vertexMap = {}, directedGraph = new DirectedGraph(vertexMap);
348
362
  return directedGraph;
349
363
  }
350
364
  }
@@ -352,4 +366,4 @@ var DirectedGraph = /*#__PURE__*/ function() {
352
366
  return DirectedGraph;
353
367
  }();
354
368
 
355
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RlZEdyYXBoLmpzIiwiPDxqc3gtY29uZmlnLXByYWdtYS5qcz4+Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IEVkZ2UgZnJvbSBcIi4vZWRnZVwiO1xuaW1wb3J0IEN5Y2xlIGZyb20gXCIuL2N5Y2xlXCI7XG5pbXBvcnQgUGFydGlhbEN5Y2xlIGZyb20gXCIuL3BhcnRpYWxDeWNsZVwiO1xuaW1wb3J0IERpcmVjdGVkQWN5Y2xpY0dyYXBoIGZyb20gXCIuL2RpcmVjdGVkQWN5Y2xpY0dyYXBoXCI7XG5cbmltcG9ydCB7IGZvcndhcmRzRGVwdGhGaXJzdFNlYXJjaCB9IGZyb20gXCIuL3V0aWxpdGllcy92ZXJ0ZXhcIjtcbmltcG9ydCB7IGNoZWNrRWRnZXNJbmNsdWRlc0VkZ2UsIHJlbW92ZUVkZ2VGcm9tRWRnZXMsIGVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lLCBlZGdlc0J5VGFyZ2V0VmVydGV4TmFtZSB9IGZyb20gXCIuL3V0aWxpdGllcy9lZGdlXCI7XG5cbmNvbnN0IHsgZmlyc3QsIGZpbHRlciB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpcmVjdGVkR3JhcGgge1xuICBjb25zdHJ1Y3RvcihjeWNsaWNFZGdlcywgZGlyZWN0ZWRBY3ljbGljR3JhcGgpIHtcbiAgICB0aGlzLmN5Y2xpY0VkZ2VzID0gY3ljbGljRWRnZXM7XG5cbiAgICB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoID0gZGlyZWN0ZWRBY3ljbGljR3JhcGg7XG4gIH1cblxuICBnZXRDeWNsaWNFZGdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jeWNsaWNFZGdlcztcbiAgfVxuXG4gIGdldERpcmVjdGVkQWN5Y2xpY0dyYXBoKCkge1xuICAgIHJldHVybiB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoO1xuICB9XG5cbiAgZ2V0VmVydGV4TmFtZXMoKSB7IHJldHVybiB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldFZlcnRleE5hbWVzKCk7IH1cblxuICBnZXRPcmRlcmVkVmVydGV4TmFtZXMoKSB7IHJldHVybiB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldE9yZGVyZWRWZXJ0ZXhOYW1lcygpOyB9XG5cbiAgYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHsgdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5hZGRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7IH1cblxuICBpc0VkZ2VQcmVzZW50QnlWZXJ0ZXhOYW1lcyhzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKSB7IHJldHVybiB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmlzRWRnZVByZXNlbnRCeVZlcnRleE5hbWVzKHNvdXJjZVZlcnRleE5hbWUsIHRhcmdldFZlcnRleE5hbWUpOyB9XG5cbiAgaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHsgcmV0dXJuIHRoaXMuZGlyZWN0ZWRBY3ljbGljR3JhcGguaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpOyB9XG5cbiAgZ2V0U3VjY2Vzc29yVmVydGV4TmFtZXNCeVZlcnRleE5hbWUodmVydGV4TmFtZSkgeyByZXR1cm4gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTsgfVxuXG4gIGdldFByZWRlY2Vzc29yVmVydGV4TmFtZXNCeVZlcnRleE5hbWUodmVydGV4TmFtZSkgeyByZXR1cm4gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRQcmVkZWNlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpOyB9XG5cbiAgZ2V0SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lLCBpbmNsdWRlQ3ljbGljRWRnZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXNCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICBpZiAoaW5jbHVkZUN5Y2xpY0VkZ2VzKSB7XG4gICAgICB0aGlzLmN5Y2xpY0VkZ2VzLmZvckVhY2goKGN5Y2xpY0VkZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUgPSBjeWNsaWNFZGdlLmdldFRhcmdldFZlcnRleE5hbWUoKTtcblxuICAgICAgICBpZiAoY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUgPT09IHZlcnRleE5hbWUpIHtcbiAgICAgICAgICBjb25zdCBjeWNsaWNFZGdlU291cmNlVmVydGV4TmFtZSA9IGN5Y2xpY0VkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgICAgIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZSA9IGN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lOyAgLy8vXG5cbiAgICAgICAgICBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzLnB1c2goaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICBnZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lLCBpbmNsdWRlQ3ljbGljRWRnZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzID0gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIGlmIChpbmNsdWRlQ3ljbGljRWRnZXMpIHtcbiAgICAgIHRoaXMuY3ljbGljRWRnZXMuZm9yRWFjaCgoY3ljbGljRWRnZSkgPT4ge1xuICAgICAgICBjb25zdCBjeWNsaWNFZGdlU291cmNlVmVydGV4TmFtZSA9IGN5Y2xpY0VkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpO1xuXG4gICAgICAgIGlmIChjeWNsaWNFZGdlU291cmNlVmVydGV4TmFtZSA9PT0gdmVydGV4TmFtZSkge1xuICAgICAgICAgIGNvbnN0IGN5Y2xpY0VkZ2VUYXJnZXRWZXJ0ZXhOYW1lID0gY3ljbGljRWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgICAgICAgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZSA9IGN5Y2xpY0VkZ2VUYXJnZXRWZXJ0ZXhOYW1lOyAgLy8vXG5cbiAgICAgICAgICBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcy5wdXNoKGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXM7XG4gIH1cblxuICBhcmVDeWNsZXNQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBsZXQgY3ljbGVzUHJlc2VudCA9IGZhbHNlO1xuXG4gICAgY29uc3QgdmVydGV4UHJlc2VudCA9IHRoaXMuZGlyZWN0ZWRBY3ljbGljR3JhcGguaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpO1xuXG4gICAgaWYgKHZlcnRleFByZXNlbnQpIHtcbiAgICAgIGNvbnN0IGZpcnN0Q3ljbGUgPSB0aGlzLmdldEZpcnN0Q3ljbGVCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICAgIGN5Y2xlc1ByZXNlbnQgPSAoZmlyc3RDeWNsZSAhPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN5Y2xlc1ByZXNlbnQ7XG4gIH1cblxuICBnZXRGaXJzdEN5Y2xlQnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBsZXQgZmlyc3RDeWNsZSA9IG51bGw7XG4gICAgXG4gICAgY29uc3QgdmVydGV4ID0gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSksXG4gICAgICAgICAgY3ljbGljRWRnZXMgPSB0aGlzLmN5Y2xpY0VkZ2VzLnNsaWNlKCksIC8vL1xuICAgICAgICAgIHBhcnRpYWxDeWNsZXMgPSBbXSxcbiAgICAgICAgICBjeWNsZXMgPSBbXTtcblxuICAgIGZvcndhcmRzRGVwdGhGaXJzdFNlYXJjaCh2ZXJ0ZXgsICh2aXNpdGVkVmVydGV4LCBnZXRQcmVkZWNlc3NvclZlcnRpY2VzKSA9PiB7XG4gICAgICBjb25zdCB2aXNpdGVkVmVydGV4TmFtZSA9IHZpc2l0ZWRWZXJ0ZXguZ2V0TmFtZSgpLFxuICAgICAgICAgICAgc291cmNlVmVydGV4TmFtZSA9IHZpc2l0ZWRWZXJ0ZXhOYW1lOyAvLy9cblxuICAgICAgZmlsdGVyKGN5Y2xpY0VkZ2VzLCAoY3ljbGljRWRnZSkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gY3ljbGljRWRnZS5tYXRjaFNvdXJjZVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSk7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICBjb25zdCBwcmVkZWNlc3NvclZlcnRpY2VzID0gZ2V0UHJlZGVjZXNzb3JWZXJ0aWNlcygpLFxuICAgICAgICAgICAgICAgIHBhcnRpYWxDeWNsZSA9ICBQYXJ0aWFsQ3ljbGUuZnJvbUN5Y2xpY0VkZ2VBbmRQcmVkZWNlc3NvclZlcnRpY2VzKGN5Y2xpY0VkZ2UsIHByZWRlY2Vzc29yVmVydGljZXMpO1xuICAgICAgICAgIFxuICAgICAgICAgIHBhcnRpYWxDeWNsZXMucHVzaChwYXJ0aWFsQ3ljbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY3ljbGljRWRnZXNMZW5ndGggPSBjeWNsaWNFZGdlcy5sZW5ndGgsXG4gICAgICAgICAgICB0ZXJtaW5hdGUgPSAoY3ljbGljRWRnZXNMZW5ndGggPT09IDApO1xuXG4gICAgICByZXR1cm4gdGVybWluYXRlO1xuICAgIH0pO1xuXG4gICAgcGFydGlhbEN5Y2xlcy5zb21lKChwYXJ0aWFsQ3ljbGUpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldFZlcnRleE5hbWUgPSBwYXJ0aWFsQ3ljbGUuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgdGFyZ2V0VmVydGV4ID0gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICAgIGZvcndhcmRzRGVwdGhGaXJzdFNlYXJjaCh0YXJnZXRWZXJ0ZXgsICh2aXNpdGVkVmVydGV4LCBnZXRQcmVkZWNlc3NvclZlcnRpY2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpc2l0ZWRWZXJ0ZXhOYW1lID0gdmlzaXRlZFZlcnRleC5nZXROYW1lKCk7XG5cbiAgICAgICAgaWYgKHZpc2l0ZWRWZXJ0ZXhOYW1lID09PSB2ZXJ0ZXhOYW1lKSB7XG4gICAgICAgICAgY29uc3QgcHJlZGVjZXNzb3JWZXJ0aWNlcyA9IGdldFByZWRlY2Vzc29yVmVydGljZXMoKSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzb3JWZXJ0aWNlcyA9IHByZWRlY2Vzc29yVmVydGljZXMsICAvLy9cbiAgICAgICAgICAgICAgICBjeWNsZSA9IEN5Y2xlLmZyb21WZXJ0ZXhOYW1lUGFydGlhbEN5Y2xlQW5kU3VjY2Vzc29yVmVydGljZXModmVydGV4TmFtZSwgcGFydGlhbEN5Y2xlLCBzdWNjZXNzb3JWZXJ0aWNlcyk7XG5cbiAgICAgICAgICBjeWNsZXMucHVzaChjeWNsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjeWNsZXNMZW5ndGggPSBjeWNsZXMubGVuZ3RoLFxuICAgICAgICAgICAgICB0ZXJtaW5hdGUgPSAoY3ljbGVzTGVuZ3RoID4gMCk7XG5cbiAgICAgICAgcmV0dXJuIHRlcm1pbmF0ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY3ljbGVzTGVuZ3RoID0gY3ljbGVzLmxlbmd0aDtcbiAgICBcbiAgICBpZiAoY3ljbGVzTGVuZ3RoID4gMCkge1xuICAgICAgZmlyc3RDeWNsZSA9IGZpcnN0KGN5Y2xlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpcnN0Q3ljbGU7XG4gIH1cblxuICBnZXRGaXJzdEN5Y2xlKCkge1xuICAgIGNvbnN0IGZpcnN0Q3ljbGljRWRnZSA9IGZpcnN0KHRoaXMuY3ljbGljRWRnZXMpLFxuICAgICAgICAgIGN5Y2xpY0VkZ2UgPSBmaXJzdEN5Y2xpY0VkZ2UsIC8vL1xuICAgICAgICAgIHNvdXJjZVZlcnRleE5hbWUgPSBjeWNsaWNFZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSxcbiAgICAgICAgICB2ZXJ0ZXhOYW1lID0gc291cmNlVmVydGV4TmFtZSwgIC8vL1xuICAgICAgICAgIGZpcnN0Q3ljbGUgPSB0aGlzLmdldEZpcnN0Q3ljbGVCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICByZXR1cm4gZmlyc3RDeWNsZTtcbiAgfVxuXG4gIGFyZUN5Y2xlc1ByZXNlbnQoKSB7XG4gICAgY29uc3QgY3ljbGljRWRnZXNMZW5ndGggPSB0aGlzLmN5Y2xpY0VkZ2VzLmxlbmd0aCxcbiAgICAgICAgICBjeWNsZXNQcmVzZW50ID0gKGN5Y2xpY0VkZ2VzTGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4gY3ljbGVzUHJlc2VudDtcbiAgfVxuXG4gIGFkZFZlcnRpY2VzQnlWZXJ0ZXhOYW1lcyh2ZXJ0ZXhOYW1lcykge1xuICAgIHZlcnRleE5hbWVzLmZvckVhY2goKHZlcnRleE5hbWUpID0+IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpKTtcbiAgfVxuXG4gIHJlbW92ZVZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSB7XG4gICAgdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5yZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICB0aGlzLmZpbHRlckN5Y2xpY0VkZ2VzKCk7XG4gIH1cblxuICByZW1vdmVWZXJ0aWNlc0J5VmVydGV4TmFtZXModmVydGV4TmFtZXMpIHtcbiAgICB2ZXJ0ZXhOYW1lcy5mb3JFYWNoKCh2ZXJ0ZXhOYW1lKSA9PiB0aGlzLnJlbW92ZVZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSk7XG4gIH1cblxuICBhZGRFZGdlKGVkZ2UpIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5hZGRFZGdlKGVkZ2UpO1xuICAgIFxuICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgY29uc3QgY3ljbGljRWRnZXNJbmNsdWRlc0VkZ2UgPSBjaGVja0VkZ2VzSW5jbHVkZXNFZGdlKGVkZ2UsIHRoaXMuY3ljbGljRWRnZXMpO1xuXG4gICAgICBpZiAoIWN5Y2xpY0VkZ2VzSW5jbHVkZXNFZGdlKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xpY0VkZ2UgPSBlZGdlOyAgLy8vXG5cbiAgICAgICAgdGhpcy5jeWNsaWNFZGdlcy5wdXNoKGN5Y2xpY0VkZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgYWRkRWRnZXMoZWRnZXMpIHtcbiAgICBlZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB0aGlzLmFkZEVkZ2UoZWRnZSkpO1xuICB9XG5cbiAgcmVtb3ZlRWRnZShlZGdlLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzID0gZmFsc2UpIHtcbiAgICBjb25zdCBjeWNsaWNFZGdlc0luY2x1ZGVzRWRnZSA9IGNoZWNrRWRnZXNJbmNsdWRlc0VkZ2UoZWRnZSwgdGhpcy5jeWNsaWNFZGdlcyksXG4gICAgICAgICAgZWRnZVByZXNlbnQgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmlzRWRnZVByZXNlbnQoZWRnZSksXG4gICAgICAgICAgZWRnZUN5Y2xpYyA9IGN5Y2xpY0VkZ2VzSW5jbHVkZXNFZGdlOyAvLy9cblxuICAgIGlmIChmYWxzZSkge1xuICAgICAgLy8vXG4gICAgfSBlbHNlIGlmIChlZGdlQ3ljbGljKSB7XG4gICAgICBjb25zdCBjeWNsaWNFZGdlID0gZWRnZTsgIC8vL1xuXG4gICAgICByZW1vdmVFZGdlRnJvbUVkZ2VzKGN5Y2xpY0VkZ2UsIHRoaXMuY3ljbGljRWRnZXMpO1xuICAgIH0gZWxzZSBpZiAoZWRnZVByZXNlbnQpIHtcbiAgICAgIHRoaXMuZGlyZWN0ZWRBY3ljbGljR3JhcGgucmVtb3ZlRWRnZShlZGdlKTtcblxuICAgICAgaWYgKHJlbW92ZVN0cmFuZGVkVmVydGljZXMpIHtcbiAgICAgICAgY29uc3Qgc291cmNlVmVydGV4TmFtZSA9IGVkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gZWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgICAgIHNvdXJjZVZlcnRleCA9IHRoaXMuZGlyZWN0ZWRBY3ljbGljR3JhcGguZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpLFxuICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXggPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldFZlcnRleEJ5VmVydGV4TmFtZSh0YXJnZXRWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICAgICAgc291cmNlVmVydGV4U3RyYW5kZWQgPSBzb3VyY2VWZXJ0ZXguaXNTdHJhbmRlZCgpLFxuICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhTdHJhbmRlZCA9IHRhcmdldFZlcnRleC5pc1N0cmFuZGVkKCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZVZlcnRleFN0cmFuZGVkKSB7XG4gICAgICAgICAgdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaC5yZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0VmVydGV4U3RyYW5kZWQpIHtcbiAgICAgICAgICB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLnJlbW92ZVZlcnRleEJ5VmVydGV4TmFtZSh0YXJnZXRWZXJ0ZXhOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyQ3ljbGljRWRnZXMoKTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2VzKGVkZ2VzLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzID0gZmFsc2UpIHtcbiAgICBlZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB0aGlzLnJlbW92ZUVkZ2UoZWRnZSwgcmVtb3ZlU3RyYW5kZWRWZXJ0aWNlcykpO1xuICB9XG5cbiAgYWRkRWRnZUJ5VmVydGV4TmFtZXMoc291cmNlVmVydGV4TmFtZSwgdGFyZ2V0VmVydGV4TmFtZSkge1xuICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgIHRoaXMuYWRkRWRnZShlZGdlKTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2VCeVZlcnRleE5hbWVzKHNvdXJjZVZlcnRleE5hbWUsIHRhcmdldFZlcnRleE5hbWUsIHJlbW92ZVN0cmFuZGVkVmVydGljZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgIHRoaXMucmVtb3ZlRWRnZShlZGdlLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzKTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2VzQnlUYXJnZXRWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUsIHJlbW92ZVN0cmFuZGVkVmVydGljZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGN5Y2xpY0VkZ2VzID0gZWRnZXNCeVRhcmdldFZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSwgdGhpcy5jeWNsaWNFZGdlcyksXG4gICAgICAgICAgZWRnZXMgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldEVkZ2VzQnlUYXJnZXRWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpO1xuXG4gICAgdGhpcy5yZW1vdmVFZGdlcyhjeWNsaWNFZGdlcywgcmVtb3ZlU3RyYW5kZWRWZXJ0aWNlcyk7XG5cbiAgICB0aGlzLnJlbW92ZUVkZ2VzKGVkZ2VzLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzKTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUsIHJlbW92ZVN0cmFuZGVkVmVydGljZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGN5Y2xpY0VkZ2VzID0gZWRnZXNCeVNvdXJjZVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSwgdGhpcy5jeWNsaWNFZGdlcyksXG4gICAgICAgICAgZWRnZXMgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmdldEVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuXG4gICAgdGhpcy5yZW1vdmVFZGdlcyhjeWNsaWNFZGdlcywgcmVtb3ZlU3RyYW5kZWRWZXJ0aWNlcyk7XG5cbiAgICB0aGlzLnJlbW92ZUVkZ2VzKGVkZ2VzLCByZW1vdmVTdHJhbmRlZFZlcnRpY2VzKTtcbiAgfVxuXG4gIHJlbW92ZUFsbEVkZ2VzQW5kVmVydGljZXMoKSB7XG4gICAgdGhpcy5kaXJlY3RlZEFjeWNsaWNHcmFwaCA9IERpcmVjdGVkQWN5Y2xpY0dyYXBoLmZyb21Ob3RoaW5nKCk7XG5cbiAgICB0aGlzLmN5Y2xpY0VkZ2VzID0gW107XG4gIH1cblxuICBmaWx0ZXJDeWNsaWNFZGdlcygpIHtcbiAgICBmaWx0ZXIodGhpcy5jeWNsaWNFZGdlcywgKGN5Y2xpY0VkZ2UpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVZlcnRleE5hbWUgPSBjeWNsaWNFZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleE5hbWUgPSBjeWNsaWNFZGdlLmdldFRhcmdldFZlcnRleE5hbWUoKSxcbiAgICAgICAgICAgIHNvdXJjZVZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZSh0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgaWYgKHNvdXJjZVZlcnRleFByZXNlbnQgJiYgdGFyZ2V0VmVydGV4UHJlc2VudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZpbHRlcih0aGlzLmN5Y2xpY0VkZ2VzLCAoY3ljbGljRWRnZSkgPT4ge1xuICAgICAgY29uc3QgZWRnZSA9IGN5Y2xpY0VkZ2UsICAvLy9cbiAgICAgICAgICAgIHN1Y2Nlc3MgPSB0aGlzLmRpcmVjdGVkQWN5Y2xpY0dyYXBoLmFkZEVkZ2UoZWRnZSk7XG5cbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTm90aGluZygpIHtcbiAgICBjb25zdCBjeWNsaWNFZGdlcyA9IFtdLFxuICAgICAgICAgIGRpcmVjdGVkQWN5Y2xpY0dyYXBoID0gRGlyZWN0ZWRBY3ljbGljR3JhcGguZnJvbU5vdGhpbmcoKSxcbiAgICAgICAgICBkaXJlY3RlZEdyYXBoID0gbmV3IERpcmVjdGVkR3JhcGgoY3ljbGljRWRnZXMsIGRpcmVjdGVkQWN5Y2xpY0dyYXBoKTtcbiAgICBcbiAgICByZXR1cm4gZGlyZWN0ZWRHcmFwaDsgICAgXG4gIH1cbn1cbiIsIlJlYWN0LmNyZWF0ZUVsZW1lbnQiXSwibmFtZXMiOlsiRGlyZWN0ZWRHcmFwaCIsImZpcnN0IiwiYXJyYXlVdGlsaXRpZXMiLCJmaWx0ZXIiLCJjeWNsaWNFZGdlcyIsImRpcmVjdGVkQWN5Y2xpY0dyYXBoIiwiZ2V0Q3ljbGljRWRnZXMiLCJnZXREaXJlY3RlZEFjeWNsaWNHcmFwaCIsImdldFZlcnRleE5hbWVzIiwiZ2V0T3JkZXJlZFZlcnRleE5hbWVzIiwiYWRkVmVydGV4QnlWZXJ0ZXhOYW1lIiwidmVydGV4TmFtZSIsImlzRWRnZVByZXNlbnRCeVZlcnRleE5hbWVzIiwic291cmNlVmVydGV4TmFtZSIsInRhcmdldFZlcnRleE5hbWUiLCJpc1ZlcnRleFByZXNlbnRCeVZlcnRleE5hbWUiLCJnZXRTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSIsImdldFByZWRlY2Vzc29yVmVydGV4TmFtZXNCeVZlcnRleE5hbWUiLCJnZXRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lIiwiaW5jbHVkZUN5Y2xpY0VkZ2VzIiwiaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyIsImZvckVhY2giLCJjeWNsaWNFZGdlIiwiY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUiLCJnZXRUYXJnZXRWZXJ0ZXhOYW1lIiwiY3ljbGljRWRnZVNvdXJjZVZlcnRleE5hbWUiLCJnZXRTb3VyY2VWZXJ0ZXhOYW1lIiwiaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lIiwicHVzaCIsImdldEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lIiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXMiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lIiwiYXJlQ3ljbGVzUHJlc2VudEJ5VmVydGV4TmFtZSIsImN5Y2xlc1ByZXNlbnQiLCJ2ZXJ0ZXhQcmVzZW50IiwiZmlyc3RDeWNsZSIsImdldEZpcnN0Q3ljbGVCeVZlcnRleE5hbWUiLCJ2ZXJ0ZXgiLCJnZXRWZXJ0ZXhCeVZlcnRleE5hbWUiLCJzbGljZSIsInBhcnRpYWxDeWNsZXMiLCJjeWNsZXMiLCJmb3J3YXJkc0RlcHRoRmlyc3RTZWFyY2giLCJ2aXNpdGVkVmVydGV4IiwiZ2V0UHJlZGVjZXNzb3JWZXJ0aWNlcyIsInZpc2l0ZWRWZXJ0ZXhOYW1lIiwiZ2V0TmFtZSIsIm1hdGNoZXMiLCJtYXRjaFNvdXJjZVZlcnRleE5hbWUiLCJwcmVkZWNlc3NvclZlcnRpY2VzIiwicGFydGlhbEN5Y2xlIiwiUGFydGlhbEN5Y2xlIiwiZnJvbUN5Y2xpY0VkZ2VBbmRQcmVkZWNlc3NvclZlcnRpY2VzIiwiY3ljbGljRWRnZXNMZW5ndGgiLCJsZW5ndGgiLCJ0ZXJtaW5hdGUiLCJzb21lIiwidGFyZ2V0VmVydGV4Iiwic3VjY2Vzc29yVmVydGljZXMiLCJjeWNsZSIsIkN5Y2xlIiwiZnJvbVZlcnRleE5hbWVQYXJ0aWFsQ3ljbGVBbmRTdWNjZXNzb3JWZXJ0aWNlcyIsImN5Y2xlc0xlbmd0aCIsImdldEZpcnN0Q3ljbGUiLCJmaXJzdEN5Y2xpY0VkZ2UiLCJhcmVDeWNsZXNQcmVzZW50IiwiYWRkVmVydGljZXNCeVZlcnRleE5hbWVzIiwidmVydGV4TmFtZXMiLCJyZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUiLCJmaWx0ZXJDeWNsaWNFZGdlcyIsInJlbW92ZVZlcnRpY2VzQnlWZXJ0ZXhOYW1lcyIsImFkZEVkZ2UiLCJlZGdlIiwic3VjY2VzcyIsImN5Y2xpY0VkZ2VzSW5jbHVkZXNFZGdlIiwiY2hlY2tFZGdlc0luY2x1ZGVzRWRnZSIsImFkZEVkZ2VzIiwiZWRnZXMiLCJyZW1vdmVFZGdlIiwicmVtb3ZlU3RyYW5kZWRWZXJ0aWNlcyIsImVkZ2VQcmVzZW50IiwiaXNFZGdlUHJlc2VudCIsImVkZ2VDeWNsaWMiLCJyZW1vdmVFZGdlRnJvbUVkZ2VzIiwic291cmNlVmVydGV4Iiwic291cmNlVmVydGV4U3RyYW5kZWQiLCJpc1N0cmFuZGVkIiwidGFyZ2V0VmVydGV4U3RyYW5kZWQiLCJyZW1vdmVFZGdlcyIsImFkZEVkZ2VCeVZlcnRleE5hbWVzIiwiRWRnZSIsImZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZSIsInJlbW92ZUVkZ2VCeVZlcnRleE5hbWVzIiwicmVtb3ZlRWRnZXNCeVRhcmdldFZlcnRleE5hbWUiLCJlZGdlc0J5VGFyZ2V0VmVydGV4TmFtZSIsImdldEVkZ2VzQnlUYXJnZXRWZXJ0ZXhOYW1lIiwicmVtb3ZlRWRnZXNCeVNvdXJjZVZlcnRleE5hbWUiLCJlZGdlc0J5U291cmNlVmVydGV4TmFtZSIsImdldEVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lIiwicmVtb3ZlQWxsRWRnZXNBbmRWZXJ0aWNlcyIsIkRpcmVjdGVkQWN5Y2xpY0dyYXBoIiwiZnJvbU5vdGhpbmciLCJzb3VyY2VWZXJ0ZXhQcmVzZW50IiwidGFyZ2V0VmVydGV4UHJlc2VudCIsImRpcmVjdGVkR3JhcGgiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBY3FCQTs7O3lCQVpVOzJEQUVkOzREQUNDO21FQUNPOzJFQUNRO3NCQUVRO3FCQUNxRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU5RyxJQUFRQyxRQUFrQkMsMEJBQWxCRCxPQUFPRSxTQUFXRCwwQkFBWEM7QUFFQSxJQUFBLEFBQU1ILDhCQUFOO2FBQU1BLGNBQ1BJLFdBQVcsRUFBRUMsb0JBQW9CO2dDQUQxQkw7UUFFakIsSUFBSSxDQUFDSSxjQUFjQTtRQUVuQixJQUFJLENBQUNDLHVCQUF1QkE7O2tCQUpYTDs7WUFPbkJNLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0Y7WUFDZDs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0Y7WUFDZDs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFBbUIsT0FBTyxJQUFJLENBQUNILHFCQUFxQkc7WUFBa0I7OztZQUV0RUMsS0FBQUE7bUJBQUFBLFNBQUFB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
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RlZEdyYXBoLmpzIiwiPDxqc3gtY29uZmlnLXByYWdtYS5qcz4+Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IEVkZ2UgZnJvbSBcIi4vZWRnZVwiO1xuaW1wb3J0IEN5Y2xlIGZyb20gXCIuL2N5Y2xlXCI7XG5pbXBvcnQgVmVydGV4IGZyb20gXCIuL3ZlcnRleFwiO1xuXG5pbXBvcnQgeyBvcmRlckluZGV4ZXMsIGluZGV4ZXNGcm9tVmVydGV4ZXMgfSBmcm9tIFwiLi91dGlsaXRpZXMvaW5kZXhcIjtcbmltcG9ydCB7IG9yZGVyVmVydGV4ZXMsIHZlcnRleE5hbWVzRnJvbVZlcnRleGVzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3ZlcnRleFwiO1xuXG5jb25zdCB7IGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlyZWN0ZWRHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKHZlcnRleE1hcCkge1xuICAgIHRoaXMudmVydGV4TWFwID0gdmVydGV4TWFwO1xuICB9XG5cbiAgZ2V0VmVydGV4TmFwKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnRleE1hcDtcbiAgfVxuXG4gIGdldFZlcnRleGVzKCkge1xuICAgIGNvbnN0IHZlcnRleE1hcFZhbHVlcyA9IE9iamVjdC52YWx1ZXModGhpcy52ZXJ0ZXhNYXApLFxuICAgICAgICAgIHZlcnRleGVzID0gdmVydGV4TWFwVmFsdWVzOyAvLy9cblxuICAgIHJldHVybiB2ZXJ0ZXhlcztcbiAgfVxuXG4gIGdldFZlcnRleE5hbWVzKCkge1xuICAgIGNvbnN0IHZlcnRleE1hcEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnZlcnRleE1hcCksXG4gICAgICAgICAgdmVydGV4TmFtZXMgPSB2ZXJ0ZXhNYXBLZXlzOyAgLy8vXG5cbiAgICByZXR1cm4gdmVydGV4TmFtZXM7XG4gIH1cblxuICBnZXRPcmRlcmVkVmVydGV4TmFtZXMoKSB7XG4gICAgY29uc3QgdmVydGV4ZXMgPSB0aGlzLmdldFZlcnRleGVzKCk7XG5cbiAgICBvcmRlclZlcnRleGVzKHZlcnRleGVzKTtcblxuICAgIGNvbnN0IG9yZGVyZWRWZXJ0ZXhlcyA9IHZlcnRleGVzLCAvLy9cbiAgICAgICAgICBvcmRlcmVkVmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyhvcmRlcmVkVmVydGV4ZXMpO1xuXG4gICAgcmV0dXJuIG9yZGVyZWRWZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGdldFZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSB7XG4gICAgY29uc3QgdmVydGV4UHJlc2VudCA9IHRoaXMuaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpLFxuICAgICAgICAgIHZlcnRleCA9IHZlcnRleFByZXNlbnQgP1xuICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhNYXBbdmVydGV4TmFtZV0gOlxuICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuXG4gICAgcmV0dXJuIHZlcnRleDtcbiAgfVxuXG4gIGdldEVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpIHtcbiAgICBjb25zdCBlZGdlcyA9IFtdLFxuICAgICAgICAgIHNvdXJjZVZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuXG4gICAgaWYgKHNvdXJjZVZlcnRleCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMgPSBzb3VyY2VWZXJ0ZXguZ2V0SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMoKSxcbiAgICAgICAgICAgIGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzID0gdmVydGV4TmFtZXNGcm9tVmVydGV4ZXMoaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ZXMpLFxuICAgICAgICAgICAgdGFyZ2V0VmVydGV4TmFtZXMgPSBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lczsgIC8vL1xuXG4gICAgICB0YXJnZXRWZXJ0ZXhOYW1lcy5mb3JFYWNoKCh0YXJnZXRWZXJ0ZXhOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VzO1xuICB9XG5cbiAgZ2V0RWRnZXNCeVRhcmdldFZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSkge1xuICAgIGNvbnN0IGVkZ2VzID0gW10sXG4gICAgICAgICAgdGFyZ2V0VmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICBpZiAodGFyZ2V0VmVydGV4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzID0gdGFyZ2V0VmVydGV4LmdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ZXMoKSxcbiAgICAgICAgICAgIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyhpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzKSxcbiAgICAgICAgICAgIHNvdXJjZVZlcnRleE5hbWVzID0gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lczsgIC8vL1xuXG4gICAgICBzb3VyY2VWZXJ0ZXhOYW1lcy5mb3JFYWNoKChzb3VyY2VWZXJ0ZXhOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VzO1xuICB9XG5cbiAgZ2V0Rmlyc3RDeWNsZSgpIHtcbiAgICBsZXQgZmlyc3RDeWNsZSA9IG51bGw7XG5cbiAgICBjb25zdCBjeWNsZXNQcmVzZW50ID0gdGhpcy5hcmVDeWNsZXNQcmVzZW50KCk7XG5cbiAgICBpZiAoY3ljbGVzUHJlc2VudCkge1xuICAgICAgY29uc3QgY3ljbGljRWRnZXMgPSB0aGlzLmdldEN5Y2xpY0VkZ2VzKCksXG4gICAgICAgICAgICBmaXJzdEN5Y2xpY0VkZ2UgPSBmaXJzdChjeWNsaWNFZGdlcyksXG4gICAgICAgICAgICBzb3VyY2VWZXJ0ZXhOYW1lID0gZmlyc3RDeWNsaWNFZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSwgLy8vXG4gICAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gZmlyc3RDeWNsaWNFZGdlLmdldFRhcmdldFZlcnRleE5hbWUoKSwgLy8vXG4gICAgICAgICAgICBzb3VyY2VWZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpO1xuXG4gICAgICB0YXJnZXRWZXJ0ZXguZm9yd2FyZHNEZXB0aEZpcnN0U2VhcmNoKCh2ZXJ0ZXgsIHByZWRlY2Vzc29yVmVydGV4ZXMpID0+IHtcbiAgICAgICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh2ZXJ0ZXggPT09IHNvdXJjZVZlcnRleCkge1xuICAgICAgICAgIHRlcm1pbmF0ZSA9IHRydWU7XG5cbiAgICAgICAgICBjb25zdCBjeWNsZSA9IEN5Y2xlLmZyb21Tb3VyY2VWZXJ0ZXhBbmRQcmVkZWNlc3NvclZlcnRleGVzKHNvdXJjZVZlcnRleCwgcHJlZGVjZXNzb3JWZXJ0ZXhlcyk7ICAvLy9cblxuICAgICAgICAgIGZpcnN0Q3ljbGUgPSBjeWNsZTsgLy8vXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGVybWluYXRlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpcnN0Q3ljbGU7XG4gIH1cblxuICBnZXRDeWNsaWNFZGdlcygpIHtcbiAgICBjb25zdCBjeWNsaWNFZGdlcyA9IFtdLFxuICAgICAgICAgIHZlcnRleGVzID0gdGhpcy5nZXRWZXJ0ZXhlcygpO1xuXG4gICAgdmVydGV4ZXMuZm9yRWFjaCgodmVydGV4KSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2VWZXJ0ZXggPSB2ZXJ0ZXgsICAvLy9cbiAgICAgICAgICAgIHNvdXJjZVZlcnRleEluZGV4ID0gc291cmNlVmVydGV4LmdldEluZGV4KCk7XG5cbiAgICAgIHZlcnRleC5mb3JFYWNoSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KChpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmVydGV4ID0gaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4LCAgLy8vXG4gICAgICAgICAgICAgIHRhcmdldFZlcnRleEluZGV4ID0gdGFyZ2V0VmVydGV4LmdldEluZGV4KCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFZlcnRleEluZGV4IDwgc291cmNlVmVydGV4SW5kZXgpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VWZXJ0ZXhOYW1lID0gc291cmNlVmVydGV4LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gdGFyZ2V0VmVydGV4LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICBlZGdlID0gRWRnZS5mcm9tU291cmNlVmVydGV4TmFtZUFuZFRhcmdldFZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSwgdGFyZ2V0VmVydGV4TmFtZSksXG4gICAgICAgICAgICAgICAgY3ljbGljRWRnZSA9IGVkZ2U7ICAvLy9cblxuICAgICAgICAgIGN5Y2xpY0VkZ2VzLnB1c2goY3ljbGljRWRnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzb3VyY2VWZXJ0ZXhcbiAgICB9KTtcblxuICAgIHJldHVybiBjeWNsaWNFZGdlcztcbiAgfVxuXG4gIGFyZUN5Y2xlc1ByZXNlbnQoKSB7XG4gICAgY29uc3QgdmVydGV4ZXMgPSB0aGlzLmdldFZlcnRleGVzKCksXG4gICAgICAgICAgY3ljbGVzUHJlc2VudCA9IHZlcnRleGVzLnNvbWUoKHZlcnRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlVmVydGV4ID0gdmVydGV4LCAgLy8vXG4gICAgICAgICAgICAgICAgICBzb3VyY2VWZXJ0ZXhJbmRleCA9IHNvdXJjZVZlcnRleC5nZXRJbmRleCgpLFxuICAgICAgICAgICAgICAgICAgY3ljbGljRWRnZVByZXNlbnQgPSB2ZXJ0ZXguc29tZUltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCgoaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFZlcnRleCA9IGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCwgIC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhJbmRleCA9IHRhcmdldFZlcnRleC5nZXRJbmRleCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRWZXJ0ZXhJbmRleCA8IHNvdXJjZVZlcnRleEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoY3ljbGljRWRnZVByZXNlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY3ljbGVzUHJlc2VudDtcbiAgfVxuXG4gIGlzRWRnZVByZXNlbnQoZWRnZSkge1xuICAgIGxldCBlZGdlUHJlc2VudCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc291cmNlVmVydGV4TmFtZSA9IGVkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpLFxuICAgICAgICAgIHNvdXJjZVZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuXG4gICAgaWYgKHNvdXJjZVZlcnRleCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgdGFyZ2V0VmVydGV4TmFtZSA9IGVkZ2UuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgdGFyZ2V0VmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICAgIGlmICh0YXJnZXRWZXJ0ZXggIT09IG51bGwpIHtcbiAgICAgICAgZWRnZVByZXNlbnQgPSBzb3VyY2VWZXJ0ZXguaXNFZGdlUHJlc2VudEJ5VGFyZ2V0VmVydGV4KHRhcmdldFZlcnRleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VQcmVzZW50O1xuICB9XG5cbiAgaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBjb25zdCB2ZXJ0ZXhOYW1lcyA9IHRoaXMuZ2V0VmVydGV4TmFtZXMoKSxcbiAgICAgICAgICB2ZXJ0ZXhOYW1lc0luY2x1ZGVzVmVydGV4TmFtZSA9IHZlcnRleE5hbWVzLmluY2x1ZGVzKHZlcnRleE5hbWUpLFxuICAgICAgICAgIHZlcnRleFByZXNlbnQgPSB2ZXJ0ZXhOYW1lc0luY2x1ZGVzVmVydGV4TmFtZTsgIC8vL1xuXG4gICAgcmV0dXJuIHZlcnRleFByZXNlbnQ7XG4gIH1cblxuICBhZGRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSkge1xuICAgIGNvbnN0IHZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIGlmICghdmVydGV4UHJlc2VudCkge1xuICAgICAgY29uc3QgdmVydGV4TmFtZXMgPSB0aGlzLmdldFZlcnRleE5hbWVzKCksXG4gICAgICAgICAgICB2ZXJ0ZXhOYW1lc0xlbmd0aCA9IHZlcnRleE5hbWVzLmxlbmd0aCxcbiAgICAgICAgICAgIG5hbWUgPSB2ZXJ0ZXhOYW1lLCAgLy8vXG4gICAgICAgICAgICBpbmRleCA9IHZlcnRleE5hbWVzTGVuZ3RoLCAvLy9cbiAgICAgICAgICAgIHZlcnRleCA9IFZlcnRleC5mcm9tTmFtZUFuZEluZGV4KG5hbWUsIGluZGV4KTtcblxuICAgICAgdGhpcy5zZXRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSwgdmVydGV4KTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIHJldHVybiB2ZXJ0ZXg7XG4gIH1cblxuICByZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSkge1xuICAgIGNvbnN0IHZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIGlmICghdmVydGV4UHJlc2VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpO1xuXG4gICAgdmVydGV4LmZvckVhY2hJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgoKGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ID0gdmVydGV4OyAgLy8vXG5cbiAgICAgIGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXgucmVtb3ZlSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpO1xuICAgIH0pO1xuXG4gICAgdmVydGV4LmZvckVhY2hJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXggPSB2ZXJ0ZXg7ICAvLy9cblxuICAgICAgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgucmVtb3ZlSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kZWxldGVWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICBjb25zdCB2ZXJ0ZXhlcyA9IHRoaXMuZ2V0VmVydGV4ZXMoKSxcbiAgICAgICAgICBkZWxldGVkVmVydGV4ID0gdmVydGV4LCAvLy9cbiAgICAgICAgICBkZWxldGVkVmVydGV4SW5kZXggPSBkZWxldGVkVmVydGV4LmdldEluZGV4KCk7XG5cbiAgICB2ZXJ0ZXhlcy5mb3JFYWNoKCh2ZXJ0ZXgpID0+IHtcbiAgICAgIGNvbnN0IHZlcnRleEluZGV4ID0gdmVydGV4LmdldEluZGV4KCk7XG5cbiAgICAgIGlmICh2ZXJ0ZXhJbmRleCA+IGRlbGV0ZWRWZXJ0ZXhJbmRleCkge1xuICAgICAgICB2ZXJ0ZXguZGVjcmVtZW50SW5kZXgoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZmlsdGVyQ3ljbGljRWRnZXMoKTtcbiAgfVxuXG4gIGFkZEVkZ2UoZWRnZSkge1xuICAgIGNvbnN0IHNvdXJjZVZlcnRleE5hbWUgPSBlZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSxcbiAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gZWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCk7XG5cbiAgICBpZiAoc291cmNlVmVydGV4TmFtZSA9PT0gdGFyZ2V0VmVydGV4TmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZVZlcnRleCA9IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpLFxuICAgICAgICAgIHRhcmdldFZlcnRleCA9IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpLFxuICAgICAgICAgIGVkZ2VQcmVzZW50ID0gc291cmNlVmVydGV4LmlzRWRnZVByZXNlbnRCeVRhcmdldFZlcnRleCh0YXJnZXRWZXJ0ZXgpO1xuXG4gICAgaWYgKGVkZ2VQcmVzZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlVmVydGV4SW5kZXggPSBzb3VyY2VWZXJ0ZXguZ2V0SW5kZXgoKSxcbiAgICAgICAgICB0YXJnZXRWZXJ0ZXhJbmRleCA9IHRhcmdldFZlcnRleC5nZXRJbmRleCgpO1xuXG4gICAgaWYgKHNvdXJjZVZlcnRleEluZGV4ID4gdGFyZ2V0VmVydGV4SW5kZXgpIHtcbiAgICAgIHRoaXMucmVvcmRlclZlcnRleGVzQnlTb3VyY2VWZXJ0ZXhBbmRUYXJnZXRWZXJ0ZXgoc291cmNlVmVydGV4LCB0YXJnZXRWZXJ0ZXgpO1xuICAgIH1cblxuICAgIGNvbnN0IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ID0gc291cmNlVmVydGV4LCAvLy9cbiAgICAgICAgICBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXggPSB0YXJnZXRWZXJ0ZXg7IC8vL1xuXG4gICAgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXguYWRkSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCk7XG5cbiAgICBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXguYWRkSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpO1xuICB9XG5cbiAgYWRkRWRnZXMoZWRnZXMpIHtcbiAgICBlZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB7XG4gICAgICB0aGlzLmFkZEVkZ2UoZWRnZSk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVFZGdlKGVkZ2UsIHJlbW92ZVN0cmFuZGVkVmVydGV4ZXMpIHtcbiAgICBjb25zdCBzb3VyY2VWZXJ0ZXhOYW1lID0gZWRnZS5nZXRTb3VyY2VWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgdGFyZ2V0VmVydGV4TmFtZSA9IGVkZ2UuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpLFxuICAgICAgICAgIHNvdXJjZVZlcnRleCA9IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpLFxuICAgICAgICAgIHRhcmdldFZlcnRleCA9IHRoaXMuYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpLFxuICAgICAgICAgIGVkZ2VQcmVzZW50ID0gc291cmNlVmVydGV4LmlzRWRnZVByZXNlbnRCeVRhcmdldFZlcnRleCh0YXJnZXRWZXJ0ZXgpO1xuXG4gICAgaWYgKCFlZGdlUHJlc2VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNvdXJjZVZlcnRleC5yZW1vdmVJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgodGFyZ2V0VmVydGV4KTtcblxuICAgIHRhcmdldFZlcnRleC5yZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChzb3VyY2VWZXJ0ZXgpO1xuXG4gICAgaWYgKHJlbW92ZVN0cmFuZGVkVmVydGV4ZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZlcnRleFN0cmFuZGVkID0gc291cmNlVmVydGV4LmlzU3RyYW5kZWQoKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleFN0cmFuZGVkID0gdGFyZ2V0VmVydGV4LmlzU3RyYW5kZWQoKTtcblxuICAgICAgaWYgKHNvdXJjZVZlcnRleFN0cmFuZGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlVmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFyZ2V0VmVydGV4U3RyYW5kZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJDeWNsaWNFZGdlcygpO1xuICB9XG5cbiAgcmVtb3ZlRWRnZXMoZWRnZXMsIHJlbW92ZVN0cmFuZGVkVmVydGV4ZXMgPSBmYWxzZSkge1xuICAgIGVkZ2VzLmZvckVhY2goKGVkZ2UpID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlRWRnZShlZGdlLCByZW1vdmVTdHJhbmRlZFZlcnRleGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUFsbEVkZ2VzQW5kVmVydGV4ZXMoKSB7XG4gICAgdGhpcy52ZXJ0ZXhNYXAgPSB7fTtcbiAgfVxuXG4gIHJlb3JkZXJWZXJ0ZXhlc0J5U291cmNlVmVydGV4QW5kVGFyZ2V0VmVydGV4KHNvdXJjZVZlcnRleCwgdGFyZ2V0VmVydGV4KSB7XG4gICAgY29uc3Qgc291cmNlVmVydGV4UmVhY2hhYmxlID0gdGFyZ2V0VmVydGV4LmlzVmVydGV4UmVhY2hhYmxlKHNvdXJjZVZlcnRleCk7XG5cbiAgICBpZiAoc291cmNlVmVydGV4UmVhY2hhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9yd2FyZHNWaXNpdGVkVmVydGV4ZXMgPSB0YXJnZXRWZXJ0ZXgucmV0cmlldmVGb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcygpLFxuICAgICAgICAgIGJhY2t3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcyA9IHNvdXJjZVZlcnRleC5yZXRyaWV2ZUJhY2t3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcygpO1xuXG4gICAgb3JkZXJWZXJ0ZXhlcyhiYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXMpO1xuXG4gICAgb3JkZXJWZXJ0ZXhlcyhmb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlcyk7XG5cbiAgICBjb25zdCB2aXNpdGVkVmVydGV4ZXMgPSBbXG4gICAgICAgICAgICAuLi5iYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXMsXG4gICAgICAgICAgICAuLi5mb3J3YXJkc1Zpc2l0ZWRWZXJ0ZXhlc1xuICAgICAgICAgIF0sXG4gICAgICAgICAgdmlzaXRlZEluZGV4ZXMgPSBpbmRleGVzRnJvbVZlcnRleGVzKHZpc2l0ZWRWZXJ0ZXhlcyk7XG5cbiAgICBvcmRlckluZGV4ZXModmlzaXRlZEluZGV4ZXMpO1xuXG4gICAgdmlzaXRlZFZlcnRleGVzLmZvckVhY2goKHZpc2l0ZWRWZXJ0ZXgsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB2aXNpdGVkSW5kZXggPSB2aXNpdGVkSW5kZXhlc1tpbmRleF07XG5cbiAgICAgIGluZGV4ID0gdmlzaXRlZEluZGV4OyAvLy9cblxuICAgICAgdmlzaXRlZFZlcnRleC5zZXRJbmRleChpbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICBmaWx0ZXJDeWNsaWNFZGdlcygpIHtcbiAgICBjb25zdCBjeWNsaWNFZGdlcyA9IHRoaXMuZ2V0Q3ljbGljRWRnZXMoKSxcbiAgICAgICAgICBlZGdlcyA9IGN5Y2xpY0VkZ2VzOyAgLy8vXG5cbiAgICB0aGlzLnJlbW92ZUVkZ2VzKGVkZ2VzKTtcblxuICAgIHRoaXMuYWRkRWRnZXMoZWRnZXMpO1xuICB9XG5cbiAgc2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUsIHZlcnRleCkge1xuICAgIHRoaXMudmVydGV4TWFwW3ZlcnRleE5hbWVdID0gdmVydGV4O1xuICB9XG5cbiAgZGVsZXRlVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy52ZXJ0ZXhNYXBbdmVydGV4TmFtZV07XG4gIH1cblxuICBzdGF0aWMgZnJvbU5vdGhpbmcoKSB7XG4gICAgY29uc3QgdmVydGV4TWFwID0ge30sXG4gICAgICAgICAgZGlyZWN0ZWRHcmFwaCA9IG5ldyBEaXJlY3RlZEdyYXBoKHZlcnRleE1hcCk7XG4gICAgXG4gICAgcmV0dXJuIGRpcmVjdGVkR3JhcGg7ICAgIFxuICB9XG59XG4iLCJSZWFjdC5jcmVhdGVFbGVtZW50Il0sIm5hbWVzIjpbIkRpcmVjdGVkR3JhcGgiLCJmaXJzdCIsImFycmF5VXRpbGl0aWVzIiwidmVydGV4TWFwIiwiZ2V0VmVydGV4TmFwIiwiZ2V0VmVydGV4ZXMiLCJ2ZXJ0ZXhNYXBWYWx1ZXMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJ2ZXJ0ZXhlcyIsImdldFZlcnRleE5hbWVzIiwidmVydGV4TWFwS2V5cyIsImtleXMiLCJ2ZXJ0ZXhOYW1lcyIsImdldE9yZGVyZWRWZXJ0ZXhOYW1lcyIsIm9yZGVyVmVydGV4ZXMiLCJvcmRlcmVkVmVydGV4ZXMiLCJvcmRlcmVkVmVydGV4TmFtZXMiLCJ2ZXJ0ZXhOYW1lc0Zyb21WZXJ0ZXhlcyIsImdldFZlcnRleEJ5VmVydGV4TmFtZSIsInZlcnRleE5hbWUiLCJ2ZXJ0ZXhQcmVzZW50IiwiaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lIiwidmVydGV4IiwiZ2V0RWRnZXNCeVNvdXJjZVZlcnRleE5hbWUiLCJzb3VyY2VWZXJ0ZXhOYW1lIiwiZWRnZXMiLCJzb3VyY2VWZXJ0ZXgiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhlcyIsImdldEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleGVzIiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXMiLCJ0YXJnZXRWZXJ0ZXhOYW1lcyIsImZvckVhY2giLCJ0YXJnZXRWZXJ0ZXhOYW1lIiwiZWRnZSIsIkVkZ2UiLCJmcm9tU291cmNlVmVydGV4TmFtZUFuZFRhcmdldFZlcnRleE5hbWUiLCJwdXNoIiwiZ2V0RWRnZXNCeVRhcmdldFZlcnRleE5hbWUiLCJ0YXJnZXRWZXJ0ZXgiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleGVzIiwiZ2V0SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhlcyIsImltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJzb3VyY2VWZXJ0ZXhOYW1lcyIsImdldEZpcnN0Q3ljbGUiLCJmaXJzdEN5Y2xlIiwiY3ljbGVzUHJlc2VudCIsImFyZUN5Y2xlc1ByZXNlbnQiLCJjeWNsaWNFZGdlcyIsImdldEN5Y2xpY0VkZ2VzIiwiZmlyc3RDeWNsaWNFZGdlIiwiZ2V0U291cmNlVmVydGV4TmFtZSIsImdldFRhcmdldFZlcnRleE5hbWUiLCJmb3J3YXJkc0RlcHRoRmlyc3RTZWFyY2giLCJwcmVkZWNlc3NvclZlcnRleGVzIiwidGVybWluYXRlIiwiY3ljbGUiLCJDeWNsZSIsImZyb21Tb3VyY2VWZXJ0ZXhBbmRQcmVkZWNlc3NvclZlcnRleGVzIiwic291cmNlVmVydGV4SW5kZXgiLCJnZXRJbmRleCIsImZvckVhY2hJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJ0YXJnZXRWZXJ0ZXhJbmRleCIsImdldE5hbWUiLCJjeWNsaWNFZGdlIiwic29tZSIsImN5Y2xpY0VkZ2VQcmVzZW50Iiwic29tZUltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImlzRWRnZVByZXNlbnQiLCJlZGdlUHJlc2VudCIsImlzRWRnZVByZXNlbnRCeVRhcmdldFZlcnRleCIsInZlcnRleE5hbWVzSW5jbHVkZXNWZXJ0ZXhOYW1lIiwiaW5jbHVkZXMiLCJhZGRWZXJ0ZXhCeVZlcnRleE5hbWUiLCJ2ZXJ0ZXhOYW1lc0xlbmd0aCIsImxlbmd0aCIsIm5hbWUiLCJpbmRleCIsIlZlcnRleCIsImZyb21OYW1lQW5kSW5kZXgiLCJzZXRWZXJ0ZXhCeVZlcnRleE5hbWUiLCJyZW1vdmVWZXJ0ZXhCeVZlcnRleE5hbWUiLCJpbW1lZGlhdGVTdWNjZXNzVmVydGV4IiwiaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJyZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsImZvckVhY2hJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsInJlbW92ZUltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImRlbGV0ZVZlcnRleEJ5VmVydGV4TmFtZSIsImRlbGV0ZWRWZXJ0ZXgiLCJkZWxldGVkVmVydGV4SW5kZXgiLCJ2ZXJ0ZXhJbmRleCIsImRlY3JlbWVudEluZGV4IiwiZmlsdGVyQ3ljbGljRWRnZXMiLCJhZGRFZGdlIiwicmVvcmRlclZlcnRleGVzQnlTb3VyY2VWZXJ0ZXhBbmRUYXJnZXRWZXJ0ZXgiLCJhZGRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJhZGRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsImFkZEVkZ2VzIiwicmVtb3ZlRWRnZSIsInJlbW92ZVN0cmFuZGVkVmVydGV4ZXMiLCJzb3VyY2VWZXJ0ZXhTdHJhbmRlZCIsImlzU3RyYW5kZWQiLCJ0YXJnZXRWZXJ0ZXhTdHJhbmRlZCIsInJlbW92ZUVkZ2VzIiwicmVtb3ZlQWxsRWRnZXNBbmRWZXJ0ZXhlcyIsInNvdXJjZVZlcnRleFJlYWNoYWJsZSIsImlzVmVydGV4UmVhY2hhYmxlIiwiZm9yd2FyZHNWaXNpdGVkVmVydGV4ZXMiLCJyZXRyaWV2ZUZvcndhcmRzVmlzaXRlZFZlcnRleGVzIiwiYmFja3dhcmRzVmlzaXRlZFZlcnRleGVzIiwicmV0cmlldmVCYWNrd2FyZHNWaXNpdGVkVmVydGV4ZXMiLCJ2aXNpdGVkVmVydGV4ZXMiLCJ2aXNpdGVkSW5kZXhlcyIsImluZGV4ZXNGcm9tVmVydGV4ZXMiLCJvcmRlckluZGV4ZXMiLCJ2aXNpdGVkVmVydGV4IiwidmlzaXRlZEluZGV4Iiwic2V0SW5kZXgiLCJmcm9tTm90aGluZyIsImRpcmVjdGVkR3JhcGgiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBYXFCQTs7O3lCQVhVOzJEQUVkOzREQUNDOzZEQUNDO3FCQUUrQjt1QkFDSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdkQsSUFBTSxBQUFFQyxRQUFVQywwQkFBVkQ7QUFFTyxJQUFBLEFBQU1ELDhCQUFOO2FBQU1BLGNBQ1BHLFNBQVM7Z0NBREZIO1FBRWpCLElBQUksQ0FBQ0csWUFBWUE7O2tCQUZBSDs7WUFLbkJJLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0Q7WUFDZDs7O1lBRUFFLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxJQUFNQyxrQkFBa0JDLE9B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