occam-verify-cli 0.0.1234 → 0.0.1236

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.
@@ -8,22 +8,19 @@ import verifyMixins from "../mixins/statement/verify";
8
8
  import combinatorVerifier from "../verifier/combinator";
9
9
  import StatementPartialContext from "../context/partial/statement";
10
10
 
11
+ import { nodeQuery } from "../utilities/query";
11
12
  import { domAssigned } from "../dom";
12
13
  import { unifyStatement } from "../utilities/unification";
13
- import { nodeQuery, nodesQuery } from "../utilities/query";
14
14
  import { STATEMENT_META_TYPE_NAME } from "../metaTypeNames";
15
- import { definedAssertionFromStatement, subproofAssertionFromStatement, containedAssertionFromStatement } from "../utilities/verification";
15
+ import { definedAssertionFromStatement, subproofAssertionFromStatement } from "../utilities/verification";
16
16
 
17
17
  const { match, backwardsSome } = arrayUtilities;
18
18
 
19
- const statementTermNodesQuery = nodesQuery("/statement//term"),
20
- statementFrameNodesQuery = nodesQuery("/statement//frame"),
21
- premiseStatementNodeQuery = nodeQuery("/premise/statement"),
19
+ const premiseStatementNodeQuery = nodeQuery("/premise/statement"),
22
20
  proofStepStatementNodeQuery = nodeQuery("/proofStep/statement"),
23
21
  conclusionStatementNodeQuery = nodeQuery("/conclusion/statement"),
24
22
  consequentStatementNodeQuery = nodeQuery("/consequent/statement"),
25
- suppositionStatementNodeQuery = nodeQuery("/supposition/statement"),
26
- containedAssertionStatementNodeQuery = nodeQuery("/containedAssertion/statement");
23
+ suppositionStatementNodeQuery = nodeQuery("/supposition/statement");
27
24
 
28
25
  export default domAssigned(class Statement {
29
26
  constructor(string, node, tokens) {
@@ -51,60 +48,6 @@ export default domAssigned(class Statement {
51
48
  return equalTo;
52
49
  }
53
50
 
54
- isTermContained(term, context) {
55
- let termContained;
56
-
57
- const termString = term.getString(),
58
- statementString = this.string; ///
59
-
60
- context.trace(`Is the '${termString}' term contained in the '${statementString}' statement...`);
61
-
62
- const termNode = term.getNode(),
63
- statementNode = this.node,
64
- statementTermNodes = statementTermNodesQuery(statementNode);
65
-
66
- termContained = statementTermNodes.some((statementTermNode) => { ///
67
- const termNodeMatchesStatementVariableNode = termNode.match(statementTermNode);
68
-
69
- if (termNodeMatchesStatementVariableNode) {
70
- return true;
71
- }
72
- });
73
-
74
- if (termContained) {
75
- context.debug(`...the '${termString}' term is contained in the '${statementString}' statement.`);
76
- }
77
-
78
- return termContained;
79
- }
80
-
81
- isFrameContained(frame, context) {
82
- let frameContained;
83
-
84
- const frameString = frame.getString(),
85
- statementString = this.string; ///
86
-
87
- context.trace(`Is the '${frameString}' frame contained in the '${statementString}' statement...`);
88
-
89
- const frameNode = frame.getNode(),
90
- statementNode = this.node,
91
- statementFrameNodes = statementFrameNodesQuery(statementNode);
92
-
93
- frameContained = statementFrameNodes.some((statementFrameNode) => { ///
94
- const frameNodeMatchesStatementMetavariableNode = frameNode.match(statementFrameNode);
95
-
96
- if (frameNodeMatchesStatementMetavariableNode) {
97
- return true;
98
- }
99
- });
100
-
101
- if (frameContained) {
102
- context.debug(`...the '${frameString}' frame is contained in the '${statementString}' statement.`);
103
- }
104
-
105
- return frameContained;
106
- }
107
-
108
51
  matchStatementNode(statementNode) {
109
52
  const statementNodeMatches = this.node.match(statementNode);
110
53
 
@@ -170,25 +113,16 @@ export default domAssigned(class Statement {
170
113
  const context = specificContext, ///
171
114
  statement = this; ///
172
115
 
173
- const definedAssertion = definedAssertionFromStatement(statement, context),
174
- containedAssertion = containedAssertionFromStatement(statement, context);
116
+ const definedAssertion = definedAssertionFromStatement(statement, context);
175
117
 
176
- if ((definedAssertion !== null) || (containedAssertion !== null)) {
118
+ if (definedAssertion !== null) {
177
119
  const statementString = this.string;
178
120
 
179
121
  specificContext.trace(`Unifying the '${statementString}' statement independently...`);
180
122
 
181
- if (definedAssertion !== null) {
182
- const definedAssertionUnifiedIndependently = definedAssertion.unifyIndependently(substitutions, context);
183
-
184
- unifiedIndependently = definedAssertionUnifiedIndependently; ///
185
- }
123
+ const definedAssertionUnifiedIndependently = definedAssertion.unifyIndependently(substitutions, context);
186
124
 
187
- if (containedAssertion !== null) {
188
- const containedAssertionUnifiedIndependently = containedAssertion.unifyIndependently(substitutions, context);
189
-
190
- unifiedIndependently = containedAssertionUnifiedIndependently; ///
191
- }
125
+ unifiedIndependently = definedAssertionUnifiedIndependently; ///
192
126
 
193
127
  if (unifiedIndependently) {
194
128
  specificContext.debug(`...unified the '${statementString}' statement independently.`);
@@ -382,14 +316,6 @@ export default domAssigned(class Statement {
382
316
 
383
317
  return statement;
384
318
  }
385
-
386
- static fromContainedAssertionNode(containedAssertionNode, context) {
387
- const containedAssertionStatementNode = containedAssertionStatementNodeQuery(containedAssertionNode),
388
- statementNode = containedAssertionStatementNode, ///
389
- statement = statementFromStatementNode(statementNode, context);
390
-
391
- return statement;
392
- }
393
319
  });
394
320
 
395
321
  function statementFromStatementNode(statementNode, context) {
@@ -217,20 +217,11 @@ export default domAssigned(class Supposition {
217
217
 
218
218
  static fromSuppositionNode(suppositionNode, fileContext) {
219
219
  const { Statement, ProcedureCall } = dom,
220
+ node = suppositionNode, ///
221
+ string = fileContext.nodeAsString(node),
220
222
  statement = Statement.fromSuppositionNode(suppositionNode, fileContext),
221
- procedureCall = ProcedureCall.fromSuppositionNode(suppositionNode, fileContext);
222
-
223
- let string;
224
-
225
- if (statement !== null) {
226
- string = statement.getString();
227
- }
228
-
229
- if (procedureCall !== null) {
230
- string = procedureCall.getString();
231
- }
232
-
233
- const supposition = new Supposition(string, statement, procedureCall);
223
+ procedureCall = ProcedureCall.fromSuppositionNode(suppositionNode, fileContext),
224
+ supposition = new Supposition(string, statement, procedureCall);
234
225
 
235
226
  return supposition
236
227
  }
package/src/dom/term.js CHANGED
@@ -17,8 +17,7 @@ const { filter, compress } = arrayUtilities;
17
17
 
18
18
  const variableNodesQuery = nodesQuery("//variable"),
19
19
  termVariableNodeQuery = nodeQuery("/term/variable!"),
20
- definedAssertionTermNodeQuery = nodeQuery("/definedAssertion/term"),
21
- containedAssertionTermNodeQuery = nodeQuery("/containedAssertion/term");
20
+ definedAssertionTermNodeQuery = nodeQuery("/definedAssertion/term");
22
21
 
23
22
  export default domAssigned(class Term {
24
23
  constructor(string, node, type) {
@@ -299,25 +298,4 @@ export default domAssigned(class Term {
299
298
 
300
299
  return term;
301
300
  }
302
-
303
- static fromContainedAssertionNode(containedAssertionNode, context) {
304
- let term = null;
305
-
306
- const containedAssertionTermNode = containedAssertionTermNodeQuery(containedAssertionNode);
307
-
308
- if (containedAssertionTermNode !== null) {
309
- const termNode = containedAssertionTermNode, ///
310
- termVariableNode = termVariableNodeQuery(termNode);
311
-
312
- if (termVariableNode !== null) {
313
- const node = termNode, ///
314
- string = context.nodeAsString(node),
315
- type = null;
316
-
317
- term = new Term(string, node, type);
318
- }
319
- }
320
-
321
- return term;
322
- }
323
301
  });
package/src/index.js CHANGED
@@ -35,7 +35,6 @@ import TypeAssertion from "./dom/assertion/type";
35
35
  import TypeDeclaration from "./dom/declaration/type";
36
36
  import DefinedAssertion from "./dom/assertion/defined";
37
37
  import SubproofAssertion from "./dom/assertion/subproof";
38
- import ContainedAssertion from "./dom/assertion/contained";
39
38
  import VariableDeclaration from "./dom/declaration/variable";
40
39
  import CombinatorDeclaration from "./dom/declaration/combinator";
41
40
  import ConstructorDeclaration from "./dom/declaration/constructor";
@@ -7,8 +7,7 @@ import { equalityFromStatement,
7
7
  metavariableFromStatement,
8
8
  typeAssertionFromStatement,
9
9
  definedAssertionFromStatement,
10
- subproofAssertionFromStatement,
11
- containedAssertionFromStatement } from "../../utilities/verification";
10
+ subproofAssertionFromStatement } from "../../utilities/verification";
12
11
 
13
12
  function verifyAsMetavariable(statement, assignments, stated, context) {
14
13
  let verifiedAsMetavariable = false;
@@ -120,28 +119,6 @@ function verifyAsDefinedAssertion(statement, assignments, stated, context) {
120
119
  return verifiedAsDefinedAssertion;
121
120
  }
122
121
 
123
- function verifyAsContainedAssertion(statement, assignments, stated, context) {
124
- let verifiedAsContainedAssertion = false;
125
-
126
- const containedAssertion = containedAssertionFromStatement(statement, context);
127
-
128
- if (containedAssertion !== null) {
129
- const statementString = statement.getString();
130
-
131
- context.trace(`Verifying the '${statementString}' statement as a contained assertion...`);
132
-
133
- const containedAssertionVerified = containedAssertion.verify(assignments, stated, context);
134
-
135
- verifiedAsContainedAssertion = containedAssertionVerified; ///
136
-
137
- if (verifiedAsContainedAssertion) {
138
- context.debug(`...verified the '${statementString}' statement as a contained assertion.`);
139
- }
140
- }
141
-
142
- return verifiedAsContainedAssertion;
143
- }
144
-
145
122
  function verifyAsSubproofAssertion(statement, assignments, stated, context) {
146
123
  let verifiedAsSubproofAssertion = false;
147
124
 
@@ -199,7 +176,6 @@ const verifyMixins = [
199
176
  verifyAsTypeAssertion,
200
177
  verifyAsDefinedAssertion,
201
178
  verifyAsSubproofAssertion,
202
- verifyAsContainedAssertion,
203
179
  unifyWithBracketedCombinator,
204
180
  unifyWithCombinators
205
181
  ];
@@ -73,16 +73,6 @@ export function subproofAssertionFromStatement(statement, context) {
73
73
  return subproofAssertion;
74
74
  }
75
75
 
76
- export function containedAssertionFromStatement(statement, context) {
77
- context = contextFromStatement(statement, context); ///
78
-
79
- const { ContainedAssertion } = dom,
80
- statementNode = statement.getNode(),
81
- containedAssertion = ContainedAssertion.fromStatementNode(statementNode, context);
82
-
83
- return containedAssertion;
84
- }
85
-
86
76
  function contextFromFrame(frame, context) {
87
77
  const frameTokens = frame.getTokens(),
88
78
  tokens = frameTokens, ///
@@ -1,287 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return _default;
9
- }
10
- });
11
- var _dom = /*#__PURE__*/ _interop_require_wildcard(require("../../dom"));
12
- var _local = /*#__PURE__*/ _interop_require_default(require("../../context/local"));
13
- var _query = require("../../utilities/query");
14
- var _assertion = require("../../utilities/assertion");
15
- var _substitutions = require("../../utilities/substitutions");
16
- function _class_call_check(instance, Constructor) {
17
- if (!(instance instanceof Constructor)) {
18
- throw new TypeError("Cannot call a class as a function");
19
- }
20
- }
21
- function _defineProperties(target, props) {
22
- for(var i = 0; i < props.length; i++){
23
- var descriptor = props[i];
24
- descriptor.enumerable = descriptor.enumerable || false;
25
- descriptor.configurable = true;
26
- if ("value" in descriptor) descriptor.writable = true;
27
- Object.defineProperty(target, descriptor.key, descriptor);
28
- }
29
- }
30
- function _create_class(Constructor, protoProps, staticProps) {
31
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
32
- if (staticProps) _defineProperties(Constructor, staticProps);
33
- return Constructor;
34
- }
35
- function _define_property(obj, key, value) {
36
- if (key in obj) {
37
- Object.defineProperty(obj, key, {
38
- value: value,
39
- enumerable: true,
40
- configurable: true,
41
- writable: true
42
- });
43
- } else {
44
- obj[key] = value;
45
- }
46
- return obj;
47
- }
48
- function _interop_require_default(obj) {
49
- return obj && obj.__esModule ? obj : {
50
- default: obj
51
- };
52
- }
53
- function _getRequireWildcardCache(nodeInterop) {
54
- if (typeof WeakMap !== "function") return null;
55
- var cacheBabelInterop = new WeakMap();
56
- var cacheNodeInterop = new WeakMap();
57
- return (_getRequireWildcardCache = function(nodeInterop) {
58
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
59
- })(nodeInterop);
60
- }
61
- function _interop_require_wildcard(obj, nodeInterop) {
62
- if (!nodeInterop && obj && obj.__esModule) {
63
- return obj;
64
- }
65
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
66
- return {
67
- default: obj
68
- };
69
- }
70
- var cache = _getRequireWildcardCache(nodeInterop);
71
- if (cache && cache.has(obj)) {
72
- return cache.get(obj);
73
- }
74
- var newObj = {
75
- __proto__: null
76
- };
77
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
78
- for(var key in obj){
79
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
80
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
81
- if (desc && (desc.get || desc.set)) {
82
- Object.defineProperty(newObj, key, desc);
83
- } else {
84
- newObj[key] = obj[key];
85
- }
86
- }
87
- }
88
- newObj.default = obj;
89
- if (cache) {
90
- cache.set(obj, newObj);
91
- }
92
- return newObj;
93
- }
94
- var _ContainedAssertion;
95
- var containedAssertionNodeQuery = (0, _query.nodeQuery)("/statement/containedAssertion");
96
- var _default = (0, _dom.domAssigned)((_ContainedAssertion = /*#__PURE__*/ function() {
97
- function ContainedAssertion(string, node, tokens, term, frame, negated, statement) {
98
- _class_call_check(this, ContainedAssertion);
99
- this.string = string;
100
- this.node = node;
101
- this.tokens = tokens;
102
- this.term = term;
103
- this.frame = frame;
104
- this.negated = negated;
105
- this.statement = statement;
106
- }
107
- _create_class(ContainedAssertion, [
108
- {
109
- key: "getString",
110
- value: function getString() {
111
- return this.string;
112
- }
113
- },
114
- {
115
- key: "getNode",
116
- value: function getNode() {
117
- return this.node;
118
- }
119
- },
120
- {
121
- key: "getTokens",
122
- value: function getTokens() {
123
- return this.tokens;
124
- }
125
- },
126
- {
127
- key: "getTerm",
128
- value: function getTerm() {
129
- return this.term;
130
- }
131
- },
132
- {
133
- key: "getFrame",
134
- value: function getFrame() {
135
- return this.frame;
136
- }
137
- },
138
- {
139
- key: "isNegated",
140
- value: function isNegated() {
141
- return this.negated;
142
- }
143
- },
144
- {
145
- key: "getStatement",
146
- value: function getStatement() {
147
- return this.statement;
148
- }
149
- },
150
- {
151
- key: "verify",
152
- value: function verify(assignments, stated, context) {
153
- var verified = false;
154
- var containedAssertionString = this.string; ///
155
- context.trace("Verifying the '".concat(containedAssertionString, "' contained assertion..."));
156
- var termVerified = false, frameVerified = false, statementVerified = false;
157
- if (this.term !== null) {
158
- termVerified = this.term.verify(context, function() {
159
- var verifiedAhead = true;
160
- return verifiedAhead;
161
- });
162
- }
163
- if (this.frame !== null) {
164
- frameVerified = this.verifyFrame(this.frame, assignments, stated, context);
165
- }
166
- if (this.statement !== null) {
167
- statementVerified = this.verifyStatement(this.statement, assignments, stated, context);
168
- }
169
- if (termVerified || frameVerified || statementVerified) {
170
- var verifiedWhenStated = false, verifiedWhenDerived = false;
171
- if (stated) {
172
- verifiedWhenStated = this.verifyWhenStated(assignments, context);
173
- } else {
174
- verifiedWhenDerived = this.verifyWhenDerived(context);
175
- }
176
- if (verifiedWhenStated || verifiedWhenDerived) {
177
- verified = true;
178
- }
179
- }
180
- if (verified) {
181
- context.debug("...verified the '".concat(containedAssertionString, "' contained assertion."));
182
- }
183
- return verified;
184
- }
185
- },
186
- {
187
- key: "verifyFrame",
188
- value: function verifyFrame(frame, assignments, stated, context) {
189
- stated = true; ///
190
- assignments = null; ///
191
- var frameVerified = frame.verify(assignments, stated, context);
192
- return frameVerified;
193
- }
194
- },
195
- {
196
- key: "verifyStatement",
197
- value: function verifyStatement(statement, assignments, stated, context) {
198
- stated = true; ///
199
- assignments = null; ///
200
- var statementVerified = statement.verify(assignments, stated, context);
201
- return statementVerified;
202
- }
203
- },
204
- {
205
- key: "verifyWhenStated",
206
- value: function verifyWhenStated(assignments, context) {
207
- var verifiedWhenStated;
208
- var containedAssertionString = this.string; ///
209
- context.trace("Verifying the '".concat(containedAssertionString, "' stated contained assertion..."));
210
- verifiedWhenStated = true;
211
- if (verifiedWhenStated) {
212
- context.debug("...verified the '".concat(containedAssertionString, "' stated contained assertion."));
213
- }
214
- return verifiedWhenStated;
215
- }
216
- },
217
- {
218
- key: "verifyWhenDerived",
219
- value: function verifyWhenDerived1(context) {
220
- var verifiedWhenDerived;
221
- var containedAssertionString = this.string; ///
222
- context.trace("Verifying the '".concat(containedAssertionString, "' derived contained assertion..."));
223
- verifiedWhenDerived = verifyWhenDerived(this.term, this.frame, this.statement, this.negated, context);
224
- if (verifiedWhenDerived) {
225
- context.debug("...verified the '".concat(containedAssertionString, "' derived contained assertion."));
226
- }
227
- return verifiedWhenDerived;
228
- }
229
- },
230
- {
231
- key: "unifyIndependently",
232
- value: function unifyIndependently(substitutions, context) {
233
- var unifiedIndependently;
234
- var containedAssertionString = this.string; ///
235
- context.trace("Unifying the '".concat(containedAssertionString, "' contained assertion independently..."));
236
- var localContext = _local.default.fromContextAndTokens(context, this.tokens);
237
- context = localContext; ///
238
- var term = (0, _substitutions.termFromTermAndSubstitutions)(this.term, substitutions, context), frame = (0, _substitutions.frameFromFrameAndSubstitutions)(this.frame, substitutions, context), statement = (0, _substitutions.statementFromStatementAndSubstitutions)(this.statement, substitutions, context), verifiedWhenDerived = verifyWhenDerived(term, frame, statement, this.negated, context);
239
- unifiedIndependently = verifiedWhenDerived; ///
240
- if (unifiedIndependently) {
241
- context.debug("...unified the '".concat(containedAssertionString, "' contained assertion independently."));
242
- }
243
- return unifiedIndependently;
244
- }
245
- }
246
- ], [
247
- {
248
- key: "fromStatementNode",
249
- value: function fromStatementNode(statementNode, context) {
250
- var containedAssertion = null;
251
- var containedAssertionNode = containedAssertionNodeQuery(statementNode);
252
- if (containedAssertionNode !== null) {
253
- var Term = _dom.default.Term, Frame = _dom.default.Frame, Statement = _dom.default.Statement, node = containedAssertionNode, string = context.nodeAsString(node), tokens = context.nodeAsTokens(node), term = Term.fromContainedAssertionNode(containedAssertionNode, context), frame = Frame.fromContainedAssertionNode(containedAssertionNode, context), statement = Statement.fromContainedAssertionNode(containedAssertionNode, context), containedAssertionNegated = (0, _assertion.isAssertionNegated)(containedAssertionNode), negated = containedAssertionNegated; ///
254
- containedAssertion = new ContainedAssertion(string, node, tokens, term, frame, negated, statement);
255
- }
256
- return containedAssertion;
257
- }
258
- }
259
- ]);
260
- return ContainedAssertion;
261
- }(), _define_property(_ContainedAssertion, "name", "ContainedAssertion"), _ContainedAssertion));
262
- function verifyWhenDerived(term, frame, statement, negated, context) {
263
- var verifiedWhenDerived = false;
264
- if (statement !== null) {
265
- if (term !== null) {
266
- var termContained = statement.isTermContained(term, context);
267
- if (!negated && termContained) {
268
- verifiedWhenDerived = true;
269
- }
270
- if (negated && !termContained) {
271
- verifiedWhenDerived = true;
272
- }
273
- }
274
- if (frame !== null) {
275
- var frameContained = statement.isFrameContained(frame, context);
276
- if (!negated && frameContained) {
277
- verifiedWhenDerived = true;
278
- }
279
- if (negated && !frameContained) {
280
- verifiedWhenDerived = true;
281
- }
282
- }
283
- }
284
- return verifiedWhenDerived;
285
- }
286
-
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb20vYXNzZXJ0aW9uL2NvbnRhaW5lZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IGRvbSBmcm9tIFwiLi4vLi4vZG9tXCI7XG5pbXBvcnQgTG9jYWxDb250ZXh0IGZyb20gXCIuLi8uLi9jb250ZXh0L2xvY2FsXCI7XG5cbmltcG9ydCB7IG5vZGVRdWVyeSB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvcXVlcnlcIjtcbmltcG9ydCB7IGRvbUFzc2lnbmVkIH0gZnJvbSBcIi4uLy4uL2RvbVwiO1xuaW1wb3J0IHsgaXNBc3NlcnRpb25OZWdhdGVkIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9hc3NlcnRpb25cIjtcbmltcG9ydCB7IHRlcm1Gcm9tVGVybUFuZFN1YnN0aXR1dGlvbnMsIGZyYW1lRnJvbUZyYW1lQW5kU3Vic3RpdHV0aW9ucywgc3RhdGVtZW50RnJvbVN0YXRlbWVudEFuZFN1YnN0aXR1dGlvbnMgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL3N1YnN0aXR1dGlvbnNcIjtcblxuY29uc3QgY29udGFpbmVkQXNzZXJ0aW9uTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3N0YXRlbWVudC9jb250YWluZWRBc3NlcnRpb25cIik7XG5cbmV4cG9ydCBkZWZhdWx0IGRvbUFzc2lnbmVkKGNsYXNzIENvbnRhaW5lZEFzc2VydGlvbiB7XG4gIGNvbnN0cnVjdG9yKHN0cmluZywgbm9kZSwgdG9rZW5zLCB0ZXJtLCBmcmFtZSwgbmVnYXRlZCwgc3RhdGVtZW50KSB7XG4gICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB0aGlzLnRva2VucyA9IHRva2VucztcbiAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcbiAgICB0aGlzLm5lZ2F0ZWQgPSBuZWdhdGVkO1xuICAgIHRoaXMuc3RhdGVtZW50ID0gc3RhdGVtZW50O1xuICB9XG5cbiAgZ2V0U3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmluZztcbiAgfVxuXG4gIGdldE5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgfVxuXG4gIGdldFRva2VucygpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gIH1cblxuICBnZXRUZXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBnZXRGcmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mcmFtZTtcbiAgfVxuXG4gIGlzTmVnYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5uZWdhdGVkO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudDtcbiAgfVxuXG4gIHZlcmlmeShhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gICAgbGV0IHZlcmlmaWVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb250YWluZWRBc3NlcnRpb25TdHJpbmcgPSB0aGlzLnN0cmluZzsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke2NvbnRhaW5lZEFzc2VydGlvblN0cmluZ30nIGNvbnRhaW5lZCBhc3NlcnRpb24uLi5gKTtcblxuICAgIGxldCB0ZXJtVmVyaWZpZWQgPSBmYWxzZSxcbiAgICAgICAgZnJhbWVWZXJpZmllZCA9IGZhbHNlLFxuICAgICAgICBzdGF0ZW1lbnRWZXJpZmllZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMudGVybSAhPT0gbnVsbCkge1xuICAgICAgdGVybVZlcmlmaWVkID0gdGhpcy50ZXJtLnZlcmlmeShjb250ZXh0LCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZlcmlmaWVkQWhlYWQgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB2ZXJpZmllZEFoZWFkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZnJhbWUgIT09IG51bGwpIHtcbiAgICAgIGZyYW1lVmVyaWZpZWQgPSB0aGlzLnZlcmlmeUZyYW1lKHRoaXMuZnJhbWUsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlbWVudCAhPT0gbnVsbCkge1xuICAgICAgc3RhdGVtZW50VmVyaWZpZWQgPSB0aGlzLnZlcmlmeVN0YXRlbWVudCh0aGlzLnN0YXRlbWVudCwgYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKHRlcm1WZXJpZmllZCB8fCBmcmFtZVZlcmlmaWVkIHx8IHN0YXRlbWVudFZlcmlmaWVkKSB7XG4gICAgICBsZXQgdmVyaWZpZWRXaGVuU3RhdGVkID0gZmFsc2UsXG4gICAgICAgICAgdmVyaWZpZWRXaGVuRGVyaXZlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoc3RhdGVkKSB7XG4gICAgICAgIHZlcmlmaWVkV2hlblN0YXRlZCA9IHRoaXMudmVyaWZ5V2hlblN0YXRlZChhc3NpZ25tZW50cywgY29udGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJpZmllZFdoZW5EZXJpdmVkID0gdGhpcy52ZXJpZnlXaGVuRGVyaXZlZChjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZlcmlmaWVkV2hlblN0YXRlZCB8fCB2ZXJpZmllZFdoZW5EZXJpdmVkKSB7XG4gICAgICAgIHZlcmlmaWVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVyaWZpZWQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtjb250YWluZWRBc3NlcnRpb25TdHJpbmd9JyBjb250YWluZWQgYXNzZXJ0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJpZmllZDtcbiAgfVxuXG4gIHZlcmlmeUZyYW1lKGZyYW1lLCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gICAgc3RhdGVkID0gdHJ1ZTsgIC8vL1xuXG4gICAgYXNzaWdubWVudHMgPSBudWxsOyAvLy9cblxuICAgIGNvbnN0IGZyYW1lVmVyaWZpZWQgPSBmcmFtZS52ZXJpZnkoYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZnJhbWVWZXJpZmllZDtcbiAgfVxuXG4gIHZlcmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgICBzdGF0ZWQgPSB0cnVlOyAgLy8vXG5cbiAgICBhc3NpZ25tZW50cyA9IG51bGw7IC8vL1xuXG4gICAgY29uc3Qgc3RhdGVtZW50VmVyaWZpZWQgPSBzdGF0ZW1lbnQudmVyaWZ5KGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkO1xuICB9XG5cbiAgdmVyaWZ5V2hlblN0YXRlZChhc3NpZ25tZW50cywgY29udGV4dCkge1xuICAgIGxldCB2ZXJpZmllZFdoZW5TdGF0ZWQ7XG5cbiAgICBjb25zdCBjb250YWluZWRBc3NlcnRpb25TdHJpbmcgPSB0aGlzLnN0cmluZzsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke2NvbnRhaW5lZEFzc2VydGlvblN0cmluZ30nIHN0YXRlZCBjb250YWluZWQgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICB2ZXJpZmllZFdoZW5TdGF0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKHZlcmlmaWVkV2hlblN0YXRlZCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke2NvbnRhaW5lZEFzc2VydGlvblN0cmluZ30nIHN0YXRlZCBjb250YWluZWQgYXNzZXJ0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiB2ZXJpZmllZFdoZW5TdGF0ZWQ7XG4gIH1cblxuICB2ZXJpZnlXaGVuRGVyaXZlZChjb250ZXh0KSB7XG4gICAgbGV0IHZlcmlmaWVkV2hlbkRlcml2ZWQ7XG5cbiAgICBjb25zdCBjb250YWluZWRBc3NlcnRpb25TdHJpbmcgPSB0aGlzLnN0cmluZzsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke2NvbnRhaW5lZEFzc2VydGlvblN0cmluZ30nIGRlcml2ZWQgY29udGFpbmVkIGFzc2VydGlvbi4uLmApO1xuXG4gICAgdmVyaWZpZWRXaGVuRGVyaXZlZCA9IHZlcmlmeVdoZW5EZXJpdmVkKHRoaXMudGVybSwgdGhpcy5mcmFtZSwgdGhpcy5zdGF0ZW1lbnQsIHRoaXMubmVnYXRlZCwgY29udGV4dCk7XG5cbiAgICBpZiAodmVyaWZpZWRXaGVuRGVyaXZlZCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke2NvbnRhaW5lZEFzc2VydGlvblN0cmluZ30nIGRlcml2ZWQgY29udGFpbmVkIGFzc2VydGlvbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmVyaWZpZWRXaGVuRGVyaXZlZDtcbiAgfVxuXG4gIHVuaWZ5SW5kZXBlbmRlbnRseShzdWJzdGl0dXRpb25zLCBjb250ZXh0KSB7XG4gICAgbGV0IHVuaWZpZWRJbmRlcGVuZGVudGx5O1xuXG4gICAgY29uc3QgY29udGFpbmVkQXNzZXJ0aW9uU3RyaW5nID0gdGhpcy5zdHJpbmc7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2NvbnRhaW5lZEFzc2VydGlvblN0cmluZ30nIGNvbnRhaW5lZCBhc3NlcnRpb24gaW5kZXBlbmRlbnRseS4uLmApO1xuXG4gICAgY29uc3QgbG9jYWxDb250ZXh0ID0gTG9jYWxDb250ZXh0LmZyb21Db250ZXh0QW5kVG9rZW5zKGNvbnRleHQsIHRoaXMudG9rZW5zKTtcblxuICAgIGNvbnRleHQgPSBsb2NhbENvbnRleHQ7IC8vL1xuXG4gICAgY29uc3QgdGVybSA9IHRlcm1Gcm9tVGVybUFuZFN1YnN0aXR1dGlvbnModGhpcy50ZXJtLCBzdWJzdGl0dXRpb25zLCBjb250ZXh0KSxcbiAgICAgICAgICBmcmFtZSA9IGZyYW1lRnJvbUZyYW1lQW5kU3Vic3RpdHV0aW9ucyh0aGlzLmZyYW1lLCBzdWJzdGl0dXRpb25zLCBjb250ZXh0KSxcbiAgICAgICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRGcm9tU3RhdGVtZW50QW5kU3Vic3RpdHV0aW9ucyh0aGlzLnN0YXRlbWVudCwgc3Vic3RpdHV0aW9ucywgY29udGV4dCksXG4gICAgICAgICAgdmVyaWZpZWRXaGVuRGVyaXZlZCA9IHZlcmlmeVdoZW5EZXJpdmVkKHRlcm0sIGZyYW1lLCBzdGF0ZW1lbnQsIHRoaXMubmVnYXRlZCwgY29udGV4dCk7XG5cbiAgICB1bmlmaWVkSW5kZXBlbmRlbnRseSA9IHZlcmlmaWVkV2hlbkRlcml2ZWQ7IC8vL1xuXG4gICAgaWYgKHVuaWZpZWRJbmRlcGVuZGVudGx5KSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtjb250YWluZWRBc3NlcnRpb25TdHJpbmd9JyBjb250YWluZWQgYXNzZXJ0aW9uIGluZGVwZW5kZW50bHkuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaWZpZWRJbmRlcGVuZGVudGx5O1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIkNvbnRhaW5lZEFzc2VydGlvblwiO1xuXG4gIHN0YXRpYyBmcm9tU3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbnRhaW5lZEFzc2VydGlvbiA9IG51bGw7XG5cbiAgICBjb25zdCBjb250YWluZWRBc3NlcnRpb25Ob2RlID0gY29udGFpbmVkQXNzZXJ0aW9uTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpO1xuXG4gICAgaWYgKGNvbnRhaW5lZEFzc2VydGlvbk5vZGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHsgVGVybSwgRnJhbWUsIFN0YXRlbWVudCB9ID0gZG9tLFxuICAgICAgICAgICAgbm9kZSA9IGNvbnRhaW5lZEFzc2VydGlvbk5vZGUsICAvLy9cbiAgICAgICAgICAgIHN0cmluZyA9IGNvbnRleHQubm9kZUFzU3RyaW5nKG5vZGUpLFxuICAgICAgICAgICAgdG9rZW5zID0gY29udGV4dC5ub2RlQXNUb2tlbnMobm9kZSksXG4gICAgICAgICAgICB0ZXJtID0gVGVybS5mcm9tQ29udGFpbmVkQXNzZXJ0aW9uTm9kZShjb250YWluZWRBc3NlcnRpb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgIGZyYW1lID0gRnJhbWUuZnJvbUNvbnRhaW5lZEFzc2VydGlvbk5vZGUoY29udGFpbmVkQXNzZXJ0aW9uTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICBzdGF0ZW1lbnQgPSBTdGF0ZW1lbnQuZnJvbUNvbnRhaW5lZEFzc2VydGlvbk5vZGUoY29udGFpbmVkQXNzZXJ0aW9uTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICBjb250YWluZWRBc3NlcnRpb25OZWdhdGVkID0gaXNBc3NlcnRpb25OZWdhdGVkKGNvbnRhaW5lZEFzc2VydGlvbk5vZGUpLFxuICAgICAgICAgICAgbmVnYXRlZCA9IGNvbnRhaW5lZEFzc2VydGlvbk5lZ2F0ZWQ7ICAvLy9cblxuICAgICAgY29udGFpbmVkQXNzZXJ0aW9uID0gbmV3IENvbnRhaW5lZEFzc2VydGlvbihzdHJpbmcsIG5vZGUsIHRva2VucywgdGVybSwgZnJhbWUsIG5lZ2F0ZWQsIHN0YXRlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRhaW5lZEFzc2VydGlvbjtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHZlcmlmeVdoZW5EZXJpdmVkKHRlcm0sIGZyYW1lLCBzdGF0ZW1lbnQsIG5lZ2F0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZlcmlmaWVkV2hlbkRlcml2ZWQgPSBmYWxzZTtcblxuICBpZiAoc3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKHRlcm0gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlcm1Db250YWluZWQgPSBzdGF0ZW1lbnQuaXNUZXJtQ29udGFpbmVkKHRlcm0sIGNvbnRleHQpO1xuXG4gICAgICBpZiAoIW5lZ2F0ZWQgJiYgdGVybUNvbnRhaW5lZCkge1xuICAgICAgICB2ZXJpZmllZFdoZW5EZXJpdmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5lZ2F0ZWQgJiYgIXRlcm1Db250YWluZWQpIHtcbiAgICAgICAgdmVyaWZpZWRXaGVuRGVyaXZlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYW1lICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBmcmFtZUNvbnRhaW5lZCA9IHN0YXRlbWVudC5pc0ZyYW1lQ29udGFpbmVkKGZyYW1lLCBjb250ZXh0KTtcblxuICAgICAgaWYgKCFuZWdhdGVkICYmIGZyYW1lQ29udGFpbmVkKSB7XG4gICAgICAgIHZlcmlmaWVkV2hlbkRlcml2ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVnYXRlZCAmJiAhZnJhbWVDb250YWluZWQpIHtcbiAgICAgICAgdmVyaWZpZWRXaGVuRGVyaXZlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZlcmlmaWVkV2hlbkRlcml2ZWQ7XG59XG4iXSwibmFtZXMiOlsiY29udGFpbmVkQXNzZXJ0aW9uTm9kZVF1ZXJ5Iiwibm9kZVF1ZXJ5IiwiZG9tQXNzaWduZWQiLCJDb250YWluZWRBc3NlcnRpb24iLCJzdHJpbmciLCJub2RlIiwidG9rZW5zIiwidGVybSIsImZyYW1lIiwibmVnYXRlZCIsInN0YXRlbWVudCIsImdldFN0cmluZyIsImdldE5vZGUiLCJnZXRUb2tlbnMiLCJnZXRUZXJtIiwiZ2V0RnJhbWUiLCJpc05lZ2F0ZWQiLCJnZXRTdGF0ZW1lbnQiLCJ2ZXJpZnkiLCJhc3NpZ25tZW50cyIsInN0YXRlZCIsImNvbnRleHQiLCJ2ZXJpZmllZCIsImNvbnRhaW5lZEFzc2VydGlvblN0cmluZyIsInRyYWNlIiwidGVybVZlcmlmaWVkIiwiZnJhbWVWZXJpZmllZCIsInN0YXRlbWVudFZlcmlmaWVkIiwidmVyaWZpZWRBaGVhZCIsInZlcmlmeUZyYW1lIiwidmVyaWZ5U3RhdGVtZW50IiwidmVyaWZpZWRXaGVuU3RhdGVkIiwidmVyaWZpZWRXaGVuRGVyaXZlZCIsInZlcmlmeVdoZW5TdGF0ZWQiLCJ2ZXJpZnlXaGVuRGVyaXZlZCIsImRlYnVnIiwidW5pZnlJbmRlcGVuZGVudGx5Iiwic3Vic3RpdHV0aW9ucyIsInVuaWZpZWRJbmRlcGVuZGVudGx5IiwibG9jYWxDb250ZXh0IiwiTG9jYWxDb250ZXh0IiwiZnJvbUNvbnRleHRBbmRUb2tlbnMiLCJ0ZXJtRnJvbVRlcm1BbmRTdWJzdGl0dXRpb25zIiwiZnJhbWVGcm9tRnJhbWVBbmRTdWJzdGl0dXRpb25zIiwic3RhdGVtZW50RnJvbVN0YXRlbWVudEFuZFN1YnN0aXR1dGlvbnMiLCJmcm9tU3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudE5vZGUiLCJjb250YWluZWRBc3NlcnRpb24iLCJjb250YWluZWRBc3NlcnRpb25Ob2RlIiwiVGVybSIsImRvbSIsIkZyYW1lIiwiU3RhdGVtZW50Iiwibm9kZUFzU3RyaW5nIiwibm9kZUFzVG9rZW5zIiwiZnJvbUNvbnRhaW5lZEFzc2VydGlvbk5vZGUiLCJjb250YWluZWRBc3NlcnRpb25OZWdhdGVkIiwiaXNBc3NlcnRpb25OZWdhdGVkIiwibmFtZSIsInRlcm1Db250YWluZWQiLCJpc1Rlcm1Db250YWluZWQiLCJmcmFtZUNvbnRhaW5lZCIsImlzRnJhbWVDb250YWluZWQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVlBOzs7ZUFBQTs7OzJEQVZnQjs0REFDUztxQkFFQzt5QkFFUzs2QkFDa0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXJILElBQU1BLDhCQUE4QkMsSUFBQUEsZ0JBQVMsRUFBQztJQUU5QyxXQUFlQyxJQUFBQSxnQkFBVyx1Q0FBQzthQUFNQyxtQkFDbkJDLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFQyxPQUFPLEVBQUVDLFNBQVM7Z0NB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