occam-verify-cli 0.0.924 → 0.0.925

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/lib/mixins/nodesVerifier/metaLevel.js +2 -2
  2. package/lib/premise.js +6 -6
  3. package/lib/verifier/nodes/intrinsicLevel.js +3 -3
  4. package/lib/verifier/nodes/intrinsicLevelAgainstMetaLevel.js +3 -3
  5. package/lib/verifier/nodes/metaLevel.js +16 -16
  6. package/lib/verify/assertion/contained.js +91 -0
  7. package/lib/verify/assertion/defined.js +114 -0
  8. package/lib/verify/assertion/subproof.js +65 -0
  9. package/lib/verify/assertion/type.js +112 -0
  10. package/lib/verify/declaration.js +2 -5
  11. package/lib/verify/equality.js +3 -3
  12. package/lib/verify/metastatement.js +1 -2
  13. package/lib/verify/statement/qualified.js +2 -5
  14. package/lib/verify/statement.js +30 -14
  15. package/package.json +2 -2
  16. package/src/mixins/nodesVerifier/metaLevel.js +1 -1
  17. package/src/premise.js +6 -6
  18. package/src/verifier/nodes/intrinsicLevel.js +2 -2
  19. package/src/verifier/nodes/intrinsicLevelAgainstMetaLevel.js +3 -3
  20. package/src/verifier/nodes/metaLevel.js +18 -19
  21. package/src/verify/{containedAssertion.js → assertion/contained.js} +3 -3
  22. package/src/verify/{definedAssertion.js → assertion/defined.js} +5 -6
  23. package/src/verify/assertion/subproof.js +77 -0
  24. package/src/verify/{typeAssertion.js → assertion/type.js} +15 -15
  25. package/src/verify/declaration.js +1 -5
  26. package/src/verify/equality.js +2 -2
  27. package/src/verify/metastatement.js +0 -1
  28. package/src/verify/statement/qualified.js +1 -5
  29. package/src/verify/statement.js +36 -9
  30. package/lib/verify/containedAssertion.js +0 -91
  31. package/lib/verify/definedAssertion.js +0 -115
  32. package/lib/verify/typeAssertion.js +0 -112
@@ -119,10 +119,7 @@ function verifyQualifiedStatementAAgainstReference(qualifiedStatementNode, subst
119
119
  var metavariableNode = metavariableNodeQuery(qualifiedStatementNode), metavariableString = localContext.nodeAsString(metavariableNode), metavariablePresent = localContext.isMetavariablePresentByMetavariableNode(metavariableNode), qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
120
120
  localContext.trace("Verifying the '".concat(qualifiedStatementString, "' qualified statement against the '").concat(metavariableString, "' reference..."), qualifiedStatementNode);
121
121
  if (metavariablePresent) {
122
- var statementNode = statementNodeQuery(qualifiedStatementNode), metavariableVerifiedAgainstStatement = (0, _metavariableAgainstStatement.default)(metavariableNode, statementNode, substitutions, function() {
123
- var verifiedAhead = true;
124
- return verifiedAhead;
125
- });
122
+ var statementNode = statementNodeQuery(qualifiedStatementNode), metavariableVerifiedAgainstStatement = (0, _metavariableAgainstStatement.default)(metavariableNodeA, statementNodeB, substitutionNode, substitutions, localContextA, localContextB, verifyAhead);
126
123
  qualifiedStatementVerifiedAgainstReference = metavariableVerifiedAgainstStatement; ///
127
124
  }
128
125
  if (qualifiedStatementVerifiedAgainstReference) {
@@ -151,4 +148,4 @@ function verifyStatement(statementNode, assignments, derived, localContext) {
151
148
  return statementVerified;
152
149
  }
153
150
 
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJpZnkvc3RhdGVtZW50L3F1YWxpZmllZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgbm9kZVF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9xdWVyeVwiO1xuaW1wb3J0IHsgdmVyaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSwgdmVyaWZ5U3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uIH0gZnJvbSBcIi4uLy4uL3ZlcmlmeS9zdGF0ZW1lbnRcIjtcblxuY29uc3Qgc3RhdGVtZW50Tm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3F1YWxpZmllZFN0YXRlbWVudC9zdGF0ZW1lbnQhXCIpLFxuICAgICAgbWV0YXZhcmlhYmxlTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3F1YWxpZmllZFN0YXRlbWVudC9yZWZlcmVuY2UhL21ldGF2YXJpYWJsZSFcIik7XG5cbmltcG9ydCB2ZXJpZnlNZXRhdmFyaWFibGVBZ2FpbnN0U3RhdGVtZW50IGZyb20gXCIuLi8uLi92ZXJpZnkvbWV0YXZhcmlhYmxlQWdhaW5zdFN0YXRlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnQocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgYXNzaWdubWVudHMsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWQ7XG5cbiAgY29uc3QgcXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7cXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nfScgcXVhbGlmaWVkIHN0YXRlbWVudC4uLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gIGNvbnN0IHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEZ1bmN0aW9ucyA9IFtcbiAgICB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFJ1bGUsXG4gICAgdmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RBeGlvbSxcbiAgICB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdExlbW1hLFxuICAgIHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0VGhlb3JlbSxcbiAgICB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdENvbmplY3R1cmUsXG4gICAgdmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RSZWZlcmVuY2VcbiAgXTtcblxuICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZCA9IHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEZ1bmN0aW9ucy5zb21lKCh2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRGdW5jdGlvbikgPT4geyAgLy8vXG4gICAgY29uc3QgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWQgPSB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRGdW5jdGlvbihxdWFsaWZpZWRTdGF0ZW1lbnROb2RlLCBzdWJzdGl0dXRpb25zLCBsb2NhbENvbnRleHQpO1xuXG4gICAgaWYgKHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGNvbnN0IGRlcml2ZWQgPSBmYWxzZSxcbiAgICAgICAgICBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIHN0YXRlbWVudFZlcmlmaWVkID0gdmVyaWZ5U3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQpO1xuXG4gICAgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWQgPSBzdGF0ZW1lbnRWZXJpZmllZDsgLy8vXG4gIH1cblxuICBpZiAocXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWQpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50LmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFJ1bGUocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSdWxlID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgcnVsZSA9IGxvY2FsQ29udGV4dC5maW5kUnVsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICBpZiAocnVsZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgcnVsZS4uLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgY29uc3QgcnVsZU1hdGNoZXNTdGF0ZW1lbnQgPSBydWxlLm1hdGNoU3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSdWxlID0gcnVsZU1hdGNoZXNTdGF0ZW1lbnQ7ICAvLy9cblxuICAgIGlmIChxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSdWxlKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIHJ1bGUuYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdFJ1bGU7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0QXhpb20ocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RBeGlvbSA9IGZhbHNlO1xuXG4gIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGVOb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgIGF4aW9tID0gbG9jYWxDb250ZXh0LmZpbmRBeGlvbUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICBpZiAoYXhpb20gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgcXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIGF4aW9tLi4uYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG5cbiAgICBjb25zdCBheGlvbU1hdGNoZXNTdGF0ZW1lbnQgPSBheGlvbS5tYXRjaFN0YXRlbWVudChzdGF0ZW1lbnROb2RlLCBsb2NhbENvbnRleHQpO1xuXG4gICAgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0QXhpb20gPSBheGlvbU1hdGNoZXNTdGF0ZW1lbnQ7IC8vL1xuXG4gICAgaWYgKHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdEF4aW9tKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIGF4aW9tLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RBeGlvbTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RMZW1tYShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlLCBzdWJzdGl0dXRpb25zLCBsb2NhbENvbnRleHQpIHtcbiAgbGV0IHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdExlbW1hID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgbGVtbWEgPSBsb2NhbENvbnRleHQuZmluZExlbW1hQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gIGlmIChsZW1tYSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbGVtbWEuLi5gLCBxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IGxlbW1hTWF0Y2hlc1N0YXRlbWVudCA9IGxlbW1hLm1hdGNoU3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RMZW1tYSA9IGxlbW1hTWF0Y2hlc1N0YXRlbWVudDsgLy8vXG5cbiAgICBpZiAocXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0TGVtbWEpIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbGVtbWEuYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdExlbW1hO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFRoZW9yZW0ocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RUaGVvcmVtID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgdGhlb3JlbSA9IGxvY2FsQ29udGV4dC5maW5kVGhlb3JlbUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICBpZiAodGhlb3JlbSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgdGhlb3JlbS4uLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgY29uc3QgdGhlb3JlbU1hdGNoZXNTdGF0ZW1lbnQgPSB0aGVvcmVtLm1hdGNoU3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RUaGVvcmVtID0gdGhlb3JlbU1hdGNoZXNTdGF0ZW1lbnQ7IC8vL1xuXG4gICAgaWYgKHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdFRoZW9yZW0pIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgdGhlb3JlbS5gLCBxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0VGhlb3JlbTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RDb25qZWN0dXJlKHF1YWxpZmllZFN0YXRlbWVudE5vZGUsIHN1YnN0aXR1dGlvbnMsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29uamVjdHVyZSA9IGZhbHNlO1xuXG4gIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGVOb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgIGNvbmplY3R1cmUgPSBsb2NhbENvbnRleHQuZmluZENvbmplY3R1cmVCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgaWYgKGNvbmplY3R1cmUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgcXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIGNvbmplY3R1cmUuLi5gLCBxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IGNvbmplY3R1cmVNYXRjaGVzU3RhdGVtZW50ID0gY29uamVjdHVyZS5tYXRjaFN0YXRlbWVudChzdGF0ZW1lbnROb2RlLCBsb2NhbENvbnRleHQpO1xuXG4gICAgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29uamVjdHVyZSA9IGNvbmplY3R1cmVNYXRjaGVzU3RhdGVtZW50OyAvLy9cblxuICAgIGlmIChxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb25qZWN0dXJlKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIGNvbmplY3R1cmUuYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbmplY3R1cmU7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0UmVmZXJlbmNlKHF1YWxpZmllZFN0YXRlbWVudE5vZGUsIHN1YnN0aXR1dGlvbnMsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0UmVmZXJlbmNlID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgbWV0YXZhcmlhYmxlUHJlc2VudCA9IGxvY2FsQ29udGV4dC5pc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgIHF1YWxpZmllZFN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG5cbiAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgcmVmZXJlbmNlLi4uYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKG1ldGF2YXJpYWJsZVByZXNlbnQpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVZlcmlmaWVkQWdhaW5zdFN0YXRlbWVudCA9IHZlcmlmeU1ldGF2YXJpYWJsZUFnYWluc3RTdGF0ZW1lbnQobWV0YXZhcmlhYmxlTm9kZSwgc3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyaWZpZWRBaGVhZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiB2ZXJpZmllZEFoZWFkO1xuICAgICAgICAgIH0pO1xuXG4gICAgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0UmVmZXJlbmNlID0gbWV0YXZhcmlhYmxlVmVyaWZpZWRBZ2FpbnN0U3RhdGVtZW50OyAvLy9cbiAgfVxuXG4gIGlmIChxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSZWZlcmVuY2UpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIHJlZmVyZW5jZS5gLCBxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcbiAgfVxuXG4gIHJldHVybiBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSZWZlcmVuY2U7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudChzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZDtcblxuICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHN0YXRlbWVudE5vZGUpO1xuXG4gIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQuLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICBjb25zdCB2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbnMgPSBbXG4gICAgdmVyaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSxcbiAgICB2ZXJpZnlTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb25cbiAgXTtcblxuICB2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbnMuc29tZSgodmVyaWZ5U3RhdGVtZW50RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnRWZXJpZmllZCA9IHZlcmlmeVN0YXRlbWVudEZ1bmN0aW9uKHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHN0YXRlbWVudFZlcmlmaWVkID0gdHJ1ZTsgLy8vXG5cbiAgaWYgKHN0YXRlbWVudFZlcmlmaWVkKSB7XG4gICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50LmAsIHN0YXRlbWVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkO1xufVxuIl0sIm5hbWVzIjpbInZlcmlmeVF1YWxpZmllZFN0YXRlbWVudCIsInN0YXRlbWVudE5vZGVRdWVyeSIsIm5vZGVRdWVyeSIsIm1ldGF2YXJpYWJsZU5vZGVRdWVyeSIsInF1YWxpZmllZFN0YXRlbWVudE5vZGUiLCJzdWJzdGl0dXRpb25zIiwiYXNzaWdubWVudHMiLCJsb2NhbENvbnRleHQiLCJxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZCIsInF1YWxpZmllZFN0YXRlbWVudFN0cmluZyIsIm5vZGVBc1N0cmluZyIsInRyYWNlIiwidmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50RnVuY3Rpb25zIiwidmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RSdWxlIiwidmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RBeGlvbSIsInZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0TGVtbWEiLCJ2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFRoZW9yZW0iLCJ2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdENvbmplY3R1cmUiLCJ2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFJlZmVyZW5jZSIsInNvbWUiLCJ2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRGdW5jdGlvbiIsImRlcml2ZWQiLCJzdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50VmVyaWZpZWQiLCJ2ZXJpZnlTdGF0ZW1lbnQiLCJkZWJ1ZyIsInF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdFJ1bGUiLCJtZXRhdmFyaWFibGVOb2RlIiwicnVsZSIsImZpbmRSdWxlQnlNZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlU3RyaW5nIiwicnVsZU1hdGNoZXNTdGF0ZW1lbnQiLCJtYXRjaFN0YXRlbWVudCIsInF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdEF4aW9tIiwiYXhpb20iLCJmaW5kQXhpb21CeU1ldGF2YXJpYWJsZU5vZGUiLCJheGlvbU1hdGNoZXNTdGF0ZW1lbnQiLCJxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RMZW1tYSIsImxlbW1hIiwiZmluZExlbW1hQnlNZXRhdmFyaWFibGVOb2RlIiwibGVtbWFNYXRjaGVzU3RhdGVtZW50IiwicXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0VGhlb3JlbSIsInRoZW9yZW0iLCJmaW5kVGhlb3JlbUJ5TWV0YXZhcmlhYmxlTm9kZSIsInRoZW9yZW1NYXRjaGVzU3RhdGVtZW50IiwicXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29uamVjdHVyZSIsImNvbmplY3R1cmUiLCJmaW5kQ29uamVjdHVyZUJ5TWV0YXZhcmlhYmxlTm9kZSIsImNvbmplY3R1cmVNYXRjaGVzU3RhdGVtZW50IiwicXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0UmVmZXJlbmNlIiwibWV0YXZhcmlhYmxlUHJlc2VudCIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZVZlcmlmaWVkQWdhaW5zdFN0YXRlbWVudCIsInZlcmlmeU1ldGF2YXJpYWJsZUFnYWluc3RTdGF0ZW1lbnQiLCJ2ZXJpZmllZEFoZWFkIiwic3RhdGVtZW50U3RyaW5nIiwidmVyaWZ5U3RhdGVtZW50RnVuY3Rpb25zIiwidmVyaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSIsInZlcmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsInZlcmlmeVN0YXRlbWVudEZ1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFVQTs7O2VBQXdCQTs7O3FCQVJFO3lCQUNnRDttRkFLM0I7Ozs7OztBQUgvQyxJQUFNQyxxQkFBcUJDLElBQUFBLGdCQUFTLEVBQUMsbUNBQy9CQyx3QkFBd0JELElBQUFBLGdCQUFTLEVBQUM7QUFJekIsU0FBU0YseUJBQXlCSSxzQkFBc0IsRUFBRUMsYUFBYSxFQUFFQyxXQUFXLEVBQUVDLFlBQVk7SUFDL0csSUFBSUM7SUFFSixJQUFNQywyQkFBMkJGLGFBQWFHLFlBQVksQ0FBQ047SUFFM0RHLGFBQWFJLEtBQUssQ0FBQyxBQUFDLGtCQUEwQyxPQUF6QkYsMEJBQXlCLDZCQUEyQkw7SUFFekYsSUFBTVEsb0NBQW9DO1FBQ3hDQztRQUNBQztRQUNBQztRQUNBQztRQUNBQztRQUNBQztLQUNEO0lBRURWLDZCQUE2Qkksa0NBQWtDTyxJQUFJLENBQUMsU0FBQ0M7UUFDbkUsSUFBTVosNkJBQTZCWSxpQ0FBaUNoQix3QkFBd0JDLGVBQWVFO1FBRTNHLElBQUlDLDRCQUE0QjtZQUM5QixPQUFPO1FBQ1Q7SUFDRjtJQUVBLElBQUlBLDRCQUE0QjtRQUM5QixJQUFNYSxVQUFVLE9BQ1ZDLGdCQUFnQnJCLG1CQUFtQkcseUJBQ25DbUIsb0JBQW9CQyxnQkFBZ0JGLGVBQWVoQixhQUFhZSxTQUFTZDtRQUUvRUMsNkJBQTZCZSxtQkFBbUIsR0FBRztJQUNyRDtJQUVBLElBQUlmLDRCQUE0QjtRQUM5QkQsYUFBYWtCLEtBQUssQ0FBQyxBQUFDLG9CQUE0QyxPQUF6QmhCLDBCQUF5QiwyQkFBeUJMO0lBQzNGO0lBRUEsT0FBT0k7QUFDVDtBQUVBLFNBQVNLLHFDQUFxQ1Qsc0JBQXNCLEVBQUVDLGFBQWEsRUFBRUUsWUFBWTtJQUMvRixJQUFJbUIsd0NBQXdDO0lBRTVDLElBQU1DLG1CQUFtQnhCLHNCQUFzQkMseUJBQ3pDd0IsT0FBT3JCLGFBQWFzQiwwQkFBMEIsQ0FBQ0Y7SUFFckQsSUFBSUMsU0FBUyxNQUFNO1FBQ2pCLElBQU1OLGdCQUFnQnJCLG1CQUFtQkcseUJBQ25DMEIscUJBQXFCdkIsYUFBYUcsWUFBWSxDQUFDaUIsbUJBQy9DbEIsMkJBQTJCRixhQUFhRyxZQUFZLENBQUNOO1FBRTNERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBK0VtQixPQUE5RHJCLDBCQUF5Qix1Q0FBd0QsT0FBbkJxQixvQkFBbUIsY0FBWTFCO1FBRWxJLElBQU0yQix1QkFBdUJILEtBQUtJLGNBQWMsQ0FBQ1YsZUFBZWY7UUFFaEVtQix3Q0FBd0NLLHNCQUF1QixHQUFHO1FBRWxFLElBQUlMLHVDQUF1QztZQUN6Q25CLGFBQWFrQixLQUFLLENBQUMsQUFBQyxvQkFBaUZLLE9BQTlEckIsMEJBQXlCLHVDQUF3RCxPQUFuQnFCLG9CQUFtQixZQUFVMUI7UUFDcEk7SUFDRjtJQUVBLE9BQU9zQjtBQUNUO0FBRUEsU0FBU1osc0NBQXNDVixzQkFBc0IsRUFBRUMsYUFBYSxFQUFFRSxZQUFZO0lBQ2hHLElBQUkwQix5Q0FBeUM7SUFFN0MsSUFBTU4sbUJBQW1CeEIsc0JBQXNCQyx5QkFDekM4QixRQUFRM0IsYUFBYTRCLDJCQUEyQixDQUFDUjtJQUV2RCxJQUFJTyxVQUFVLE1BQU07UUFDbEIsSUFBTVosZ0JBQWdCckIsbUJBQW1CRyx5QkFDbkMwQixxQkFBcUJ2QixhQUFhRyxZQUFZLENBQUNpQixtQkFDL0NsQiwyQkFBMkJGLGFBQWFHLFlBQVksQ0FBQ047UUFFM0RHLGFBQWFJLEtBQUssQ0FBQyxBQUFDLGtCQUErRW1CLE9BQTlEckIsMEJBQXlCLHVDQUF3RCxPQUFuQnFCLG9CQUFtQixlQUFhMUI7UUFFbkksSUFBTWdDLHdCQUF3QkYsTUFBTUYsY0FBYyxDQUFDVixlQUFlZjtRQUVsRTBCLHlDQUF5Q0csdUJBQXVCLEdBQUc7UUFFbkUsSUFBSUgsd0NBQXdDO1lBQzFDMUIsYUFBYWtCLEtBQUssQ0FBQyxBQUFDLG9CQUFpRkssT0FBOURyQiwwQkFBeUIsdUNBQXdELE9BQW5CcUIsb0JBQW1CLGFBQVcxQjtRQUNySTtJQUNGO0lBRUEsT0FBTzZCO0FBQ1Q7QUFFQSxTQUFTbEIsc0NBQXNDWCxzQkFBc0IsRUFBRUMsYUFBYSxFQUFFRSxZQUFZO0lBQ2hHLElBQUk4Qix5Q0FBeUM7SUFFN0MsSUFBTVYsbUJBQW1CeEIsc0JBQXNCQyx5QkFDekNrQyxRQUFRL0IsYUFBYWdDLDJCQUEyQixDQUFDWjtJQUV2RCxJQUFJVyxVQUFVLE1BQU07UUFDbEIsSUFBTWhCLGdCQUFnQnJCLG1CQUFtQkcseUJBQ25DMEIscUJBQXFCdkIsYUFBYUcsWUFBWSxDQUFDaUIsbUJBQy9DbEIsMkJBQTJCRixhQUFhRyxZQUFZLENBQUNOO1FBRTNERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBK0VtQixPQUE5RHJCLDBCQUF5Qix1Q0FBd0QsT0FBbkJxQixvQkFBbUIsZUFBYTFCO1FBRW5JLElBQU1vQyx3QkFBd0JGLE1BQU1OLGNBQWMsQ0FBQ1YsZUFBZWY7UUFFbEU4Qix5Q0FBeUNHLHVCQUF1QixHQUFHO1FBRW5FLElBQUlILHdDQUF3QztZQUMxQzlCLGFBQWFrQixLQUFLLENBQUMsQUFBQyxvQkFBaUZLLE9BQTlEckIsMEJBQXlCLHVDQUF3RCxPQUFuQnFCLG9CQUFtQixhQUFXMUI7UUFDckk7SUFDRjtJQUVBLE9BQU9pQztBQUNUO0FBRUEsU0FBU3JCLHdDQUF3Q1osc0JBQXNCLEVBQUVDLGFBQWEsRUFBRUUsWUFBWTtJQUNsRyxJQUFJa0MsMkNBQTJDO0lBRS9DLElBQU1kLG1CQUFtQnhCLHNCQUFzQkMseUJBQ3pDc0MsVUFBVW5DLGFBQWFvQyw2QkFBNkIsQ0FBQ2hCO0lBRTNELElBQUllLFlBQVksTUFBTTtRQUNwQixJQUFNcEIsZ0JBQWdCckIsbUJBQW1CRyx5QkFDbkMwQixxQkFBcUJ2QixhQUFhRyxZQUFZLENBQUNpQixtQkFDL0NsQiwyQkFBMkJGLGFBQWFHLFlBQVksQ0FBQ047UUFFM0RHLGFBQWFJLEtBQUssQ0FBQyxBQUFDLGtCQUErRW1CLE9BQTlEckIsMEJBQXlCLHVDQUF3RCxPQUFuQnFCLG9CQUFtQixpQkFBZTFCO1FBRXJJLElBQU13QywwQkFBMEJGLFFBQVFWLGNBQWMsQ0FBQ1YsZUFBZWY7UUFFdEVrQywyQ0FBMkNHLHlCQUF5QixHQUFHO1FBRXZFLElBQUlILDBDQUEwQztZQUM1Q2xDLGFBQWFrQixLQUFLLENBQUMsQUFBQyxvQkFBaUZLLE9BQTlEckIsMEJBQXlCLHVDQUF3RCxPQUFuQnFCLG9CQUFtQixlQUFhMUI7UUFDdkk7SUFDRjtJQUVBLE9BQU9xQztBQUNUO0FBRUEsU0FBU3hCLDJDQUEyQ2Isc0JBQXNCLEVBQUVDLGFBQWEsRUFBRUUsWUFBWTtJQUNyRyxJQUFJc0MsOENBQThDO0lBRWxELElBQU1sQixtQkFBbUJ4QixzQkFBc0JDLHlCQUN6QzBDLGFBQWF2QyxhQUFhd0MsZ0NBQWdDLENBQUNwQjtJQUVqRSxJQUFJbUIsZUFBZSxNQUFNO1FBQ3ZCLElBQU14QixnQkFBZ0JyQixtQkFBbUJHLHlCQUNuQzBCLHFCQUFxQnZCLGFBQWFHLFlBQVksQ0FBQ2lCLG1CQUMvQ2xCLDJCQUEyQkYsYUFBYUcsWUFBWSxDQUFDTjtRQUUzREcsYUFBYUksS0FBSyxDQUFDLEFBQUMsa0JBQStFbUIsT0FBOURyQiwwQkFBeUIsdUNBQXdELE9BQW5CcUIsb0JBQW1CLG9CQUFrQjFCO1FBRXhJLElBQU00Qyw2QkFBNkJGLFdBQVdkLGNBQWMsQ0FBQ1YsZUFBZWY7UUFFNUVzQyw4Q0FBOENHLDRCQUE0QixHQUFHO1FBRTdFLElBQUlILDZDQUE2QztZQUMvQ3RDLGFBQWFrQixLQUFLLENBQUMsQUFBQyxvQkFBaUZLLE9BQTlEckIsMEJBQXlCLHVDQUF3RCxPQUFuQnFCLG9CQUFtQixrQkFBZ0IxQjtRQUMxSTtJQUNGO0lBRUEsT0FBT3lDO0FBQ1Q7QUFFQSxTQUFTM0IsMENBQTBDZCxzQkFBc0IsRUFBRUMsYUFBYSxFQUFFRSxZQUFZO0lBQ3BHLElBQUkwQyw2Q0FBNkM7SUFFakQsSUFBTXRCLG1CQUFtQnhCLHNCQUFzQkMseUJBQ3pDMEIscUJBQXFCdkIsYUFBYUcsWUFBWSxDQUFDaUIsbUJBQy9DdUIsc0JBQXNCM0MsYUFBYTRDLHVDQUF1QyxDQUFDeEIsbUJBQzNFbEIsMkJBQTJCRixhQUFhRyxZQUFZLENBQUNOO0lBRTNERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBK0VtQixPQUE5RHJCLDBCQUF5Qix1Q0FBd0QsT0FBbkJxQixvQkFBbUIsbUJBQWlCMUI7SUFFdkksSUFBSThDLHFCQUFxQjtRQUN2QixJQUFNNUIsZ0JBQWdCckIsbUJBQW1CRyx5QkFDbkNnRCx1Q0FBdUNDLElBQUFBLHFDQUFrQyxFQUFDMUIsa0JBQWtCTCxlQUFlakIsZUFBZTtZQUN4SCxJQUFNaUQsZ0JBQWdCO1lBRXRCLE9BQU9BO1FBQ1Q7UUFFTkwsNkNBQTZDRyxzQ0FBc0MsR0FBRztJQUN4RjtJQUVBLElBQUlILDRDQUE0QztRQUM5QzFDLGFBQWFrQixLQUFLLENBQUMsQUFBQyxvQkFBaUZLLE9BQTlEckIsMEJBQXlCLHVDQUF3RCxPQUFuQnFCLG9CQUFtQixpQkFBZTFCO0lBQ3pJO0lBRUEsT0FBTzZDO0FBQ1Q7QUFFQSxTQUFTekIsZ0JBQWdCRixhQUFhLEVBQUVoQixXQUFXLEVBQUVlLE9BQU8sRUFBRWQsWUFBWTtJQUN4RSxJQUFJZ0I7SUFFSixJQUFNZ0Msa0JBQWtCaEQsYUFBYUcsWUFBWSxDQUFDWTtJQUVsRGYsYUFBYUksS0FBSyxDQUFDLEFBQUMsa0JBQWlDLE9BQWhCNEMsaUJBQWdCLG1CQUFpQmpDO0lBRXRFLElBQU1rQywyQkFBMkI7UUFDL0JDLG9DQUF5QjtRQUN6QkMseUNBQThCO0tBQy9CO0lBRURGLHlCQUF5QnJDLElBQUksQ0FBQyxTQUFDd0M7UUFDN0IsSUFBTXBDLG9CQUFvQm9DLHdCQUF3QnJDLGVBQWVoQixhQUFhZSxTQUFTZDtRQUV2RixJQUFJZ0IsbUJBQW1CO1lBQ3JCLE9BQU87UUFDVDtJQUNGO0lBRUFBLG9CQUFvQixNQUFNLEdBQUc7SUFFN0IsSUFBSUEsbUJBQW1CO1FBQ3JCaEIsYUFBYWtCLEtBQUssQ0FBQyxBQUFDLG9CQUFtQyxPQUFoQjhCLGlCQUFnQixpQkFBZWpDO0lBQ3hFO0lBRUEsT0FBT0M7QUFDVCJ9
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJpZnkvc3RhdGVtZW50L3F1YWxpZmllZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgbm9kZVF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9xdWVyeVwiO1xuaW1wb3J0IHsgdmVyaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSwgdmVyaWZ5U3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uIH0gZnJvbSBcIi4uLy4uL3ZlcmlmeS9zdGF0ZW1lbnRcIjtcblxuY29uc3Qgc3RhdGVtZW50Tm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3F1YWxpZmllZFN0YXRlbWVudC9zdGF0ZW1lbnQhXCIpLFxuICAgICAgbWV0YXZhcmlhYmxlTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3F1YWxpZmllZFN0YXRlbWVudC9yZWZlcmVuY2UhL21ldGF2YXJpYWJsZSFcIik7XG5cbmltcG9ydCB2ZXJpZnlNZXRhdmFyaWFibGVBZ2FpbnN0U3RhdGVtZW50IGZyb20gXCIuLi8uLi92ZXJpZnkvbWV0YXZhcmlhYmxlQWdhaW5zdFN0YXRlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnQocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgYXNzaWdubWVudHMsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWQ7XG5cbiAgY29uc3QgcXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7cXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nfScgcXVhbGlmaWVkIHN0YXRlbWVudC4uLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gIGNvbnN0IHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEZ1bmN0aW9ucyA9IFtcbiAgICB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFJ1bGUsXG4gICAgdmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RBeGlvbSxcbiAgICB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdExlbW1hLFxuICAgIHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0VGhlb3JlbSxcbiAgICB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdENvbmplY3R1cmUsXG4gICAgdmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RSZWZlcmVuY2VcbiAgXTtcblxuICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZCA9IHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEZ1bmN0aW9ucy5zb21lKCh2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRGdW5jdGlvbikgPT4geyAgLy8vXG4gICAgY29uc3QgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWQgPSB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRGdW5jdGlvbihxdWFsaWZpZWRTdGF0ZW1lbnROb2RlLCBzdWJzdGl0dXRpb25zLCBsb2NhbENvbnRleHQpO1xuXG4gICAgaWYgKHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGNvbnN0IGRlcml2ZWQgPSBmYWxzZSxcbiAgICAgICAgICBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIHN0YXRlbWVudFZlcmlmaWVkID0gdmVyaWZ5U3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQpO1xuXG4gICAgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWQgPSBzdGF0ZW1lbnRWZXJpZmllZDsgLy8vXG4gIH1cblxuICBpZiAocXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWQpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50LmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFJ1bGUocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSdWxlID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgcnVsZSA9IGxvY2FsQ29udGV4dC5maW5kUnVsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICBpZiAocnVsZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgcnVsZS4uLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgY29uc3QgcnVsZU1hdGNoZXNTdGF0ZW1lbnQgPSBydWxlLm1hdGNoU3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSdWxlID0gcnVsZU1hdGNoZXNTdGF0ZW1lbnQ7ICAvLy9cblxuICAgIGlmIChxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSdWxlKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIHJ1bGUuYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdFJ1bGU7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0QXhpb20ocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RBeGlvbSA9IGZhbHNlO1xuXG4gIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGVOb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgIGF4aW9tID0gbG9jYWxDb250ZXh0LmZpbmRBeGlvbUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICBpZiAoYXhpb20gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgcXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIGF4aW9tLi4uYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG5cbiAgICBjb25zdCBheGlvbU1hdGNoZXNTdGF0ZW1lbnQgPSBheGlvbS5tYXRjaFN0YXRlbWVudChzdGF0ZW1lbnROb2RlLCBsb2NhbENvbnRleHQpO1xuXG4gICAgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0QXhpb20gPSBheGlvbU1hdGNoZXNTdGF0ZW1lbnQ7IC8vL1xuXG4gICAgaWYgKHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdEF4aW9tKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIGF4aW9tLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RBeGlvbTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RMZW1tYShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlLCBzdWJzdGl0dXRpb25zLCBsb2NhbENvbnRleHQpIHtcbiAgbGV0IHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdExlbW1hID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgbGVtbWEgPSBsb2NhbENvbnRleHQuZmluZExlbW1hQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gIGlmIChsZW1tYSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbGVtbWEuLi5gLCBxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IGxlbW1hTWF0Y2hlc1N0YXRlbWVudCA9IGxlbW1hLm1hdGNoU3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RMZW1tYSA9IGxlbW1hTWF0Y2hlc1N0YXRlbWVudDsgLy8vXG5cbiAgICBpZiAocXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0TGVtbWEpIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbGVtbWEuYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdExlbW1hO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFRoZW9yZW0ocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSwgc3Vic3RpdHV0aW9ucywgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RUaGVvcmVtID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgdGhlb3JlbSA9IGxvY2FsQ29udGV4dC5maW5kVGhlb3JlbUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICBpZiAodGhlb3JlbSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgdGhlb3JlbS4uLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuXG4gICAgY29uc3QgdGhlb3JlbU1hdGNoZXNTdGF0ZW1lbnQgPSB0aGVvcmVtLm1hdGNoU3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RUaGVvcmVtID0gdGhlb3JlbU1hdGNoZXNTdGF0ZW1lbnQ7IC8vL1xuXG4gICAgaWYgKHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdFRoZW9yZW0pIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgdGhlb3JlbS5gLCBxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0VGhlb3JlbTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RDb25qZWN0dXJlKHF1YWxpZmllZFN0YXRlbWVudE5vZGUsIHN1YnN0aXR1dGlvbnMsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29uamVjdHVyZSA9IGZhbHNlO1xuXG4gIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGVOb2RlUXVlcnkocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSksXG4gICAgICAgIGNvbmplY3R1cmUgPSBsb2NhbENvbnRleHQuZmluZENvbmplY3R1cmVCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgaWYgKGNvbmplY3R1cmUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgICAgcXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIGNvbmplY3R1cmUuLi5gLCBxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IGNvbmplY3R1cmVNYXRjaGVzU3RhdGVtZW50ID0gY29uamVjdHVyZS5tYXRjaFN0YXRlbWVudChzdGF0ZW1lbnROb2RlLCBsb2NhbENvbnRleHQpO1xuXG4gICAgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29uamVjdHVyZSA9IGNvbmplY3R1cmVNYXRjaGVzU3RhdGVtZW50OyAvLy9cblxuICAgIGlmIChxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb25qZWN0dXJlKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtxdWFsaWZpZWRTdGF0ZW1lbnRTdHJpbmd9JyBxdWFsaWZpZWQgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIGNvbmplY3R1cmUuYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbmplY3R1cmU7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0UmVmZXJlbmNlKHF1YWxpZmllZFN0YXRlbWVudE5vZGUsIHN1YnN0aXR1dGlvbnMsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgcXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0UmVmZXJlbmNlID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShxdWFsaWZpZWRTdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgbWV0YXZhcmlhYmxlUHJlc2VudCA9IGxvY2FsQ29udGV4dC5pc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSksXG4gICAgICAgIHF1YWxpZmllZFN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcocXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG5cbiAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgcmVmZXJlbmNlLi4uYCwgcXVhbGlmaWVkU3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKG1ldGF2YXJpYWJsZVByZXNlbnQpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50Tm9kZVF1ZXJ5KHF1YWxpZmllZFN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVZlcmlmaWVkQWdhaW5zdFN0YXRlbWVudCA9IHZlcmlmeU1ldGF2YXJpYWJsZUFnYWluc3RTdGF0ZW1lbnQobWV0YXZhcmlhYmxlTm9kZUEsIHN0YXRlbWVudE5vZGVCLCBzdWJzdGl0dXRpb25Ob2RlLCBzdWJzdGl0dXRpb25zLCBsb2NhbENvbnRleHRBLCBsb2NhbENvbnRleHRCLCB2ZXJpZnlBaGVhZCk7XG5cbiAgICBxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSZWZlcmVuY2UgPSBtZXRhdmFyaWFibGVWZXJpZmllZEFnYWluc3RTdGF0ZW1lbnQ7IC8vL1xuICB9XG5cbiAgaWYgKHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdFJlZmVyZW5jZSkge1xuICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3F1YWxpZmllZFN0YXRlbWVudFN0cmluZ30nIHF1YWxpZmllZCBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgcmVmZXJlbmNlLmAsIHF1YWxpZmllZFN0YXRlbWVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdFJlZmVyZW5jZTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZlcmlmaWVkO1xuXG4gIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudC4uLmAsIHN0YXRlbWVudE5vZGUpO1xuXG4gIGNvbnN0IHZlcmlmeVN0YXRlbWVudEZ1bmN0aW9ucyA9IFtcbiAgICB2ZXJpZnlTdGF0ZW1lbnRBc0VxdWFsaXR5LFxuICAgIHZlcmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvblxuICBdO1xuXG4gIHZlcmlmeVN0YXRlbWVudEZ1bmN0aW9ucy5zb21lKCh2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudFZlcmlmaWVkID0gdmVyaWZ5U3RhdGVtZW50RnVuY3Rpb24oc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50VmVyaWZpZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgc3RhdGVtZW50VmVyaWZpZWQgPSB0cnVlOyAvLy9cblxuICBpZiAoc3RhdGVtZW50VmVyaWZpZWQpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQuYCwgc3RhdGVtZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWQ7XG59XG4iXSwibmFtZXMiOlsidmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50Iiwic3RhdGVtZW50Tm9kZVF1ZXJ5Iiwibm9kZVF1ZXJ5IiwibWV0YXZhcmlhYmxlTm9kZVF1ZXJ5IiwicXVhbGlmaWVkU3RhdGVtZW50Tm9kZSIsInN1YnN0aXR1dGlvbnMiLCJhc3NpZ25tZW50cyIsImxvY2FsQ29udGV4dCIsInF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkIiwicXVhbGlmaWVkU3RhdGVtZW50U3RyaW5nIiwibm9kZUFzU3RyaW5nIiwidHJhY2UiLCJ2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRGdW5jdGlvbnMiLCJ2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdFJ1bGUiLCJ2ZXJpZnlRdWFsaWZpZWRTdGF0ZW1lbnRBQWdhaW5zdEF4aW9tIiwidmVyaWZ5UXVhbGlmaWVkU3RhdGVtZW50QUFnYWluc3RMZW1tYSIsInZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0VGhlb3JlbSIsInZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0Q29uamVjdHVyZSIsInZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEFBZ2FpbnN0UmVmZXJlbmNlIiwic29tZSIsInZlcmlmeVF1YWxpZmllZFN0YXRlbWVudEZ1bmN0aW9uIiwiZGVyaXZlZCIsInN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnRWZXJpZmllZCIsInZlcmlmeVN0YXRlbWVudCIsImRlYnVnIiwicXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0UnVsZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJydWxlIiwiZmluZFJ1bGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVTdHJpbmciLCJydWxlTWF0Y2hlc1N0YXRlbWVudCIsIm1hdGNoU3RhdGVtZW50IiwicXVhbGlmaWVkU3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0QXhpb20iLCJheGlvbSIsImZpbmRBeGlvbUJ5TWV0YXZhcmlhYmxlTm9kZSIsImF4aW9tTWF0Y2hlc1N0YXRlbWVudCIsInF1YWxpZmllZFN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdExlbW1hIiwibGVtbWEiLCJmaW5kTGVtbWFCeU1ldGF2YXJpYWJsZU5vZGUiLCJsZW1tYU1hdGNoZXNTdGF0ZW1lbnQiLCJxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RUaGVvcmVtIiwidGhlb3JlbSIsImZpbmRUaGVvcmVtQnlNZXRhdmFyaWFibGVOb2RlIiwidGhlb3JlbU1hdGNoZXNTdGF0ZW1lbnQiLCJxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb25qZWN0dXJlIiwiY29uamVjdHVyZSIsImZpbmRDb25qZWN0dXJlQnlNZXRhdmFyaWFibGVOb2RlIiwiY29uamVjdHVyZU1hdGNoZXNTdGF0ZW1lbnQiLCJxdWFsaWZpZWRTdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RSZWZlcmVuY2UiLCJtZXRhdmFyaWFibGVQcmVzZW50IiwiaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlVmVyaWZpZWRBZ2FpbnN0U3RhdGVtZW50IiwidmVyaWZ5TWV0YXZhcmlhYmxlQWdhaW5zdFN0YXRlbWVudCIsIm1ldGF2YXJpYWJsZU5vZGVBIiwic3RhdGVtZW50Tm9kZUIiLCJzdWJzdGl0dXRpb25Ob2RlIiwibG9jYWxDb250ZXh0QSIsImxvY2FsQ29udGV4dEIiLCJ2ZXJpZnlBaGVhZCIsInN0YXRlbWVudFN0cmluZyIsInZlcmlmeVN0YXRlbWVudEZ1bmN0aW9ucyIsInZlcmlmeVN0YXRlbWVudEFzRXF1YWxpdHkiLCJ2ZXJpZnlTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24iLCJ2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBVUE7OztlQUF3QkE7OztxQkFSRTt5QkFDZ0Q7bUZBSzNCOzs7Ozs7QUFIL0MsSUFBTUMscUJBQXFCQyxJQUFBQSxnQkFBUyxFQUFDLG1DQUMvQkMsd0JBQXdCRCxJQUFBQSxnQkFBUyxFQUFDO0FBSXpCLFNBQVNGLHlCQUF5Qkksc0JBQXNCLEVBQUVDLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxZQUFZO0lBQy9HLElBQUlDO0lBRUosSUFBTUMsMkJBQTJCRixhQUFhRyxZQUFZLENBQUNOO0lBRTNERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBMEMsT0FBekJGLDBCQUF5Qiw2QkFBMkJMO0lBRXpGLElBQU1RLG9DQUFvQztRQUN4Q0M7UUFDQUM7UUFDQUM7UUFDQUM7UUFDQUM7UUFDQUM7S0FDRDtJQUVEViw2QkFBNkJJLGtDQUFrQ08sSUFBSSxDQUFDLFNBQUNDO1FBQ25FLElBQU1aLDZCQUE2QlksaUNBQWlDaEIsd0JBQXdCQyxlQUFlRTtRQUUzRyxJQUFJQyw0QkFBNEI7WUFDOUIsT0FBTztRQUNUO0lBQ0Y7SUFFQSxJQUFJQSw0QkFBNEI7UUFDOUIsSUFBTWEsVUFBVSxPQUNWQyxnQkFBZ0JyQixtQkFBbUJHLHlCQUNuQ21CLG9CQUFvQkMsZ0JBQWdCRixlQUFlaEIsYUFBYWUsU0FBU2Q7UUFFL0VDLDZCQUE2QmUsbUJBQW1CLEdBQUc7SUFDckQ7SUFFQSxJQUFJZiw0QkFBNEI7UUFDOUJELGFBQWFrQixLQUFLLENBQUMsQUFBQyxvQkFBNEMsT0FBekJoQiwwQkFBeUIsMkJBQXlCTDtJQUMzRjtJQUVB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
@@ -24,9 +24,10 @@ _export(exports, {
24
24
  });
25
25
  var _equality = /*#__PURE__*/ _interop_require_default(require("../verify/equality"));
26
26
  var _judgement = /*#__PURE__*/ _interop_require_default(require("../verify/judgement"));
27
- var _typeAssertion = /*#__PURE__*/ _interop_require_default(require("../verify/typeAssertion"));
28
- var _definedAssertion = /*#__PURE__*/ _interop_require_default(require("./definedAssertion"));
29
- var _containedAssertion = /*#__PURE__*/ _interop_require_default(require("./containedAssertion"));
27
+ var _type = /*#__PURE__*/ _interop_require_default(require("../verify/assertion/type"));
28
+ var _defined = /*#__PURE__*/ _interop_require_default(require("../verify/assertion/defined"));
29
+ var _subproof = /*#__PURE__*/ _interop_require_default(require("../verify/assertion/subproof"));
30
+ var _contained = /*#__PURE__*/ _interop_require_default(require("../verify/assertion/contained"));
30
31
  var _statementAgainstCombinator = /*#__PURE__*/ _interop_require_default(require("../verifier/nodes/statementAgainstCombinator"));
31
32
  var _query = require("../utilities/query");
32
33
  var _metaTypeNames = require("../metaTypeNames");
@@ -35,7 +36,7 @@ function _interop_require_default(obj) {
35
36
  default: obj
36
37
  };
37
38
  }
38
- var equalityNodeQuery = (0, _query.nodeQuery)("/statement/equality!"), judgementNodeQuery = (0, _query.nodeQuery)("/statement/judgement!"), metavariableNodeQuery = (0, _query.nodeQuery)("/statement/metavariable!"), typeAssertionNodeQuery = (0, _query.nodeQuery)("/statement/typeAssertion!"), definedAssertionNodeQuery = (0, _query.nodeQuery)("/statement/definedAssertion!"), containedAssertionNodeQuery = (0, _query.nodeQuery)("/statement/containedAssertion!");
39
+ var equalityNodeQuery = (0, _query.nodeQuery)("/statement/equality!"), judgementNodeQuery = (0, _query.nodeQuery)("/statement/judgement!"), metavariableNodeQuery = (0, _query.nodeQuery)("/statement/metavariable!"), typeAssertionNodeQuery = (0, _query.nodeQuery)("/statement/typeAssertion!"), definedAssertionNodeQuery = (0, _query.nodeQuery)("/statement/definedAssertion!"), subproofAssertionNodeQuery = (0, _query.nodeQuery)("/statement/subproofAssertion!"), containedAssertionNodeQuery = (0, _query.nodeQuery)("/statement/containedAssertion!");
39
40
  function verifyStatement(statementNode, assignments, derived, localContext) {
40
41
  var statementVerified;
41
42
  var statementString = localContext.nodeAsString(statementNode);
@@ -46,6 +47,7 @@ function verifyStatement(statementNode, assignments, derived, localContext) {
46
47
  verifyStatementAsJudgement,
47
48
  verifyStatementAsTypeAssertion,
48
49
  verifyStatementAsDefinedAssertion,
50
+ verifyStatementAsSubproofAssertion,
49
51
  verifyStatementAsContainedAssertion,
50
52
  verifyStatementAgainstCombinators
51
53
  ];
@@ -64,7 +66,7 @@ function verifyStandaloneStatement(statementNode, localContext, verifyAhead) {
64
66
  var standaloneStatementVerified = false;
65
67
  var statementString = localContext.nodeAsString(statementNode);
66
68
  localContext.trace("Verifying the '".concat(statementString, "' standalone statement..."), statementNode);
67
- var derived = false, assignments = [], statementVerified = verifyStatement(statementNode, assignments, derived);
69
+ var derived = false, assignments = [], statementVerified = verifyStatement(statementNode, assignments, derived, localContext);
68
70
  if (statementVerified) {
69
71
  var verifiedAhead = verifyAhead();
70
72
  standaloneStatementVerified = verifiedAhead; ///
@@ -101,10 +103,7 @@ function verifyStatementAsTypeAssertion(statementNode, assignments, derived, loc
101
103
  if (typeAssertionNode !== null) {
102
104
  var statementString = localContext.nodeAsString(statementNode);
103
105
  localContext.trace("Verifying the '".concat(statementString, "' statement as a type assertion..."), statementNode);
104
- var typeAssertionVerified = (0, _typeAssertion.default)(typeAssertionNode, assignments, derived, localContext, function() {
105
- var verifiedAhead = true;
106
- return verifiedAhead;
107
- });
106
+ var typeAssertionVerified = (0, _type.default)(typeAssertionNode, assignments, derived, localContext);
108
107
  statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
109
108
  if (statementVerifiedAsTypeAssertion) {
110
109
  localContext.debug("...verified the '".concat(statementString, "' statement as a type assertion."), statementNode);
@@ -151,7 +150,7 @@ function verifyStatementAsDefinedAssertion(statementNode, assignments, derived,
151
150
  if (definedAssertionNode !== null) {
152
151
  var statementString = localContext.nodeAsString(statementNode);
153
152
  localContext.trace("Verifying the '".concat(statementString, "' statement as a defined assertion..."), statementNode);
154
- var definedAssertionVerified = (0, _definedAssertion.default)(definedAssertionNode, assignments, derived, localContext, function() {
153
+ var definedAssertionVerified = (0, _defined.default)(definedAssertionNode, assignments, derived, localContext, function() {
155
154
  var verifiedAhead = true;
156
155
  return verifiedAhead;
157
156
  });
@@ -162,13 +161,30 @@ function verifyStatementAsDefinedAssertion(statementNode, assignments, derived,
162
161
  }
163
162
  return statementVerifiedAsDefinedAssertion;
164
163
  }
164
+ function verifyStatementAsSubproofAssertion(statementNode, assignments, derived, localContext) {
165
+ var statementVerifiedAsSubproofAssertion = false;
166
+ var subproofAssertionNode = subproofAssertionNodeQuery(statementNode);
167
+ if (subproofAssertionNode !== null) {
168
+ var statementString = localContext.nodeAsString(statementNode);
169
+ localContext.trace("Verifying the '".concat(statementString, "' statement as a subproof assertion..."), statementNode);
170
+ var subproofAssertionVerified = (0, _subproof.default)(subproofAssertionNode, assignments, derived, localContext, function() {
171
+ var verifiedAhead = true;
172
+ return verifiedAhead;
173
+ });
174
+ statementVerifiedAsSubproofAssertion = subproofAssertionVerified; ///
175
+ if (statementVerifiedAsSubproofAssertion) {
176
+ localContext.debug("...verified the '".concat(statementString, "' statement as a defined assertion."), statementNode);
177
+ }
178
+ }
179
+ return statementVerifiedAsSubproofAssertion;
180
+ }
165
181
  function verifyStatementAsContainedAssertion(statementNode, assignments, derived, localContext) {
166
182
  var statementVerifiedAsContainedAssertion = false;
167
183
  var containedAssertionNode = containedAssertionNodeQuery(statementNode);
168
184
  if (containedAssertionNode !== null) {
169
185
  var statementString = localContext.nodeAsString(statementNode);
170
186
  localContext.trace("Verifying the '".concat(statementString, "' statement as a defined assertion..."), statementNode);
171
- var containedAssertionVerified = (0, _containedAssertion.default)(containedAssertionNode, assignments, derived, localContext, function() {
187
+ var containedAssertionVerified = (0, _contained.default)(containedAssertionNode, assignments, derived, localContext, function() {
172
188
  var verifiedAhead = true;
173
189
  return verifiedAhead;
174
190
  });
@@ -181,8 +197,8 @@ function verifyStatementAsContainedAssertion(statementNode, assignments, derived
181
197
  }
182
198
  function verifyStatementAgainstCombinators(statementNode, assignments, derived, localContext) {
183
199
  var statementVerifiedAgainstCombinators = false;
184
- var equalityNode = equalityNodeQuery(statementNode), judgementNode = judgementNodeQuery(statementNode), metavariableNode = metavariableNodeQuery(statementNode), typeAssertionNode = typeAssertionNodeQuery(statementNode), definedAssertionNode = definedAssertionNodeQuery(statementNode), containedAssertionNode = containedAssertionNodeQuery(statementNode);
185
- if (equalityNode === null && judgementNode === null && metavariableNode === null && typeAssertionNode === null && definedAssertionNode === null && containedAssertionNode === null) {
200
+ var equalityNode = equalityNodeQuery(statementNode), judgementNode = judgementNodeQuery(statementNode), metavariableNode = metavariableNodeQuery(statementNode), typeAssertionNode = typeAssertionNodeQuery(statementNode), definedAssertionNode = definedAssertionNodeQuery(statementNode), subproofAssertionNode = subproofAssertionNodeQuery(statementNode), containedAssertionNode = containedAssertionNodeQuery(statementNode);
201
+ if (equalityNode === null && judgementNode === null && metavariableNode === null && typeAssertionNode === null && definedAssertionNode === null && subproofAssertionNode === null && containedAssertionNode === null) {
186
202
  var combinators = localContext.getCombinators();
187
203
  statementVerifiedAgainstCombinators = combinators.some(function(combinator) {
188
204
  var statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, localContext);
@@ -208,4 +224,4 @@ function verifyStatementAgainstCombinator(statementNode, combinator, localContex
208
224
  return statementVerifiedAgainstCombinator;
209
225
  }
210
226
 
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvc3RhdGVtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgdmVyaWZ5RXF1YWxpdHkgZnJvbSBcIi4uL3ZlcmlmeS9lcXVhbGl0eVwiO1xuaW1wb3J0IHZlcmlmeUp1ZGdlbWVudCBmcm9tIFwiLi4vdmVyaWZ5L2p1ZGdlbWVudFwiO1xuaW1wb3J0IHZlcmlmeVR5cGVBc3NlcnRpb24gZnJvbSBcIi4uL3ZlcmlmeS90eXBlQXNzZXJ0aW9uXCI7XG5pbXBvcnQgdmVyaWZ5RGVmaW5lZEFzc2VydGlvbiBmcm9tIFwiLi9kZWZpbmVkQXNzZXJ0aW9uXCI7XG5pbXBvcnQgdmVyaWZ5Q29udGFpbmVkQXNzZXJ0aW9uIGZyb20gXCIuL2NvbnRhaW5lZEFzc2VydGlvblwiO1xuaW1wb3J0IHN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yTm9kZXNWZXJpZmllciBmcm9tIFwiLi4vdmVyaWZpZXIvbm9kZXMvc3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3JcIjtcblxuaW1wb3J0IHsgbm9kZVF1ZXJ5IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9xdWVyeVwiO1xuaW1wb3J0IHsgU1RBVEVNRU5UX01FVEFfVFlQRV9OQU1FIH0gZnJvbSBcIi4uL21ldGFUeXBlTmFtZXNcIjtcblxuY29uc3QgZXF1YWxpdHlOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvc3RhdGVtZW50L2VxdWFsaXR5IVwiKSxcbiAgICAgIGp1ZGdlbWVudE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGF0ZW1lbnQvanVkZ2VtZW50IVwiKSxcbiAgICAgIG1ldGF2YXJpYWJsZU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGF0ZW1lbnQvbWV0YXZhcmlhYmxlIVwiKSxcbiAgICAgIHR5cGVBc3NlcnRpb25Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvc3RhdGVtZW50L3R5cGVBc3NlcnRpb24hXCIpLFxuICAgICAgZGVmaW5lZEFzc2VydGlvbk5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGF0ZW1lbnQvZGVmaW5lZEFzc2VydGlvbiFcIiksXG4gICAgICBjb250YWluZWRBc3NlcnRpb25Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvc3RhdGVtZW50L2NvbnRhaW5lZEFzc2VydGlvbiFcIik7XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudChzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZDtcblxuICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHN0YXRlbWVudE5vZGUpO1xuXG4gIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQuLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICBjb25zdCB2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbnMgPSBbXG4gICAgdmVyaWZ5U3RhdGVtZW50QXNNZXRhdmFyaWFibGUsXG4gICAgdmVyaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSxcbiAgICB2ZXJpZnlTdGF0ZW1lbnRBc0p1ZGdlbWVudCxcbiAgICB2ZXJpZnlTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24sXG4gICAgdmVyaWZ5U3RhdGVtZW50QXNEZWZpbmVkQXNzZXJ0aW9uLFxuICAgIHZlcmlmeVN0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uLFxuICAgIHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yc1xuICBdO1xuXG4gIHN0YXRlbWVudFZlcmlmaWVkID0gdmVyaWZ5U3RhdGVtZW50RnVuY3Rpb25zLnNvbWUoKHZlcmlmeVN0YXRlbWVudEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RhdGVtZW50VmVyaWZpZWQgPSB2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbihzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KTtcblxuICAgIGlmIChzdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICBpZiAoc3RhdGVtZW50VmVyaWZpZWQpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQuYCwgc3RhdGVtZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTdGFuZGFsb25lU3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCwgdmVyaWZ5QWhlYWQpIHtcbiAgbGV0IHN0YW5kYWxvbmVTdGF0ZW1lbnRWZXJpZmllZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YW5kYWxvbmUgc3RhdGVtZW50Li4uYCwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgY29uc3QgZGVyaXZlZCA9IGZhbHNlLFxuICAgICAgICBhc3NpZ25tZW50cyA9IFtdLFxuICAgICAgICBzdGF0ZW1lbnRWZXJpZmllZCA9IHZlcmlmeVN0YXRlbWVudChzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCk7XG5cbiAgaWYgKHN0YXRlbWVudFZlcmlmaWVkKSB7XG4gICAgY29uc3QgdmVyaWZpZWRBaGVhZCA9IHZlcmlmeUFoZWFkKCk7XG5cbiAgICBzdGFuZGFsb25lU3RhdGVtZW50VmVyaWZpZWQgPSB2ZXJpZmllZEFoZWFkOyAvLy9cbiAgfVxuXG4gIGlmIChzdGFuZGFsb25lU3RhdGVtZW50VmVyaWZpZWQpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGFuZGFsb25lIHN0YXRlbWVudC5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgfVxuXG4gIHJldHVybiBzdGFuZGFsb25lU3RhdGVtZW50VmVyaWZpZWQ7XG59XG5cbk9iamVjdC5hc3NpZ24oc3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3JOb2Rlc1ZlcmlmaWVyLCB7XG4gIHZlcmlmeVN0YXRlbWVudFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHZlcmlmeVN0YXRlbWVudDtcblxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFzRXF1YWxpdHkoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5ID0gZmFsc2U7XG5cbiAgY29uc3QgZXF1YWxpdHlOb2RlID0gZXF1YWxpdHlOb2RlUXVlcnkoc3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKGVxdWFsaXR5Tm9kZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5Li4uYCwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBjb25zdCBlcXVhbGl0eVZlcmlmaWVkID0gdmVyaWZ5RXF1YWxpdHkoZXF1YWxpdHlOb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0LCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJpZmllZEFoZWFkID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmV0dXJuIHZlcmlmaWVkQWhlYWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHkgPSBlcXVhbGl0eVZlcmlmaWVkOyAvLy9cblxuICAgIGlmIChzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHkpIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhbiBlcXVhbGl0eS5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uKHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZlcmlmaWVkQXNUeXBlQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgdHlwZUFzc2VydGlvbk5vZGUgPSB0eXBlQXNzZXJ0aW9uTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpO1xuXG4gIGlmICh0eXBlQXNzZXJ0aW9uTm9kZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgdHlwZSBhc3NlcnRpb24uLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IHR5cGVBc3NlcnRpb25WZXJpZmllZCA9IHZlcmlmeVR5cGVBc3NlcnRpb24odHlwZUFzc2VydGlvbk5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmlmaWVkQWhlYWQgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm4gdmVyaWZpZWRBaGVhZDtcbiAgICAgICAgICB9KTtcblxuICAgIHN0YXRlbWVudFZlcmlmaWVkQXNUeXBlQXNzZXJ0aW9uID0gdHlwZUFzc2VydGlvblZlcmlmaWVkOyAvLy9cblxuICAgIGlmIChzdGF0ZW1lbnRWZXJpZmllZEFzVHlwZUFzc2VydGlvbikge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgdHlwZSBhc3NlcnRpb24uYCwgc3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQXNUeXBlQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlTdGF0ZW1lbnRBc0p1ZGdlbWVudChzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFzSnVkZ2VtZW50ID0gZmFsc2U7XG5cbiAgY29uc3QganVkZ2VtZW50Tm9kZSA9IGp1ZGdlbWVudE5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKTtcblxuICBpZiAoanVkZ2VtZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEganVkZ2VtZW50Li4uYCwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBjb25zdCBqdWRnZW1lbnRWZXJpZmllZCA9IHZlcmlmeUp1ZGdlbWVudChqdWRnZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KTtcblxuICAgIHN0YXRlbWVudFZlcmlmaWVkQXNKdWRnZW1lbnQgPSBqdWRnZW1lbnRWZXJpZmllZDsgIC8vL1xuXG4gICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQXNKdWRnZW1lbnQpIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGp1ZGdlbWVudC5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWRBc0p1ZGdlbWVudDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QXNNZXRhdmFyaWFibGUoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWRBc01ldGF2YXJpYWJsZSA9IGZhbHNlO1xuXG4gIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGVOb2RlUXVlcnkoc3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKG1ldGF2YXJpYWJsZU5vZGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIG1ldGF2YXJpYWJsZS4uLmAsIHN0YXRlbWVudE5vZGUpO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlID0gbG9jYWxDb250ZXh0LmZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRhVHlwZU5hbWUgID0gbWV0YXZhcmlhYmxlLmdldE1ldGFUeXBlTmFtZSgpO1xuXG4gICAgICBpZiAobWV0YVR5cGVOYW1lID09PSBTVEFURU1FTlRfTUVUQV9UWVBFX05BTUUpIHtcbiAgICAgICAgc3RhdGVtZW50VmVyaWZpZWRBc01ldGF2YXJpYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQXNNZXRhdmFyaWFibGUpIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIG1ldGF2YXJpYWJsZS5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWRBc01ldGF2YXJpYWJsZTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QXNEZWZpbmVkQXNzZXJ0aW9uKHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZlcmlmaWVkQXNEZWZpbmVkQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgZGVmaW5lZEFzc2VydGlvbk5vZGUgPSBkZWZpbmVkQXNzZXJ0aW9uTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpO1xuXG4gIGlmIChkZWZpbmVkQXNzZXJ0aW9uTm9kZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgZGVmaW5lZCBhc3NlcnRpb24uLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IGRlZmluZWRBc3NlcnRpb25WZXJpZmllZCA9IHZlcmlmeURlZmluZWRBc3NlcnRpb24oZGVmaW5lZEFzc2VydGlvbk5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQsICgpID0+IHtcbiAgICAgIGNvbnN0IHZlcmlmaWVkQWhlYWQgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gdmVyaWZpZWRBaGVhZDtcbiAgICB9KTtcblxuICAgIHN0YXRlbWVudFZlcmlmaWVkQXNEZWZpbmVkQXNzZXJ0aW9uID0gZGVmaW5lZEFzc2VydGlvblZlcmlmaWVkOyAvLy9cblxuICAgIGlmIChzdGF0ZW1lbnRWZXJpZmllZEFzRGVmaW5lZEFzc2VydGlvbikge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgZGVmaW5lZCBhc3NlcnRpb24uYCwgc3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQXNEZWZpbmVkQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlTdGF0ZW1lbnRBc0NvbnRhaW5lZEFzc2VydGlvbihzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFzQ29udGFpbmVkQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgY29udGFpbmVkQXNzZXJ0aW9uTm9kZSA9IGNvbnRhaW5lZEFzc2VydGlvbk5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKTtcblxuICBpZiAoY29udGFpbmVkQXNzZXJ0aW9uTm9kZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgZGVmaW5lZCBhc3NlcnRpb24uLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lZEFzc2VydGlvblZlcmlmaWVkID0gdmVyaWZ5Q29udGFpbmVkQXNzZXJ0aW9uKGNvbnRhaW5lZEFzc2VydGlvbk5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQsICgpID0+IHtcbiAgICAgIGNvbnN0IHZlcmlmaWVkQWhlYWQgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gdmVyaWZpZWRBaGVhZDtcbiAgICB9KTtcblxuICAgIHN0YXRlbWVudFZlcmlmaWVkQXNDb250YWluZWRBc3NlcnRpb24gPSBjb250YWluZWRBc3NlcnRpb25WZXJpZmllZDsgLy8vXG5cbiAgICBpZiAoc3RhdGVtZW50VmVyaWZpZWRBc0NvbnRhaW5lZEFzc2VydGlvbikge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgZGVmaW5lZCBhc3NlcnRpb24uYCwgc3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQXNDb250YWluZWRBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9ycyhzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9ycyA9IGZhbHNlO1xuXG4gIGNvbnN0IGVxdWFsaXR5Tm9kZSA9IGVxdWFsaXR5Tm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpLFxuICAgICAgICBqdWRnZW1lbnROb2RlID0ganVkZ2VtZW50Tm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpLFxuICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpLFxuICAgICAgICB0eXBlQXNzZXJ0aW9uTm9kZSA9IHR5cGVBc3NlcnRpb25Ob2RlUXVlcnkoc3RhdGVtZW50Tm9kZSksXG4gICAgICAgIGRlZmluZWRBc3NlcnRpb25Ob2RlID0gZGVmaW5lZEFzc2VydGlvbk5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgY29udGFpbmVkQXNzZXJ0aW9uTm9kZSA9IGNvbnRhaW5lZEFzc2VydGlvbk5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKTtcblxuICBpZiAoICAoZXF1YWxpdHlOb2RlID09PSBudWxsKSAmJlxuICAgICAgICAoanVkZ2VtZW50Tm9kZSA9PT0gbnVsbCkgJiZcbiAgICAgICAgKG1ldGF2YXJpYWJsZU5vZGUgPT09IG51bGwpICYmXG4gICAgICAgICh0eXBlQXNzZXJ0aW9uTm9kZSA9PT0gbnVsbCkgJiZcbiAgICAgICAgKGRlZmluZWRBc3NlcnRpb25Ob2RlID09PSBudWxsKSAmJlxuICAgICAgICAoY29udGFpbmVkQXNzZXJ0aW9uTm9kZSA9PT0gbnVsbCkgKSB7XG5cbiAgICBjb25zdCBjb21iaW5hdG9ycyA9IGxvY2FsQ29udGV4dC5nZXRDb21iaW5hdG9ycygpO1xuXG4gICAgc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcnMgPSBjb21iaW5hdG9ycy5zb21lKChjb21iaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yID0gdmVyaWZ5U3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3Ioc3RhdGVtZW50Tm9kZSwgY29tYmluYXRvciwgbG9jYWxDb250ZXh0KTtcblxuICAgICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcnM7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yKHN0YXRlbWVudE5vZGUsIGNvbWJpbmF0b3IsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcjtcblxuICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHN0YXRlbWVudE5vZGUpLFxuICAgICAgICBjb21iaW5hdG9yU3RyaW5nID0gY29tYmluYXRvci5nZXRTdHJpbmcoKTtcblxuICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFnYWluc3QgdGhlICcke2NvbWJpbmF0b3JTdHJpbmd9JyBjb21iaW5hdG9yLi4uYCwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgY29uc3QgY29tYmluYXRvclN0YXRlbWVudE5vZGUgPSBjb21iaW5hdG9yLmdldFN0YXRlbWVudE5vZGUoKSxcbiAgICAgICAgbm9uVGVybWluYWxOb2RlQSA9IHN0YXRlbWVudE5vZGUsIC8vL1xuICAgICAgICBub25UZXJtaW5hbE5vZGVCID0gY29tYmluYXRvclN0YXRlbWVudE5vZGUsIC8vL1xuICAgICAgICBub25UZXJtaW5hbE5vZGVWZXJpZmllZCA9IHN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yTm9kZXNWZXJpZmllci52ZXJpZnlOb25UZXJtaW5hbE5vZGUobm9uVGVybWluYWxOb2RlQSwgbm9uVGVybWluYWxOb2RlQiwgbG9jYWxDb250ZXh0LCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmVyaWZpZWRBaGVhZCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gdmVyaWZpZWRBaGVhZDtcbiAgICAgICAgfSk7XG5cbiAgc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvciA9IG5vblRlcm1pbmFsTm9kZVZlcmlmaWVkOyAgLy8vXG5cbiAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7Y29tYmluYXRvclN0cmluZ30nIGNvbWJpbmF0b3IuYCwgc3RhdGVtZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcjtcbn0iXSwibmFtZXMiOlsidmVyaWZ5U3RhbmRhbG9uZVN0YXRlbWVudCIsInZlcmlmeVN0YXRlbWVudEFzRXF1YWxpdHkiLCJ2ZXJpZnlTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24iLCJlcXVhbGl0eU5vZGVRdWVyeSIsIm5vZGVRdWVyeSIsImp1ZGdlbWVudE5vZGVRdWVyeSIsIm1ldGF2YXJpYWJsZU5vZGVRdWVyeSIsInR5cGVBc3NlcnRpb25Ob2RlUXVlcnkiLCJkZWZpbmVkQXNzZXJ0aW9uTm9kZVF1ZXJ5IiwiY29udGFpbmVkQXNzZXJ0aW9uTm9kZVF1ZXJ5IiwidmVyaWZ5U3RhdGVtZW50Iiwic3RhdGVtZW50Tm9kZSIsImFzc2lnbm1lbnRzIiwiZGVyaXZlZCIsImxvY2FsQ29udGV4dCIsInN0YXRlbWVudFZlcmlmaWVkIiwic3RhdGVtZW50U3RyaW5nIiwibm9kZUFzU3RyaW5nIiwidHJhY2UiLCJ2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbnMiLCJ2ZXJpZnlTdGF0ZW1lbnRBc01ldGF2YXJpYWJsZSIsInZlcmlmeVN0YXRlbWVudEFzSnVkZ2VtZW50IiwidmVyaWZ5U3RhdGVtZW50QXNEZWZpbmVkQXNzZXJ0aW9uIiwidmVyaWZ5U3RhdGVtZW50QXNDb250YWluZWRBc3NlcnRpb24iLCJ2ZXJpZnlTdGF0ZW1lbnRBZ2FpbnN0Q29tYmluYXRvcnMiLCJzb21lIiwidmVyaWZ5U3RhdGVtZW50RnVuY3Rpb24iLCJkZWJ1ZyIsInZlcmlmeUFoZWFkIiwic3RhbmRhbG9uZVN0YXRlbWVudFZlcmlmaWVkIiwidmVyaWZpZWRBaGVhZCIsIk9iamVjdCIsImFzc2lnbiIsInN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yTm9kZXNWZXJpZmllciIsInN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSIsImVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5VmVyaWZpZWQiLCJ2ZXJpZnlFcXVhbGl0eSIsInN0YXRlbWVudFZlcmlmaWVkQXNUeXBlQXNzZXJ0aW9uIiwidHlwZUFzc2VydGlvbk5vZGUiLCJ0eXBlQXNzZXJ0aW9uVmVyaWZpZWQiLCJ2ZXJpZnlUeXBlQXNzZXJ0aW9uIiwic3RhdGVtZW50VmVyaWZpZWRBc0p1ZGdlbWVudCIsImp1ZGdlbWVudE5vZGUiLCJqdWRnZW1lbnRWZXJpZmllZCIsInZlcmlmeUp1ZGdlbWVudCIsInN0YXRlbWVudFZlcmlmaWVkQXNNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlIiwiZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZSIsIm1ldGFUeXBlTmFtZSIsImdldE1ldGFUeXBlTmFtZSIsIlNUQVRFTUVOVF9NRVRBX1RZUEVfTkFNRSIsInN0YXRlbWVudFZlcmlmaWVkQXNEZWZpbmVkQXNzZXJ0aW9uIiwiZGVmaW5lZEFzc2VydGlvbk5vZGUiLCJkZWZpbmVkQXNzZXJ0aW9uVmVyaWZpZWQiLCJ2ZXJpZnlEZWZpbmVkQXNzZXJ0aW9uIiwic3RhdGVtZW50VmVyaWZpZWRBc0NvbnRhaW5lZEFzc2VydGlvbiIsImNvbnRhaW5lZEFzc2VydGlvbk5vZGUiLCJjb250YWluZWRBc3NlcnRpb25WZXJpZmllZCIsInZlcmlmeUNvbnRhaW5lZEFzc2VydGlvbiIsInN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3JzIiwiY29tYmluYXRvcnMiLCJnZXRDb21iaW5hdG9ycyIsImNvbWJpbmF0b3IiLCJzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yIiwidmVyaWZ5U3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3IiLCJjb21iaW5hdG9yU3RyaW5nIiwiZ2V0U3RyaW5nIiwiY29tYmluYXRvclN0YXRlbWVudE5vZGUiLCJnZXRTdGF0ZW1lbnROb2RlIiwibm9uVGVybWluYWxOb2RlQSIsIm5vblRlcm1pbmFsTm9kZUIiLCJub25UZXJtaW5hbE5vZGVWZXJpZmllZCIsInZlcmlmeU5vblRlcm1pbmFsTm9kZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0lBK0VBLE9BQStCO2VBQS9COztJQTVCZ0JBLHlCQUF5QjtlQUF6QkE7O0lBOEJBQyx5QkFBeUI7ZUFBekJBOztJQTBCQUMsOEJBQThCO2VBQTlCQTs7OytEQXpHVztnRUFDQztvRUFDSTt1RUFDRzt5RUFDRTtpRkFDZTtxQkFFMUI7NkJBQ2U7Ozs7OztBQUV6QyxJQUFNQyxvQkFBb0JDLElBQUFBLGdCQUFTLEVBQUMseUJBQzlCQyxxQkFBcUJELElBQUFBLGdCQUFTLEVBQUMsMEJBQy9CRSx3QkFBd0JGLElBQUFBLGdCQUFTLEVBQUMsNkJBQ2xDRyx5QkFBeUJILElBQUFBLGdCQUFTLEVBQUMsOEJBQ25DSSw0QkFBNEJKLElBQUFBLGdCQUFTLEVBQUMsaUNBQ3RDSyw4QkFBOEJMLElBQUFBLGdCQUFTLEVBQUM7QUFFOUMsU0FBU00sZ0JBQWdCQyxhQUFhLEVBQUVDLFdBQVcsRUFBRUMsT0FBTyxFQUFFQyxZQUFZO0lBQ3hFLElBQUlDO0lBRUosSUFBTUMsa0JBQWtCRixhQUFhRyxZQUFZLENBQUNOO0lBRWxERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBaUMsT0FBaEJGLGlCQUFnQixtQkFBaUJMO0lBRXRFLElBQU1RLDJCQUEyQjtRQUMvQkM7UUFDQW5CO1FBQ0FvQjtRQUNBbkI7UUFDQW9CO1FBQ0FDO1FBQ0FDO0tBQ0Q7SUFFRFQsb0JBQW9CSSx5QkFBeUJNLElBQUksQ0FBQyxTQUFDQztRQUNqRCxJQUFNWCxvQkFBb0JXLHdCQUF3QmYsZUFBZUMsYUFBYUMsU0FBU0M7UUFFdkYsSUFBSUMsbUJBQW1CO1lBQ3JCLE9BQU87UUFDVDtJQUNGO0lBRUEsSUFBSUEsbUJBQW1CO1FBQ3JCRCxhQUFhYSxLQUFLLENBQUMsQUFBQyxvQkFBbUMsT0FBaEJYLGlCQUFnQixpQkFBZUw7SUFDeEU7SUFFQSxPQUFPSTtBQUNUO0FBRU8sU0FBU2YsMEJBQTBCVyxhQUFhLEVBQUVHLFlBQVksRUFBRWMsV0FBVztJQUNoRixJQUFJQyw4QkFBOEI7SUFFbEMsSUFBTWIsa0JBQWtCRixhQUFhRyxZQUFZLENBQUNOO0lBRWxERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBaUMsT0FBaEJGLGlCQUFnQiw4QkFBNEJMO0lBRWpGLElBQU1FLFVBQVUsT0FDVkQsY0FBYyxFQUFFLEVBQ2hCRyxvQkFBb0JMLGdCQUFnQkMsZUFBZUMsYUFBYUM7SUFFdEUsSUFBSUUsbUJBQW1CO1FBQ3JCLElBQU1lLGdCQUFnQkY7UUFFdEJDLDhCQUE4QkMsZUFBZSxHQUFHO0lBQ2xEO0lBRUEsSUFBSUQsNkJBQTZCO1FBQy9CZixhQUFhYSxLQUFLLENBQUMsQUFBQyxvQkFBbUMsT0FBaEJYLGlCQUFnQiw0QkFBMEJMO0lBQ25GO0lBRUEsT0FBT2tCO0FBQ1Q7QUFFQUUsT0FBT0MsTUFBTSxDQUFDQyxtQ0FBdUMsRUFBRTtJQUNyRHZCLGlCQUFBQTtBQUNGO0lBRUEsV0FBZUE7QUFFUixTQUFTVCwwQkFBMEJVLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFlBQVk7SUFDekYsSUFBSW9CLDhCQUE4QjtJQUVsQyxJQUFNQyxlQUFlaEMsa0JBQWtCUTtJQUV2QyxJQUFJd0IsaUJBQWlCLE1BQU07UUFDekIsSUFBTW5CLGtCQUFrQkYsYUFBYUcsWUFBWSxDQUFDTjtRQUVsREcsYUFBYUksS0FBSyxDQUFDLEFBQUMsa0JBQWlDLE9BQWhCRixpQkFBZ0Isa0NBQWdDTDtRQUVyRixJQUFNeUIsbUJBQW1CQyxJQUFBQSxpQkFBYyxFQUFDRixjQUFjdkIsYUFBYUMsU0FBU0MsY0FBYztZQUNsRixJQUFNZ0IsZ0JBQWdCO1lBRXRCLE9BQU9BO1FBQ1Q7UUFFTkksOEJBQThCRSxrQkFBa0IsR0FBRztRQUVuRCxJQUFJRiw2QkFBNkI7WUFDL0JwQixhQUFhYSxLQUFLLENBQUMsQUFBQyxvQkFBbUMsT0FBaEJYLGlCQUFnQixnQ0FBOEJMO1FBQ3ZGO0lBQ0Y7SUFFQSxPQUFPdUI7QUFDVDtBQUVPLFNBQVNoQywrQkFBK0JTLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFlBQVk7SUFDOUYsSUFBSXdCLG1DQUFtQztJQUV2QyxJQUFNQyxvQkFBb0JoQyx1QkFBdUJJO0lBRWpELElBQUk0QixzQkFBc0IsTUFBTTtRQUM5QixJQUFNdkIsa0JBQWtCRixhQUFhRyxZQUFZLENBQUNOO1FBRWxERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBaUMsT0FBaEJGLGlCQUFnQix1Q0FBcUNMO1FBRTFGLElBQU02Qix3QkFBd0JDLElBQUFBLHNCQUFtQixFQUFDRixtQkFBbUIzQixhQUFhQyxTQUFTQyxjQUFjO1lBQ2pHLElBQU1nQixnQkFBZ0I7WUFFdEIsT0FBT0E7UUFDVDtRQUVOUSxtQ0FBbUNFLHVCQUF1QixHQUFHO1FBRTdELElBQUlGLGtDQUFrQztZQUNwQ3hCLGFBQWFhLEtBQUssQ0FBQyxBQUFDLG9CQUFtQyxPQUFoQlgsaUJBQWdCLHFDQUFtQ0w7UUFDNUY7SUFDRjtJQUVBLE9BQU8yQjtBQUNUO0FBRUEsU0FBU2pCLDJCQUEyQlYsYUFBYSxFQUFFQyxXQUFXLEVBQUVDLE9BQU8sRUFBRUMsWUFBWTtJQUNuRixJQUFJNEIsK0JBQStCO0lBRW5DLElBQU1DLGdCQUFnQnRDLG1CQUFtQk07SUFFekMsSUFBSWdDLGtCQUFrQixNQUFNO1FBQzFCLElBQU0zQixrQkFBa0JGLGFBQWFHLFlBQVksQ0FBQ047UUFFbERHLGFBQWFJLEtBQUssQ0FBQyxBQUFDLGtCQUFpQyxPQUFoQkYsaUJBQWdCLGtDQUFnQ0w7UUFFckYsSUFBTWlDLG9CQUFvQkMsSUFBQUEsa0JBQWUsRUFBQ0YsZUFBZS9CLGFBQWFDLFNBQVNDO1FBRS9FNEIsK0JBQStCRSxtQkFBb0IsR0FBRztRQUV0RCxJQUFJRiw4QkFBOEI7WUFDaEM1QixhQUFhYSxLQUFLLENBQUMsQUFBQyxvQkFBbUMsT0FBaEJYLGlCQUFnQixnQ0FBOEJMO1FBQ3ZGO0lBQ0Y7SUFFQSxPQUFPK0I7QUFDVDtBQUVBLFNBQVN0Qiw4QkFBOEJULGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFlBQVk7SUFDdEYsSUFBSWdDLGtDQUFrQztJQUV0QyxJQUFNQyxtQkFBbUJ6QyxzQkFBc0JLO0lBRS9DLElBQUlvQyxxQkFBcUIsTUFBTTtRQUM3QixJQUFNL0Isa0JBQWtCRixhQUFhRyxZQUFZLENBQUNOO1FBRWxERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBaUMsT0FBaEJGLGlCQUFnQixxQ0FBbUNMO1FBRXhGLElBQU1xQyxlQUFlbEMsYUFBYW1DLGtDQUFrQyxDQUFDRjtRQUVyRSxJQUFJQyxpQkFBaUIsTUFBTTtZQUN6QixJQUFNRSxlQUFnQkYsYUFBYUcsZUFBZTtZQUVsRCxJQUFJRCxpQkFBaUJFLHVDQUF3QixFQUFFO2dCQUM3Q04sa0NBQWtDO1lBQ3BDO1FBQ0Y7UUFFQSxJQUFJQSxpQ0FBaUM7WUFDbkNoQyxhQUFhYSxLQUFLLENBQUMsQUFBQyxvQkFBbUMsT0FBaEJYLGlCQUFnQixtQ0FBaUNMO1FBQzFGO0lBQ0Y7SUFFQSxPQUFPbUM7QUFDVDtBQUVBLFNBQVN4QixrQ0FBa0NYLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFlBQVk7SUFDMUYsSUFBSXVDLHNDQUFzQztJQUUxQyxJQUFNQyx1QkFBdUI5QywwQkFBMEJHO0lBRXZELElBQUkyQyx5QkFBeUIsTUFBTTtRQUNqQyxJQUFNdEMsa0JBQWtCRixhQUFhRyxZQUFZLENBQUNOO1FBRWxERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBaUMsT0FBaEJGLGlCQUFnQiwwQ0FBd0NMO1FBRTdGLElBQU00QywyQkFBMkJDLElBQUFBLHlCQUFzQixFQUFDRixzQkFBc0IxQyxhQUFhQyxTQUFTQyxjQUFjO1lBQ2hILElBQU1nQixnQkFBZ0I7WUFFdEIsT0FBT0E7UUFDVDtRQUVBdUIsc0NBQXNDRSwwQkFBMEIsR0FBRztRQUVuRSxJQUFJRixxQ0FBcUM7WUFDdkN2QyxhQUFhYSxLQUFLLENBQUMsQUFBQyxvQkFBbUMsT0FBaEJYLGlCQUFnQix3Q0FBc0NMO1FBQy9GO0lBQ0Y7SUFFQSxPQUFPMEM7QUFDVDtBQUVBLFNBQVM5QixvQ0FBb0NaLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFlBQVk7SUFDNUYsSUFBSTJDLHdDQUF3QztJQUU1QyxJQUFNQyx5QkFBeUJqRCw0QkFBNEJFO0lBRTNELElBQUkrQywyQkFBMkIsTUFBTTtRQUNuQyxJQUFNMUMsa0JBQWtCRixhQUFhRyxZQUFZLENBQUNOO1FBRWxERyxhQUFhSSxLQUFLLENBQUMsQUFBQyxrQkFBaUMsT0FBaEJGLGlCQUFnQiwwQ0FBd0NMO1FBRTdGLElBQU1nRCw2QkFBNkJDLElBQUFBLDJCQUF3QixFQUFDRix3QkFBd0I5QyxhQUFhQyxTQUFTQyxjQUFjO1lBQ3RILElBQU1nQixnQkFBZ0I7WUFFdEIsT0FBT0E7UUFDVDtRQUVBMkIsd0NBQXdDRSw0QkFBNEIsR0FBRztRQUV2RSxJQUFJRix1Q0FBdUM7WUFDekMzQyxhQUFhYSxLQUFLLENBQUMsQUFBQyxvQkFBbUMsT0FBaEJYLGlCQUFnQix3Q0FBc0NMO1FBQy9GO0lBQ0Y7SUFFQSxPQUFPOEM7QUFDVDtBQUVBLFNBQVNqQyxrQ0FBa0NiLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFlBQVk7SUFDMUYsSUFBSStDLHNDQUFzQztJQUUxQyxJQUFNMUIsZUFBZWhDLGtCQUFrQlEsZ0JBQ2pDZ0MsZ0JBQWdCdEMsbUJBQW1CTSxnQkFDbkNvQyxtQkFBbUJ6QyxzQkFBc0JLLGdCQUN6QzRCLG9CQUFvQmhDLHVCQUF1QkksZ0JBQzNDMkMsdUJBQXVCOUMsMEJBQTBCRyxnQkFDakQrQyx5QkFBeUJqRCw0QkFBNEJFO0lBRTNELElBQU0sQUFBQ3dCLGlCQUFpQixRQUNqQlEsa0JBQWtCLFFBQ2xCSSxxQkFBcUIsUUFDckJSLHNCQUFzQixRQUN0QmUseUJBQXlCLFFBQ3pCSSwyQkFBMkIsTUFBUTtRQUV4QyxJQUFNSSxjQUFjaEQsYUFBYWlELGNBQWM7UUFFL0NGLHNDQUFzQ0MsWUFBWXJDLElBQUksQ0FBQyxTQUFDdUM7WUFDdEQsSUFBTUMscUNBQXFDQyxpQ0FBaUN2RCxlQUFlcUQsWUFBWWxEO1lBRXZHLElBQUltRCxvQ0FBb0M7Z0JBQ3RDLE9BQU87WUFDVDtRQUNGO0lBQ0Y7SUFFQSxPQUFPSjtBQUNUO0FBRUEsU0FBU0ssaUNBQWlDdkQsYUFBYSxFQUFFcUQsVUFBVSxFQUFFbEQsWUFBWTtJQUMvRSxJQUFJbUQ7SUFFSixJQUFNakQsa0JBQWtCRixhQUFhRyxZQUFZLENBQUNOLGdCQUM1Q3dELG1CQUFtQkgsV0FBV0ksU0FBUztJQUU3Q3RELGFBQWFJLEtBQUssQ0FBQyxBQUFDLGtCQUE0RGlELE9BQTNDbkQsaUJBQWdCLDZCQUE0QyxPQUFqQm1ELGtCQUFpQixvQkFBa0J4RDtJQUVuSCxJQUFNMEQsMEJBQTBCTCxXQUFXTSxnQkFBZ0IsSUFDckRDLG1CQUFtQjVELGVBQ25CNkQsbUJBQW1CSCx5QkFDbkJJLDBCQUEwQnhDLG1DQUF1QyxDQUFDeUMscUJBQXFCLENBQUNILGtCQUFrQkMsa0JBQWtCMUQsY0FBYztRQUN4SSxJQUFNZ0IsZ0JBQWdCO1FBRXRCLE9BQU9BO0lBQ1Q7SUFFTm1DLHFDQUFxQ1EseUJBQTBCLEdBQUc7SUFFbEUsSUFBSVIsb0NBQW9DO1FBQ3RDbkQsYUFBYWEsS0FBSyxDQUFDLEFBQUMsb0JBQThEd0MsT0FBM0NuRCxpQkFBZ0IsNkJBQTRDLE9BQWpCbUQsa0JBQWlCLGtCQUFnQnhEO0lBQ3JIO0lBRUEsT0FBT3NEO0FBQ1QifQ==
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvc3RhdGVtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgdmVyaWZ5RXF1YWxpdHkgZnJvbSBcIi4uL3ZlcmlmeS9lcXVhbGl0eVwiO1xuaW1wb3J0IHZlcmlmeUp1ZGdlbWVudCBmcm9tIFwiLi4vdmVyaWZ5L2p1ZGdlbWVudFwiO1xuaW1wb3J0IHZlcmlmeVR5cGVBc3NlcnRpb24gZnJvbSBcIi4uL3ZlcmlmeS9hc3NlcnRpb24vdHlwZVwiO1xuaW1wb3J0IHZlcmlmeURlZmluZWRBc3NlcnRpb24gZnJvbSBcIi4uL3ZlcmlmeS9hc3NlcnRpb24vZGVmaW5lZFwiO1xuaW1wb3J0IHZlcmlmeVN1YnByb29mQXNzZXJ0aW9uIGZyb20gXCIuLi92ZXJpZnkvYXNzZXJ0aW9uL3N1YnByb29mXCI7XG5pbXBvcnQgdmVyaWZ5Q29udGFpbmVkQXNzZXJ0aW9uIGZyb20gXCIuLi92ZXJpZnkvYXNzZXJ0aW9uL2NvbnRhaW5lZFwiO1xuaW1wb3J0IHN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yTm9kZXNWZXJpZmllciBmcm9tIFwiLi4vdmVyaWZpZXIvbm9kZXMvc3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3JcIjtcblxuaW1wb3J0IHsgbm9kZVF1ZXJ5IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9xdWVyeVwiO1xuaW1wb3J0IHsgU1RBVEVNRU5UX01FVEFfVFlQRV9OQU1FIH0gZnJvbSBcIi4uL21ldGFUeXBlTmFtZXNcIjtcblxuY29uc3QgZXF1YWxpdHlOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvc3RhdGVtZW50L2VxdWFsaXR5IVwiKSxcbiAgICAgIGp1ZGdlbWVudE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGF0ZW1lbnQvanVkZ2VtZW50IVwiKSxcbiAgICAgIG1ldGF2YXJpYWJsZU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGF0ZW1lbnQvbWV0YXZhcmlhYmxlIVwiKSxcbiAgICAgIHR5cGVBc3NlcnRpb25Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvc3RhdGVtZW50L3R5cGVBc3NlcnRpb24hXCIpLFxuICAgICAgZGVmaW5lZEFzc2VydGlvbk5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGF0ZW1lbnQvZGVmaW5lZEFzc2VydGlvbiFcIiksXG4gICAgICBzdWJwcm9vZkFzc2VydGlvbk5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9zdGF0ZW1lbnQvc3VicHJvb2ZBc3NlcnRpb24hXCIpLFxuICAgICAgY29udGFpbmVkQXNzZXJ0aW9uTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3N0YXRlbWVudC9jb250YWluZWRBc3NlcnRpb24hXCIpO1xuXG5mdW5jdGlvbiB2ZXJpZnlTdGF0ZW1lbnQoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWQ7XG5cbiAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhzdGF0ZW1lbnROb2RlKTtcblxuICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50Li4uYCwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgY29uc3QgdmVyaWZ5U3RhdGVtZW50RnVuY3Rpb25zID0gW1xuICAgIHZlcmlmeVN0YXRlbWVudEFzTWV0YXZhcmlhYmxlLFxuICAgIHZlcmlmeVN0YXRlbWVudEFzRXF1YWxpdHksXG4gICAgdmVyaWZ5U3RhdGVtZW50QXNKdWRnZW1lbnQsXG4gICAgdmVyaWZ5U3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uLFxuICAgIHZlcmlmeVN0YXRlbWVudEFzRGVmaW5lZEFzc2VydGlvbixcbiAgICB2ZXJpZnlTdGF0ZW1lbnRBc1N1YnByb29mQXNzZXJ0aW9uLFxuICAgIHZlcmlmeVN0YXRlbWVudEFzQ29udGFpbmVkQXNzZXJ0aW9uLFxuICAgIHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yc1xuICBdO1xuXG4gIHN0YXRlbWVudFZlcmlmaWVkID0gdmVyaWZ5U3RhdGVtZW50RnVuY3Rpb25zLnNvbWUoKHZlcmlmeVN0YXRlbWVudEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RhdGVtZW50VmVyaWZpZWQgPSB2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbihzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KTtcblxuICAgIGlmIChzdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICBpZiAoc3RhdGVtZW50VmVyaWZpZWQpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQuYCwgc3RhdGVtZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTdGFuZGFsb25lU3RhdGVtZW50KHN0YXRlbWVudE5vZGUsIGxvY2FsQ29udGV4dCwgdmVyaWZ5QWhlYWQpIHtcbiAgbGV0IHN0YW5kYWxvbmVTdGF0ZW1lbnRWZXJpZmllZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YW5kYWxvbmUgc3RhdGVtZW50Li4uYCwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgY29uc3QgZGVyaXZlZCA9IGZhbHNlLFxuICAgICAgICBhc3NpZ25tZW50cyA9IFtdLFxuICAgICAgICBzdGF0ZW1lbnRWZXJpZmllZCA9IHZlcmlmeVN0YXRlbWVudChzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KTtcblxuICBpZiAoc3RhdGVtZW50VmVyaWZpZWQpIHtcbiAgICBjb25zdCB2ZXJpZmllZEFoZWFkID0gdmVyaWZ5QWhlYWQoKTtcblxuICAgIHN0YW5kYWxvbmVTdGF0ZW1lbnRWZXJpZmllZCA9IHZlcmlmaWVkQWhlYWQ7IC8vL1xuICB9XG5cbiAgaWYgKHN0YW5kYWxvbmVTdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YW5kYWxvbmUgc3RhdGVtZW50LmAsIHN0YXRlbWVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YW5kYWxvbmVTdGF0ZW1lbnRWZXJpZmllZDtcbn1cblxuT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnRBZ2FpbnN0Q29tYmluYXRvck5vZGVzVmVyaWZpZXIsIHtcbiAgdmVyaWZ5U3RhdGVtZW50XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdmVyaWZ5U3RhdGVtZW50O1xuXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QXNFcXVhbGl0eShzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHkgPSBmYWxzZTtcblxuICBjb25zdCBlcXVhbGl0eU5vZGUgPSBlcXVhbGl0eU5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKTtcblxuICBpZiAoZXF1YWxpdHlOb2RlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhzdGF0ZW1lbnROb2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYW4gZXF1YWxpdHkuLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IGVxdWFsaXR5VmVyaWZpZWQgPSB2ZXJpZnlFcXVhbGl0eShlcXVhbGl0eU5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmlmaWVkQWhlYWQgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm4gdmVyaWZpZWRBaGVhZDtcbiAgICAgICAgICB9KTtcblxuICAgIHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSA9IGVxdWFsaXR5VmVyaWZpZWQ7IC8vL1xuXG4gICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSkge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5LmAsIHN0YXRlbWVudE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTdGF0ZW1lbnRBc1R5cGVBc3NlcnRpb24oc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWRBc1R5cGVBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB0eXBlQXNzZXJ0aW9uTm9kZSA9IHR5cGVBc3NlcnRpb25Ob2RlUXVlcnkoc3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKHR5cGVBc3NlcnRpb25Ob2RlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhzdGF0ZW1lbnROb2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSB0eXBlIGFzc2VydGlvbi4uLmAsIHN0YXRlbWVudE5vZGUpO1xuXG4gICAgY29uc3QgdHlwZUFzc2VydGlvblZlcmlmaWVkID0gdmVyaWZ5VHlwZUFzc2VydGlvbih0eXBlQXNzZXJ0aW9uTm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBzdGF0ZW1lbnRWZXJpZmllZEFzVHlwZUFzc2VydGlvbiA9IHR5cGVBc3NlcnRpb25WZXJpZmllZDsgLy8vXG5cbiAgICBpZiAoc3RhdGVtZW50VmVyaWZpZWRBc1R5cGVBc3NlcnRpb24pIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHR5cGUgYXNzZXJ0aW9uLmAsIHN0YXRlbWVudE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWZXJpZmllZEFzVHlwZUFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QXNKdWRnZW1lbnQoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWRBc0p1ZGdlbWVudCA9IGZhbHNlO1xuXG4gIGNvbnN0IGp1ZGdlbWVudE5vZGUgPSBqdWRnZW1lbnROb2RlUXVlcnkoc3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKGp1ZGdlbWVudE5vZGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGp1ZGdlbWVudC4uLmAsIHN0YXRlbWVudE5vZGUpO1xuXG4gICAgY29uc3QganVkZ2VtZW50VmVyaWZpZWQgPSB2ZXJpZnlKdWRnZW1lbnQoanVkZ2VtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCk7XG5cbiAgICBzdGF0ZW1lbnRWZXJpZmllZEFzSnVkZ2VtZW50ID0ganVkZ2VtZW50VmVyaWZpZWQ7ICAvLy9cblxuICAgIGlmIChzdGF0ZW1lbnRWZXJpZmllZEFzSnVkZ2VtZW50KSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBqdWRnZW1lbnQuYCwgc3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQXNKdWRnZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFzTWV0YXZhcmlhYmxlKHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZlcmlmaWVkQXNNZXRhdmFyaWFibGUgPSBmYWxzZTtcblxuICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpO1xuXG4gIGlmIChtZXRhdmFyaWFibGVOb2RlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhzdGF0ZW1lbnROb2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBtZXRhdmFyaWFibGUuLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IGxvY2FsQ29udGV4dC5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YVR5cGVOYW1lICA9IG1ldGF2YXJpYWJsZS5nZXRNZXRhVHlwZU5hbWUoKTtcblxuICAgICAgaWYgKG1ldGFUeXBlTmFtZSA9PT0gU1RBVEVNRU5UX01FVEFfVFlQRV9OQU1FKSB7XG4gICAgICAgIHN0YXRlbWVudFZlcmlmaWVkQXNNZXRhdmFyaWFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0ZW1lbnRWZXJpZmllZEFzTWV0YXZhcmlhYmxlKSB7XG4gICAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBtZXRhdmFyaWFibGUuYCwgc3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQXNNZXRhdmFyaWFibGU7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFzRGVmaW5lZEFzc2VydGlvbihzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFzRGVmaW5lZEFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0IGRlZmluZWRBc3NlcnRpb25Ob2RlID0gZGVmaW5lZEFzc2VydGlvbk5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKTtcblxuICBpZiAoZGVmaW5lZEFzc2VydGlvbk5vZGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGRlZmluZWQgYXNzZXJ0aW9uLi4uYCwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBjb25zdCBkZWZpbmVkQXNzZXJ0aW9uVmVyaWZpZWQgPSB2ZXJpZnlEZWZpbmVkQXNzZXJ0aW9uKGRlZmluZWRBc3NlcnRpb25Ob2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0LCAoKSA9PiB7XG4gICAgICBjb25zdCB2ZXJpZmllZEFoZWFkID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIHZlcmlmaWVkQWhlYWQ7XG4gICAgfSk7XG5cbiAgICBzdGF0ZW1lbnRWZXJpZmllZEFzRGVmaW5lZEFzc2VydGlvbiA9IGRlZmluZWRBc3NlcnRpb25WZXJpZmllZDsgLy8vXG5cbiAgICBpZiAoc3RhdGVtZW50VmVyaWZpZWRBc0RlZmluZWRBc3NlcnRpb24pIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGRlZmluZWQgYXNzZXJ0aW9uLmAsIHN0YXRlbWVudE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWZXJpZmllZEFzRGVmaW5lZEFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QXNTdWJwcm9vZkFzc2VydGlvbihzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFzU3VicHJvb2ZBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCBzdWJwcm9vZkFzc2VydGlvbk5vZGUgPSBzdWJwcm9vZkFzc2VydGlvbk5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKTtcblxuICBpZiAoc3VicHJvb2ZBc3NlcnRpb25Ob2RlICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyhzdGF0ZW1lbnROb2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBzdWJwcm9vZiBhc3NlcnRpb24uLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICAgIGNvbnN0IHN1YnByb29mQXNzZXJ0aW9uVmVyaWZpZWQgPSB2ZXJpZnlTdWJwcm9vZkFzc2VydGlvbihzdWJwcm9vZkFzc2VydGlvbk5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBsb2NhbENvbnRleHQsICgpID0+IHtcbiAgICAgIGNvbnN0IHZlcmlmaWVkQWhlYWQgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gdmVyaWZpZWRBaGVhZDtcbiAgICB9KTtcblxuICAgIHN0YXRlbWVudFZlcmlmaWVkQXNTdWJwcm9vZkFzc2VydGlvbiA9IHN1YnByb29mQXNzZXJ0aW9uVmVyaWZpZWQ7IC8vL1xuXG4gICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQXNTdWJwcm9vZkFzc2VydGlvbikge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgZGVmaW5lZCBhc3NlcnRpb24uYCwgc3RhdGVtZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQXNTdWJwcm9vZkFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QXNDb250YWluZWRBc3NlcnRpb24oc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWRBc0NvbnRhaW5lZEFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0IGNvbnRhaW5lZEFzc2VydGlvbk5vZGUgPSBjb250YWluZWRBc3NlcnRpb25Ob2RlUXVlcnkoc3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKGNvbnRhaW5lZEFzc2VydGlvbk5vZGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHN0YXRlbWVudE5vZGUpO1xuXG4gICAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGRlZmluZWQgYXNzZXJ0aW9uLi4uYCwgc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBjb25zdCBjb250YWluZWRBc3NlcnRpb25WZXJpZmllZCA9IHZlcmlmeUNvbnRhaW5lZEFzc2VydGlvbihjb250YWluZWRBc3NlcnRpb25Ob2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgbG9jYWxDb250ZXh0LCAoKSA9PiB7XG4gICAgICBjb25zdCB2ZXJpZmllZEFoZWFkID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIHZlcmlmaWVkQWhlYWQ7XG4gICAgfSk7XG5cbiAgICBzdGF0ZW1lbnRWZXJpZmllZEFzQ29udGFpbmVkQXNzZXJ0aW9uID0gY29udGFpbmVkQXNzZXJ0aW9uVmVyaWZpZWQ7IC8vL1xuXG4gICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQXNDb250YWluZWRBc3NlcnRpb24pIHtcbiAgICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIGRlZmluZWQgYXNzZXJ0aW9uLmAsIHN0YXRlbWVudE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWZXJpZmllZEFzQ29udGFpbmVkQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlTdGF0ZW1lbnRBZ2FpbnN0Q29tYmluYXRvcnMoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGxvY2FsQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcnMgPSBmYWxzZTtcblxuICBjb25zdCBlcXVhbGl0eU5vZGUgPSBlcXVhbGl0eU5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKSxcbiAgICAgICAganVkZ2VtZW50Tm9kZSA9IGp1ZGdlbWVudE5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKSxcbiAgICAgICAgdHlwZUFzc2VydGlvbk5vZGUgPSB0eXBlQXNzZXJ0aW9uTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpLFxuICAgICAgICBkZWZpbmVkQXNzZXJ0aW9uTm9kZSA9IGRlZmluZWRBc3NlcnRpb25Ob2RlUXVlcnkoc3RhdGVtZW50Tm9kZSksXG4gICAgICAgIHN1YnByb29mQXNzZXJ0aW9uTm9kZSA9IHN1YnByb29mQXNzZXJ0aW9uTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpLFxuICAgICAgICBjb250YWluZWRBc3NlcnRpb25Ob2RlID0gY29udGFpbmVkQXNzZXJ0aW9uTm9kZVF1ZXJ5KHN0YXRlbWVudE5vZGUpO1xuXG4gIGlmICggIChlcXVhbGl0eU5vZGUgPT09IG51bGwpICYmXG4gICAgICAgIChqdWRnZW1lbnROb2RlID09PSBudWxsKSAmJlxuICAgICAgICAobWV0YXZhcmlhYmxlTm9kZSA9PT0gbnVsbCkgJiZcbiAgICAgICAgKHR5cGVBc3NlcnRpb25Ob2RlID09PSBudWxsKSAmJlxuICAgICAgICAoZGVmaW5lZEFzc2VydGlvbk5vZGUgPT09IG51bGwpICYmXG4gICAgICAgIChzdWJwcm9vZkFzc2VydGlvbk5vZGUgPT09IG51bGwpICYmXG4gICAgICAgIChjb250YWluZWRBc3NlcnRpb25Ob2RlID09PSBudWxsKSApIHtcblxuICAgIGNvbnN0IGNvbWJpbmF0b3JzID0gbG9jYWxDb250ZXh0LmdldENvbWJpbmF0b3JzKCk7XG5cbiAgICBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9ycyA9IGNvbWJpbmF0b3JzLnNvbWUoKGNvbWJpbmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IgPSB2ZXJpZnlTdGF0ZW1lbnRBZ2FpbnN0Q29tYmluYXRvcihzdGF0ZW1lbnROb2RlLCBjb21iaW5hdG9yLCBsb2NhbENvbnRleHQpO1xuXG4gICAgICBpZiAoc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9ycztcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3Ioc3RhdGVtZW50Tm9kZSwgY29tYmluYXRvciwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yO1xuXG4gIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSksXG4gICAgICAgIGNvbWJpbmF0b3JTdHJpbmcgPSBjb21iaW5hdG9yLmdldFN0cmluZygpO1xuXG4gIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgJyR7Y29tYmluYXRvclN0cmluZ30nIGNvbWJpbmF0b3IuLi5gLCBzdGF0ZW1lbnROb2RlKTtcblxuICBjb25zdCBjb21iaW5hdG9yU3RhdGVtZW50Tm9kZSA9IGNvbWJpbmF0b3IuZ2V0U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICBub25UZXJtaW5hbE5vZGVBID0gc3RhdGVtZW50Tm9kZSwgLy8vXG4gICAgICAgIG5vblRlcm1pbmFsTm9kZUIgPSBjb21iaW5hdG9yU3RhdGVtZW50Tm9kZSwgLy8vXG4gICAgICAgIG5vblRlcm1pbmFsTm9kZVZlcmlmaWVkID0gc3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3JOb2Rlc1ZlcmlmaWVyLnZlcmlmeU5vblRlcm1pbmFsTm9kZShub25UZXJtaW5hbE5vZGVBLCBub25UZXJtaW5hbE5vZGVCLCBsb2NhbENvbnRleHQsICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2ZXJpZmllZEFoZWFkID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiB2ZXJpZmllZEFoZWFkO1xuICAgICAgICB9KTtcblxuICBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yID0gbm9uVGVybWluYWxOb2RlVmVyaWZpZWQ7ICAvLy9cblxuICBpZiAoc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcikge1xuICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhZ2FpbnN0IHRoZSAnJHtjb21iaW5hdG9yU3RyaW5nfScgY29tYmluYXRvci5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yO1xufSJdLCJuYW1lcyI6WyJ2ZXJpZnlTdGFuZGFsb25lU3RhdGVtZW50IiwidmVyaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSIsInZlcmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsImVxdWFsaXR5Tm9kZVF1ZXJ5Iiwibm9kZVF1ZXJ5IiwianVkZ2VtZW50Tm9kZVF1ZXJ5IiwibWV0YXZhcmlhYmxlTm9kZVF1ZXJ5IiwidHlwZUFzc2VydGlvbk5vZGVRdWVyeSIsImRlZmluZWRBc3NlcnRpb25Ob2RlUXVlcnkiLCJzdWJwcm9vZkFzc2VydGlvbk5vZGVRdWVyeSIsImNvbnRhaW5lZEFzc2VydGlvbk5vZGVRdWVyeSIsInZlcmlmeVN0YXRlbWVudCIsInN0YXRlbWVudE5vZGUiLCJhc3NpZ25tZW50cyIsImRlcml2ZWQiLCJsb2NhbENvbnRleHQiLCJzdGF0ZW1lbnRWZXJpZmllZCIsInN0YXRlbWVudFN0cmluZyIsIm5vZGVBc1N0cmluZyIsInRyYWNlIiwidmVyaWZ5U3RhdGVtZW50RnVuY3Rpb25zIiwidmVyaWZ5U3RhdGVtZW50QXNNZXRhdmFyaWFibGUiLCJ2ZXJpZnlTdGF0ZW1lbnRBc0p1ZGdlbWVudCIsInZlcmlmeVN0YXRlbWVudEFzRGVmaW5lZEFzc2VydGlvbiIsInZlcmlmeVN0YXRlbWVudEFzU3VicHJvb2ZBc3NlcnRpb24iLCJ2ZXJpZnlTdGF0ZW1lbnRBc0NvbnRhaW5lZEFzc2VydGlvbiIsInZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9ycyIsInNvbWUiLCJ2ZXJpZnlTdGF0ZW1lbnRGdW5jdGlvbiIsImRlYnVnIiwidmVyaWZ5QWhlYWQiLCJzdGFuZGFsb25lU3RhdGVtZW50VmVyaWZpZWQiLCJ2ZXJpZmllZEFoZWFkIiwiT2JqZWN0IiwiYXNzaWduIiwic3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3JOb2Rlc1ZlcmlmaWVyIiwic3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5IiwiZXF1YWxpdHlOb2RlIiwiZXF1YWxpdHlWZXJpZmllZCIsInZlcmlmeUVxdWFsaXR5Iiwic3RhdGVtZW50VmVyaWZpZWRBc1R5cGVBc3NlcnRpb24iLCJ0eXBlQXNzZXJ0aW9uTm9kZSIsInR5cGVBc3NlcnRpb25WZXJpZmllZCIsInZlcmlmeVR5cGVBc3NlcnRpb24iLCJzdGF0ZW1lbnRWZXJpZmllZEFzSnVkZ2VtZW50IiwianVkZ2VtZW50Tm9kZSIsImp1ZGdlbWVudFZlcmlmaWVkIiwidmVyaWZ5SnVkZ2VtZW50Iiwic3RhdGVtZW50VmVyaWZpZWRBc01ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGUiLCJmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlIiwibWV0YVR5cGVOYW1lIiwiZ2V0TWV0YVR5cGVOYW1lIiwiU1RBVEVNRU5UX01FVEFfVFlQRV9OQU1FIiwic3RhdGVtZW50VmVyaWZpZWRBc0RlZmluZWRBc3NlcnRpb24iLCJkZWZpbmVkQXNzZXJ0aW9uTm9kZSIsImRlZmluZWRBc3NlcnRpb25WZXJpZmllZCIsInZlcmlmeURlZmluZWRBc3NlcnRpb24iLCJzdGF0ZW1lbnRWZXJpZmllZEFzU3VicHJvb2ZBc3NlcnRpb24iLCJzdWJwcm9vZkFzc2VydGlvbk5vZGUiLCJzdWJwcm9vZkFzc2VydGlvblZlcmlmaWVkIiwidmVyaWZ5U3VicHJvb2ZBc3NlcnRpb24iLCJzdGF0ZW1lbnRWZXJpZmllZEFzQ29udGFpbmVkQXNzZXJ0aW9uIiwiY29udGFpbmVkQXNzZXJ0aW9uTm9kZSIsImNvbnRhaW5lZEFzc2VydGlvblZlcmlmaWVkIiwidmVyaWZ5Q29udGFpbmVkQXNzZXJ0aW9uIiwic3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcnMiLCJjb21iaW5hdG9ycyIsImdldENvbWJpbmF0b3JzIiwiY29tYmluYXRvciIsInN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IiLCJ2ZXJpZnlTdGF0ZW1lbnRBZ2FpbnN0Q29tYmluYXRvciIsImNvbWJpbmF0b3JTdHJpbmciLCJnZXRTdHJpbmciLCJjb21iaW5hdG9yU3RhdGVtZW50Tm9kZSIsImdldFN0YXRlbWVudE5vZGUiLCJub25UZXJtaW5hbE5vZGVBIiwibm9uVGVybWluYWxOb2RlQiIsIm5vblRlcm1pbmFsTm9kZVZlcmlmaWVkIiwidmVyaWZ5Tm9uVGVybWluYWxOb2RlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUFrRkEsT0FBK0I7ZUFBL0I7O0lBNUJnQkEseUJBQXlCO2VBQXpCQTs7SUE4QkFDLHlCQUF5QjtlQUF6QkE7O0lBMEJBQyw4QkFBOEI7ZUFBOUJBOzs7K0RBNUdXO2dFQUNDOzJEQUNJOzhEQUNHOytEQUNDO2dFQUNDO2lGQUNlO3FCQUUxQjs2QkFDZTs7Ozs7O0FBRXpDLElBQU1DLG9CQUFvQkMsSUFBQUEsZ0JBQVMsRUFBQyx5QkFDOUJDLHFCQUFxQkQsSUFBQUEsZ0JBQVMsRUFBQywwQkFDL0JFLHdCQUF3QkYsSUFBQUEsZ0JBQVMsRUFBQyw2QkFDbENHLHlCQUF5QkgsSUFBQUEsZ0JBQVMsRUFBQyw4QkFDbkNJLDRCQUE0QkosSUFBQUEsZ0JBQVMsRUFBQyxpQ0FDdENLLDZCQUE2QkwsSUFBQUEsZ0JBQVMsRUFBQyxrQ0FDdkNNLDhCQUE4Qk4sSUFBQUEsZ0JBQVMsRUFBQztBQUU5QyxTQUFTTyxnQkFBZ0JDLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLFlBQVk7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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-verify-cli",
3
3
  "author": "James Smith",
4
- "version": "0.0.924",
4
+ "version": "0.0.925",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-verify-cli",
7
7
  "description": "Occam's Verifier",
@@ -12,7 +12,7 @@
12
12
  "dependencies": {
13
13
  "argumentative": "^2.0.28",
14
14
  "necessary": "^14.0.1",
15
- "occam-custom-grammars": "^5.0.827",
15
+ "occam-custom-grammars": "^5.0.829",
16
16
  "occam-entities": "^1.0.149",
17
17
  "occam-file-system": "^6.0.190",
18
18
  "occam-grammar-utilities": "^8.0.207",
@@ -2,7 +2,7 @@
2
2
 
3
3
  import StatementForMetavariableSubstitution from "../../substitution/statementForMetavariable";
4
4
 
5
- function verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, localContextA, localMetaContextB, verifyAhead) {
5
+ function verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, localContextA, localContextB, verifyAhead) {
6
6
  let metavariableNodeVerified;
7
7
 
8
8
  const substitution = substitutions.find((substitution) => {
package/src/premise.js CHANGED
@@ -10,17 +10,17 @@ import { nodeQuery, nodesQuery } from "./utilities/query";
10
10
  import { statementNodeFromStatementString } from "./utilities/node";
11
11
 
12
12
  const subproofAssertionNodeQuery = nodeQuery("/statement/subproofAssertion!"),
13
- subproofPremiseStatementNodesQuery = nodesQuery("/subproof/premise/unqualifiedStatement!/statement!"),
14
13
  subproofAssertionStatementNodesQuery = nodesQuery("/subproofAssertion/statement"),
14
+ subproofSuppositionStatementNodesQuery = nodesQuery("/subproof/supposition/unqualifiedStatement!/statement!"),
15
15
  subproofLastProofStepStatementNodeQuery = nodeQuery("/subproof/subDerivation/lastProofStep/unqualifiedStatement|qualifiedStatement/statement!");
16
16
 
17
17
  export default class Premise {
18
18
  constructor(statementNode) {
19
- this.statementnode = statementNode;
19
+ this.statementNode = statementNode;
20
20
  }
21
21
 
22
22
  getStatementNode() {
23
- return this.statementnode;
23
+ return this.statementNode;
24
24
  }
25
25
 
26
26
  matchStatementNode(statementNode, substitutions, fileContext, localContext) {
@@ -51,10 +51,10 @@ export default class Premise {
51
51
  const subproofAssertionNode = subproofAssertionNodeQuery(this.statementNode);
52
52
 
53
53
  if (subproofAssertionNode !== null) {
54
- const subproofPremiseStatementNodes = subproofPremiseStatementNodesQuery(subproofNode),
54
+ const subproofSuppositionStatementNodes = subproofSuppositionStatementNodesQuery(subproofNode),
55
55
  subproofLastProofStepStatementNode = subproofLastProofStepStatementNodeQuery(subproofNode),
56
56
  subproofStatementNodes = [
57
- ...subproofPremiseStatementNodes,
57
+ ...subproofSuppositionStatementNodes,
58
58
  subproofLastProofStepStatementNode
59
59
  ],
60
60
  subproofAssertionStatementNodes = subproofAssertionStatementNodesQuery(subproofAssertionNode);
@@ -82,7 +82,7 @@ export default class Premise {
82
82
  }
83
83
 
84
84
  toJSON(tokens) {
85
- const statementString = nodeAsString(this.statementnode, tokens),
85
+ const statementString = nodeAsString(this.statementNode, tokens),
86
86
  statement = statementString, ///
87
87
  json = {
88
88
  statement
@@ -35,7 +35,7 @@ class IntrinsicLevelNodesVerifier extends NodesVerifier {
35
35
  {
36
36
  nodeQueryA: nonTerminalNodeQuery,
37
37
  nodeQueryB: nonTerminalNodeQuery,
38
- verifyNodes: (nodeA, nodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead) => {
38
+ verifyNodes: (nodeA, nodeB, substitutions, localContextA, localContextB, verifyAhead) => {
39
39
  let nonTerminalNodeVerified;
40
40
 
41
41
  const nonTerminalNodeA = nodeA, ///
@@ -43,7 +43,7 @@ class IntrinsicLevelNodesVerifier extends NodesVerifier {
43
43
 
44
44
  nonTerminalNodeVerified =
45
45
 
46
- super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead);
46
+ super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead);
47
47
 
48
48
  return nonTerminalNodeVerified;
49
49
  }
@@ -93,7 +93,7 @@ class IntrinsicLevelAgainstMetaLevelNodesVerifier extends NodesVerifier {
93
93
  {
94
94
  nodeQueryA: nonTerminalNodeQuery,
95
95
  nodeQueryB: nonTerminalNodeQuery,
96
- verifyNodes: (nodeA, nodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead) => {
96
+ verifyNodes: (nodeA, nodeB, substitutions, localContextA, localContextB, verifyAhead) => {
97
97
  let nonTerminalNodeVerified;
98
98
 
99
99
  const nonTerminalNodeA = nodeA, ///
@@ -101,7 +101,7 @@ class IntrinsicLevelAgainstMetaLevelNodesVerifier extends NodesVerifier {
101
101
 
102
102
  nonTerminalNodeVerified =
103
103
 
104
- super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead);
104
+ super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead);
105
105
 
106
106
  return nonTerminalNodeVerified;
107
107
  }
@@ -133,7 +133,7 @@ class IntrinsicLevelAgainstMetaLevelNodesVerifier extends NodesVerifier {
133
133
 
134
134
  const substitutionNode = statementSubstitutionNodeA, ///
135
135
  metavariableNodeA = statementMetavariableNodeA, ///
136
- metavariableVerifiedAgainstStatement = verifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNode, substitutions, localContextA, localContextB, verifyAhead)
136
+ metavariableVerifiedAgainstStatement = verifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNode, substitutions, localContextA, localContextB, verifyAhead);
137
137
 
138
138
  statementMetavariableNodeVerifiedAgainstStatementNode = metavariableVerifiedAgainstStatement; ///
139
139
 
@@ -8,29 +8,29 @@ import { nodeQuery } from "../../utilities/query";
8
8
  import { verifyNodes } from "../../utilities/verifier";
9
9
 
10
10
  const termNodeQuery = nodeQuery("/term!"),
11
- nonTerminalNodeQuery = nodeQuery("/*"),
12
11
  statementNodeQuery = nodeQuery("/statement!"),
12
+ nonTerminalNodeQuery = nodeQuery("/*"),
13
13
  termVariableNodeQuery = nodeQuery("/term/variable!"),
14
- statementMetavariableNodeQuery = nodeQuery("/statement/metavariable!");
14
+ metavariableNodeQuery = nodeQuery("/metavariable!");
15
15
 
16
16
  class MetaLevelNodesVerifier extends NodesVerifier {
17
- verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead) {
17
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead) {
18
18
  let nonTerminalNodeVerified;
19
19
 
20
20
  const nodeQueryMaps = [
21
21
  {
22
- nodeQueryA: statementMetavariableNodeQuery,
22
+ nodeQueryA: metavariableNodeQuery,
23
23
  nodeQueryB: statementNodeQuery,
24
- verifyNodes: (nodeA, nodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead) => {
24
+ verifyNodes: (nodeA, nodeB, substitutions, localContextA, localContextB, verifyAhead) => {
25
25
  let nonTerminalNodeVerified;
26
26
 
27
27
  const statementNodeB = nodeB, ///
28
- statementMetavariableNodeA = nodeA, ///
29
- statementMetavariableNodeVerifiedAgainstStatementNode =
28
+ metavariableNodeA = nodeA, ///
29
+ metavariableNodeVerifiedAgainstStatementNode =
30
30
 
31
- this.verifyStatementMetavariableNodeAgainstStatementNode(statementMetavariableNodeA, statementNodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead);
31
+ this.verifyMetavariableNodeAgainstStatementNode(metavariableNodeA, statementNodeB, substitutions, localContextA, localContextB, verifyAhead);
32
32
 
33
- nonTerminalNodeVerified = statementMetavariableNodeVerifiedAgainstStatementNode; ///
33
+ nonTerminalNodeVerified = metavariableNodeVerifiedAgainstStatementNode; ///
34
34
 
35
35
  return nonTerminalNodeVerified;
36
36
  }
@@ -55,7 +55,7 @@ class MetaLevelNodesVerifier extends NodesVerifier {
55
55
  {
56
56
  nodeQueryA: nonTerminalNodeQuery,
57
57
  nodeQueryB: nonTerminalNodeQuery,
58
- verifyNodes: (nodeA, nodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead) => {
58
+ verifyNodes: (nodeA, nodeB, substitutions, localContextA, localContextB, verifyAhead) => {
59
59
  let nonTerminalNodeVerified;
60
60
 
61
61
  const nonTerminalNodeA = nodeA, ///
@@ -63,30 +63,29 @@ class MetaLevelNodesVerifier extends NodesVerifier {
63
63
 
64
64
  nonTerminalNodeVerified =
65
65
 
66
- super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead);
66
+ super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead);
67
67
 
68
68
  return nonTerminalNodeVerified;
69
69
  }
70
70
  }
71
71
  ];
72
72
 
73
- const nodesVerified = verifyNodes(nodeQueryMaps, nonTerminalNodeA, nonTerminalNodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead);
73
+ const nodesVerified = verifyNodes(nodeQueryMaps, nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead);
74
74
 
75
75
  nonTerminalNodeVerified = nodesVerified; ///
76
76
 
77
77
  return nonTerminalNodeVerified;
78
78
  }
79
79
 
80
- verifyStatementMetavariableNodeAgainstStatementNode(statementMetavariableNodeA, statementNodeB, substitutions, localMetaContextA, localMetaContextB, verifyAhead) {
81
- let statementMetavariableNodeVerifiedAgainstStatementNode;
80
+ verifyMetavariableNodeAgainstStatementNode(metavariableNodeA, statementNodeB, substitutions, localContextA, localContextB, verifyAhead) {
81
+ let metavariableNodeVerifiedAgainstStatementNode;
82
82
 
83
- const metavariableNode = statementMetavariableNodeA, ///
84
- statementNode = statementNodeB, ///
85
- metavariableVerifiedAgainstStatement = verifyMetavariableAgainstStatement(metavariableNode, statementNode, substitutions, verifyAhead);
83
+ const substitutionNode = null,
84
+ metavariableVerifiedAgainstStatement = verifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNode, substitutions, localContextA, localContextB, verifyAhead);
86
85
 
87
- statementMetavariableNodeVerifiedAgainstStatementNode = metavariableVerifiedAgainstStatement; ///
86
+ metavariableNodeVerifiedAgainstStatementNode = metavariableVerifiedAgainstStatement; ///
88
87
 
89
- return statementMetavariableNodeVerifiedAgainstStatementNode;
88
+ return metavariableNodeVerifiedAgainstStatementNode;
90
89
  }
91
90
 
92
91
  verifyTermVariableNodeAgainstTermNode(termVariableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
 
3
- import metaLevelNodeVerifier from "../verifier/node/metaLevel";
3
+ import metaLevelNodeVerifier from "../../verifier/node/metaLevel";
4
4
 
5
- import { isStatementNegated } from "../utilities/verify";
6
- import { nodeQuery, nodesQuery } from "../utilities/query";
5
+ import { isStatementNegated } from "../../utilities/verify";
6
+ import { nodeQuery, nodesQuery } from "../../utilities/query";
7
7
 
8
8
  const termNodeQuery = nodeQuery("/statement/term!"),
9
9
  statementTermNodesQuery = nodesQuery("/statement/metaArgument/statement//term");
@@ -1,12 +1,11 @@
1
1
  "use strict";
2
2
 
3
- import verifyTerm from "./term";
4
- import metaLevelNodeVerifier from "../verifier/node/metaLevel";
3
+ import verifyTerm from "../../verify/term";
4
+ import metaLevelNodeVerifier from "../../verifier/node/metaLevel";
5
5
 
6
- import { first } from "../utilities/array";
7
- import { DEFINED } from "../constants";
8
- import { nodeQuery } from "../utilities/query";
9
- import { isAssertionNegated } from "../utilities/verify";
6
+ import { first } from "../../utilities/array";
7
+ import { nodeQuery } from "../../utilities/query";
8
+ import { isAssertionNegated } from "../../utilities/verify";
10
9
 
11
10
  const termNodeQuery = nodeQuery("/statement/term!"),
12
11
  variableNodeQuery = nodeQuery("/statement/term/variable!");