occam-verify-cli 1.0.436 → 1.0.438
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.
- package/lib/element/derivation.js +3 -3
- package/lib/element/label.js +16 -18
- package/lib/element/premise.js +22 -22
- package/lib/element/rule.js +30 -54
- package/lib/element/statement.js +43 -45
- package/lib/element/step.js +14 -14
- package/lib/element/subDerivation.js +3 -3
- package/lib/element.js +19 -1
- package/lib/mixins/statement/validate.js +198 -0
- package/lib/utilities/element.js +10 -7
- package/lib/utilities/statement.js +11 -16
- package/package.json +10 -10
- package/src/element/derivation.js +2 -2
- package/src/element/label.js +11 -18
- package/src/element/premise.js +17 -16
- package/src/element/rule.js +30 -75
- package/src/element/statement.js +59 -44
- package/src/element/step.js +12 -12
- package/src/element/subDerivation.js +2 -2
- package/src/element.js +12 -0
- package/src/mixins/statement/validate.js +295 -0
- package/src/utilities/element.js +13 -9
- package/src/utilities/statement.js +27 -28
- package/lib/mixins/statement/verify.js +0 -198
- package/src/mixins/statement/verify.js +0 -295
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "default", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return _default;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _elements = /*#__PURE__*/ _interop_require_default(require("../../elements"));
|
|
12
|
+
var _statement = require("../../utilities/statement");
|
|
13
|
+
function _interop_require_default(obj) {
|
|
14
|
+
return obj && obj.__esModule ? obj : {
|
|
15
|
+
default: obj
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function validateAsMetavariableAndSubstitution(statement, assignments, stated, context) {
|
|
19
|
+
var validatesAsMetavariableAndSubstitution = false;
|
|
20
|
+
var metavariable = (0, _statement.metavariableFromStatement)(statement, context);
|
|
21
|
+
if (metavariable !== null) {
|
|
22
|
+
var statementString = statement.getString();
|
|
23
|
+
context.trace("Validating the '".concat(statementString, "' statement as a metavariable and substitution..."));
|
|
24
|
+
var metavariableValidates = metavariable.validate(context);
|
|
25
|
+
if (metavariableValidates) {
|
|
26
|
+
var TermSubstitution = _elements.default.TermSubstitution, FrameSubstitution = _elements.default.FrameSubstitution, frameSubstitution = FrameSubstitution.fromStatement(statement, context), termSubstitution = TermSubstitution.fromStatement(statement, context), substitution = termSubstitution || frameSubstitution;
|
|
27
|
+
if (substitution !== null) {
|
|
28
|
+
var substitutionValidates = substitution.validate(context);
|
|
29
|
+
if (substitutionValidates) {
|
|
30
|
+
validatesAsMetavariableAndSubstitution = true;
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
validatesAsMetavariableAndSubstitution = true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (validatesAsMetavariableAndSubstitution) {
|
|
37
|
+
context.debug("...validated the '".concat(statementString, "' statement as a metavariable and substitution."));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return validatesAsMetavariableAndSubstitution;
|
|
41
|
+
}
|
|
42
|
+
function unifyWithBracketedCombinatorStatement(statement, assignments, stated, context) {
|
|
43
|
+
stated = true; ///
|
|
44
|
+
assignments = null; ///
|
|
45
|
+
var BracketedCombinatorStatement = _elements.default.BracketedCombinatorStatement, bracketedCombinatorStatement = BracketedCombinatorStatement.fromNothing(), unifiesWithBracketedCombinatorStatement = bracketedCombinatorStatement.unifyStatement(statement, assignments, stated, context);
|
|
46
|
+
return unifiesWithBracketedCombinatorStatement;
|
|
47
|
+
}
|
|
48
|
+
function unifyWithCombinators(statement, assignments, stated, context) {
|
|
49
|
+
stated = true; ///
|
|
50
|
+
assignments = null; ///
|
|
51
|
+
var combinators = context.getCombinators(), unifiesWithCombinators = combinators.some(function(combinator) {
|
|
52
|
+
var unifiesWithCombinator = combinator.unifyStatement(statement, assignments, stated, context);
|
|
53
|
+
if (unifiesWithCombinator) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return unifiesWithCombinators;
|
|
58
|
+
}
|
|
59
|
+
function validateAsEquality(statement, assignments, stated, context) {
|
|
60
|
+
var validatesAsEquality = false;
|
|
61
|
+
var equality = (0, _statement.equalityFromStatement)(statement, context);
|
|
62
|
+
if (equality !== null) {
|
|
63
|
+
var statementString = statement.getString();
|
|
64
|
+
context.trace("Validating the '".concat(statementString, "' statement as an equality..."));
|
|
65
|
+
var equalityValidates = equality.validate(assignments, stated, context);
|
|
66
|
+
validatesAsEquality = equalityValidates; ///
|
|
67
|
+
if (validatesAsEquality) {
|
|
68
|
+
context.debug("...validated the '".concat(statementString, "' statement as an equality."));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return validatesAsEquality;
|
|
72
|
+
}
|
|
73
|
+
function validateAsJudgement(statement, assignments, stated, context) {
|
|
74
|
+
var validatesAsJudgement = false;
|
|
75
|
+
var judgement = (0, _statement.judgementFromStatement)(statement, context);
|
|
76
|
+
if (judgement !== null) {
|
|
77
|
+
var statementString = statement.getString();
|
|
78
|
+
context.trace("Validating the '".concat(statementString, "' statement as a judgement..."));
|
|
79
|
+
var judgementValidates = judgement.validate(assignments, stated, context);
|
|
80
|
+
validatesAsJudgement = judgementValidates; ///
|
|
81
|
+
if (validatesAsJudgement) {
|
|
82
|
+
context.debug("...validated the '".concat(statementString, "' statement as a judgement."));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return validatesAsJudgement;
|
|
86
|
+
}
|
|
87
|
+
function validateAsTypeAssertion(statement, assignments, stated, context) {
|
|
88
|
+
var validatesAsTypeAssertion = false;
|
|
89
|
+
var typeAssertion = (0, _statement.typeAssertionFromStatement)(statement, context);
|
|
90
|
+
if (typeAssertion !== null) {
|
|
91
|
+
var statementString = statement.getString();
|
|
92
|
+
context.trace("Validating the '".concat(statementString, "' statement as a type assertion..."));
|
|
93
|
+
var typeAssertionValidates = typeAssertion.validate(assignments, stated, context);
|
|
94
|
+
validatesAsTypeAssertion = typeAssertionValidates; ///
|
|
95
|
+
if (validatesAsTypeAssertion) {
|
|
96
|
+
var assertion = typeAssertion; ///
|
|
97
|
+
context.addAssertion(assertion);
|
|
98
|
+
context.debug("...validated the '".concat(statementString, "' statement as a type assertion."));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return validatesAsTypeAssertion;
|
|
102
|
+
}
|
|
103
|
+
function validateAsDefinedAssertion(statement, assignments, stated, context) {
|
|
104
|
+
var validatesAsDefinedAssertion = false;
|
|
105
|
+
var definedAssertion = (0, _statement.definedAssertionFromStatement)(statement, context);
|
|
106
|
+
if (definedAssertion !== null) {
|
|
107
|
+
var statementString = statement.getString();
|
|
108
|
+
context.trace("Validating the '".concat(statementString, "' statement as a defined assertion..."));
|
|
109
|
+
var definedAssertionValidates = definedAssertion.validate(assignments, stated, context);
|
|
110
|
+
validatesAsDefinedAssertion = definedAssertionValidates; ///
|
|
111
|
+
if (validatesAsDefinedAssertion) {
|
|
112
|
+
var assertion = definedAssertion; ///
|
|
113
|
+
context.addAssertion(assertion);
|
|
114
|
+
context.debug("...validated the '".concat(statementString, "' statement as a defined assertion."));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return validatesAsDefinedAssertion;
|
|
118
|
+
}
|
|
119
|
+
function validateAsPropertyAssertion(statement, assignments, stated, context) {
|
|
120
|
+
var validatesAsPropertyAssertion = false;
|
|
121
|
+
var propertyAssertion = (0, _statement.propertyAssertionFromStatement)(statement, context);
|
|
122
|
+
if (propertyAssertion !== null) {
|
|
123
|
+
var statementString = statement.getString();
|
|
124
|
+
context.trace("Validating the '".concat(statementString, "' statement as a property assertion..."));
|
|
125
|
+
var propertyAssertionValidates = propertyAssertion.validate(assignments, stated, context);
|
|
126
|
+
validatesAsPropertyAssertion = propertyAssertionValidates; ///
|
|
127
|
+
if (validatesAsPropertyAssertion) {
|
|
128
|
+
var assertion = propertyAssertion; ///
|
|
129
|
+
context.addAssertion(assertion);
|
|
130
|
+
context.debug("...validated the '".concat(statementString, "' statement as a property assertion."));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return validatesAsPropertyAssertion;
|
|
134
|
+
}
|
|
135
|
+
function validateAsSubproofAssertion(statement, assignments, stated, context) {
|
|
136
|
+
var validatesAsSubproofAssertion = false;
|
|
137
|
+
var subproofAssertion = (0, _statement.subproofAssertionFromStatement)(statement, context);
|
|
138
|
+
if (subproofAssertion !== null) {
|
|
139
|
+
var statementString = statement.getString();
|
|
140
|
+
context.trace("Validating the '".concat(statementString, "' statement as a subproof assertion..."));
|
|
141
|
+
var subproofAssertionValidates = subproofAssertion.validate(assignments, stated, context);
|
|
142
|
+
validatesAsSubproofAssertion = subproofAssertionValidates; ///
|
|
143
|
+
if (validatesAsSubproofAssertion) {
|
|
144
|
+
var assertion = subproofAssertion; ///
|
|
145
|
+
context.addAssertion(assertion);
|
|
146
|
+
context.debug("...validated the '".concat(statementString, "' statement as a subproof assertion."));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return validatesAsSubproofAssertion;
|
|
150
|
+
}
|
|
151
|
+
function validateAsContainedAssertion(statement, assignments, stated, context) {
|
|
152
|
+
var validatesAsContainedAssertion = false;
|
|
153
|
+
var containedAssertion = (0, _statement.containedAssertionFromStatement)(statement, context);
|
|
154
|
+
if (containedAssertion !== null) {
|
|
155
|
+
var statementString = statement.getString();
|
|
156
|
+
context.trace("Validating the '".concat(statementString, "' statement as a contained assertion..."));
|
|
157
|
+
var containedAssertionValidates = containedAssertion.validate(assignments, stated, context);
|
|
158
|
+
validatesAsContainedAssertion = containedAssertionValidates; ///
|
|
159
|
+
if (validatesAsContainedAssertion) {
|
|
160
|
+
var assertion = containedAssertion; ///
|
|
161
|
+
context.addAssertion(assertion);
|
|
162
|
+
context.debug("...validated the '".concat(statementString, "' statement as a contained assertion."));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return validatesAsContainedAssertion;
|
|
166
|
+
}
|
|
167
|
+
function validateAsSatisfiesAssertion(statement, assignments, stated, context) {
|
|
168
|
+
var validatesAsSatisfiesAssertion = false;
|
|
169
|
+
var satisfiesAssertion = (0, _statement.satisfiesAssertionFromStatement)(statement, context);
|
|
170
|
+
if (satisfiesAssertion !== null) {
|
|
171
|
+
var statementString = statement.getString();
|
|
172
|
+
context.trace("Validating the '".concat(statementString, "' statement as a satisfies assertion..."));
|
|
173
|
+
var satisfiesAssertionValidates = satisfiesAssertion.validate(assignments, stated, context);
|
|
174
|
+
validatesAsSatisfiesAssertion = satisfiesAssertionValidates; ///
|
|
175
|
+
if (validatesAsSatisfiesAssertion) {
|
|
176
|
+
var assertion = satisfiesAssertion; ///
|
|
177
|
+
context.addAssertion(assertion);
|
|
178
|
+
context.debug("...validated the '".concat(statementString, "' statement as a satisfies assertion."));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return validatesAsSatisfiesAssertion;
|
|
182
|
+
}
|
|
183
|
+
var validateMixins = [
|
|
184
|
+
validateAsMetavariableAndSubstitution,
|
|
185
|
+
unifyWithBracketedCombinatorStatement,
|
|
186
|
+
unifyWithCombinators,
|
|
187
|
+
validateAsEquality,
|
|
188
|
+
validateAsJudgement,
|
|
189
|
+
validateAsTypeAssertion,
|
|
190
|
+
validateAsDefinedAssertion,
|
|
191
|
+
validateAsPropertyAssertion,
|
|
192
|
+
validateAsSubproofAssertion,
|
|
193
|
+
validateAsContainedAssertion,
|
|
194
|
+
validateAsSatisfiesAssertion
|
|
195
|
+
];
|
|
196
|
+
var _default = validateMixins;
|
|
197
|
+
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9taXhpbnMvc3RhdGVtZW50L3ZhbGlkYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uLy4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IGVxdWFsaXR5RnJvbVN0YXRlbWVudCxcbiAgICAgICAgIGp1ZGdlbWVudEZyb21TdGF0ZW1lbnQsXG4gICAgICAgICBtZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50LFxuICAgICAgICAgdHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnQsXG4gICAgICAgICBkZWZpbmVkQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIHN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCxcbiAgICAgICAgIGNvbnRhaW5lZEFzc2VydGlvbkZyb21TdGF0ZW1lbnQsXG4gICAgICAgICBzYXRpc2ZpZXNBc3NlcnRpb25Gcm9tU3RhdGVtZW50IH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9zdGF0ZW1lbnRcIjtcblxuZnVuY3Rpb24gdmFsaWRhdGVBc01ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbihzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBtZXRhdmFyaWFibGUgYW5kIHN1YnN0aXR1dGlvbi4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlVmFsaWRhdGVzID0gbWV0YXZhcmlhYmxlLnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZVZhbGlkYXRlcykge1xuICAgICAgY29uc3QgeyBUZXJtU3Vic3RpdHV0aW9uLCBGcmFtZVN1YnN0aXR1dGlvbiB9ID0gZWxlbWVudHMsXG4gICAgICAgICAgICBmcmFtZVN1YnN0aXR1dGlvbiA9IEZyYW1lU3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSxcbiAgICAgICAgICAgIHRlcm1TdWJzdGl0dXRpb24gPSBUZXJtU3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSxcbiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9ICh0ZXJtU3Vic3RpdHV0aW9uIHx8IGZyYW1lU3Vic3RpdHV0aW9uKTtcblxuICAgICAgaWYgKHN1YnN0aXR1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25WYWxpZGF0ZXMgPSBzdWJzdGl0dXRpb24udmFsaWRhdGUoY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHN1YnN0aXR1dGlvblZhbGlkYXRlcykge1xuICAgICAgICAgIHZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdGVzQXNNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZXNBc01ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbikge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBtZXRhdmFyaWFibGUgYW5kIHN1YnN0aXR1dGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb247XG59XG5cbmZ1bmN0aW9uIHVuaWZ5V2l0aEJyYWNrZXRlZENvbWJpbmF0b3JTdGF0ZW1lbnQoc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIHN0YXRlZCA9IHRydWU7ICAvLy9cblxuICBhc3NpZ25tZW50cyA9IG51bGw7IC8vL1xuXG4gIGNvbnN0IHsgQnJhY2tldGVkQ29tYmluYXRvclN0YXRlbWVudCB9ID0gZWxlbWVudHMsXG4gICAgICAgIGJyYWNrZXRlZENvbWJpbmF0b3JTdGF0ZW1lbnQgPSBCcmFja2V0ZWRDb21iaW5hdG9yU3RhdGVtZW50LmZyb21Ob3RoaW5nKCksXG4gICAgICAgIHVuaWZpZXNXaXRoQnJhY2tldGVkQ29tYmluYXRvclN0YXRlbWVudCA9IGJyYWNrZXRlZENvbWJpbmF0b3JTdGF0ZW1lbnQudW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICByZXR1cm4gdW5pZmllc1dpdGhCcmFja2V0ZWRDb21iaW5hdG9yU3RhdGVtZW50O1xufVxuXG5mdW5jdGlvbiB1bmlmeVdpdGhDb21iaW5hdG9ycyhzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgc3RhdGVkID0gdHJ1ZTsgIC8vL1xuXG4gIGFzc2lnbm1lbnRzID0gbnVsbDsgLy8vXG5cbiAgY29uc3QgY29tYmluYXRvcnMgPSBjb250ZXh0LmdldENvbWJpbmF0b3JzKCksXG4gICAgICAgIHVuaWZpZXNXaXRoQ29tYmluYXRvcnMgPSBjb21iaW5hdG9ycy5zb21lKChjb21iaW5hdG9yKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5pZmllc1dpdGhDb21iaW5hdG9yID0gY29tYmluYXRvci51bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKHVuaWZpZXNXaXRoQ29tYmluYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICByZXR1cm4gdW5pZmllc1dpdGhDb21iaW5hdG9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBc0VxdWFsaXR5KHN0YXRlbWVudCwgYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCkge1xuICBsZXQgdmFsaWRhdGVzQXNFcXVhbGl0eSA9IGZhbHNlO1xuXG4gIGNvbnN0IGVxdWFsaXR5ID0gZXF1YWxpdHlGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKGVxdWFsaXR5ICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5Li4uYCk7XG5cbiAgICBjb25zdCBlcXVhbGl0eVZhbGlkYXRlcyA9IGVxdWFsaXR5LnZhbGlkYXRlKGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgdmFsaWRhdGVzQXNFcXVhbGl0eSA9IGVxdWFsaXR5VmFsaWRhdGVzOyAvLy9cblxuICAgIGlmICh2YWxpZGF0ZXNBc0VxdWFsaXR5KSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhbiBlcXVhbGl0eS5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNFcXVhbGl0eTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBc0p1ZGdlbWVudChzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc0FzSnVkZ2VtZW50ID0gZmFsc2U7XG5cbiAgY29uc3QganVkZ2VtZW50ID0ganVkZ2VtZW50RnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChqdWRnZW1lbnQgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBqdWRnZW1lbnQuLi5gKTtcblxuICAgIGNvbnN0IGp1ZGdlbWVudFZhbGlkYXRlcyA9IGp1ZGdlbWVudC52YWxpZGF0ZShhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICAgIHZhbGlkYXRlc0FzSnVkZ2VtZW50ID0ganVkZ2VtZW50VmFsaWRhdGVzOyAgLy8vXG5cbiAgICBpZiAodmFsaWRhdGVzQXNKdWRnZW1lbnQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEganVkZ2VtZW50LmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZXNBc0p1ZGdlbWVudDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBc1R5cGVBc3NlcnRpb24oc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNBc1R5cGVBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB0eXBlQXNzZXJ0aW9uID0gdHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAodHlwZUFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHR5cGUgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBjb25zdCB0eXBlQXNzZXJ0aW9uVmFsaWRhdGVzID0gdHlwZUFzc2VydGlvbi52YWxpZGF0ZShhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICAgIHZhbGlkYXRlc0FzVHlwZUFzc2VydGlvbiA9IHR5cGVBc3NlcnRpb25WYWxpZGF0ZXM7IC8vL1xuXG4gICAgaWYgKHZhbGlkYXRlc0FzVHlwZUFzc2VydGlvbikge1xuICAgICAgY29uc3QgYXNzZXJ0aW9uID0gdHlwZUFzc2VydGlvbjsgIC8vL1xuXG4gICAgICBjb250ZXh0LmFkZEFzc2VydGlvbihhc3NlcnRpb24pO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHR5cGUgYXNzZXJ0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZXNBc1R5cGVBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXNEZWZpbmVkQXNzZXJ0aW9uKHN0YXRlbWVudCwgYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCkge1xuICBsZXQgdmFsaWRhdGVzQXNEZWZpbmVkQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgZGVmaW5lZEFzc2VydGlvbiA9IGRlZmluZWRBc3NlcnRpb25Gcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKGRlZmluZWRBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBkZWZpbmVkIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3QgZGVmaW5lZEFzc2VydGlvblZhbGlkYXRlcyA9IGRlZmluZWRBc3NlcnRpb24udmFsaWRhdGUoYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG5cbiAgICB2YWxpZGF0ZXNBc0RlZmluZWRBc3NlcnRpb24gPSBkZWZpbmVkQXNzZXJ0aW9uVmFsaWRhdGVzOyAvLy9cblxuICAgIGlmICh2YWxpZGF0ZXNBc0RlZmluZWRBc3NlcnRpb24pIHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbiA9IGRlZmluZWRBc3NlcnRpb247ICAvLy9cblxuICAgICAgY29udGV4dC5hZGRBc3NlcnRpb24oYXNzZXJ0aW9uKTtcblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBkZWZpbmVkIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNEZWZpbmVkQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFzUHJvcGVydHlBc3NlcnRpb24oc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgcHJvcGVydHlBc3NlcnRpb24gPSBwcm9wZXJ0eUFzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAocHJvcGVydHlBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uLi5gKTtcblxuICAgIGNvbnN0IHByb3BlcnR5QXNzZXJ0aW9uVmFsaWRhdGVzID0gcHJvcGVydHlBc3NlcnRpb24udmFsaWRhdGUoYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG5cbiAgICB2YWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uID0gcHJvcGVydHlBc3NlcnRpb25WYWxpZGF0ZXM7IC8vL1xuXG4gICAgaWYgKHZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb24pIHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbiA9IHByb3BlcnR5QXNzZXJ0aW9uOyAvLy9cblxuICAgICAgY29udGV4dC5hZGRBc3NlcnRpb24oYXNzZXJ0aW9uKTtcblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBwcm9wZXJ0eSBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlc0FzUHJvcGVydHlBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXNTdWJwcm9vZkFzc2VydGlvbihzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCBzdWJwcm9vZkFzc2VydGlvbiA9IHN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChzdWJwcm9vZkFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHN1YnByb29mIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3Qgc3VicHJvb2ZBc3NlcnRpb25WYWxpZGF0ZXMgPSBzdWJwcm9vZkFzc2VydGlvbi52YWxpZGF0ZShhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICAgIHZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24gPSBzdWJwcm9vZkFzc2VydGlvblZhbGlkYXRlczsgLy8vXG5cbiAgICBpZiAodmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbikge1xuICAgICAgY29uc3QgYXNzZXJ0aW9uID0gc3VicHJvb2ZBc3NlcnRpb247IC8vL1xuXG4gICAgICBjb250ZXh0LmFkZEFzc2VydGlvbihhc3NlcnRpb24pO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHN1YnByb29mIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNTdWJwcm9vZkFzc2VydGlvbjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBc0NvbnRhaW5lZEFzc2VydGlvbihzdGF0ZW1lbnQsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHZhbGlkYXRlc0FzQ29udGFpbmVkQXNzZXJ0aW9uID0gZmFsc2U7XG5cbiAgY29uc3QgY29udGFpbmVkQXNzZXJ0aW9uID0gY29udGFpbmVkQXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChjb250YWluZWRBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYSBjb250YWluZWQgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBjb25zdCBjb250YWluZWRBc3NlcnRpb25WYWxpZGF0ZXMgPSBjb250YWluZWRBc3NlcnRpb24udmFsaWRhdGUoYXNzaWdubWVudHMsIHN0YXRlZCwgY29udGV4dCk7XG5cbiAgICB2YWxpZGF0ZXNBc0NvbnRhaW5lZEFzc2VydGlvbiA9IGNvbnRhaW5lZEFzc2VydGlvblZhbGlkYXRlczsgLy8vXG5cbiAgICBpZiAodmFsaWRhdGVzQXNDb250YWluZWRBc3NlcnRpb24pIHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbiA9IGNvbnRhaW5lZEFzc2VydGlvbjsgLy8vXG5cbiAgICAgIGNvbnRleHQuYWRkQXNzZXJ0aW9uKGFzc2VydGlvbik7XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgY29udGFpbmVkIGFzc2VydGlvbi5gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVzQXNDb250YWluZWRBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXNTYXRpc2ZpZXNBc3NlcnRpb24oc3RhdGVtZW50LCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIGxldCB2YWxpZGF0ZXNBc1NhdGlzZmllc0Fzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0IHNhdGlzZmllc0Fzc2VydGlvbiA9IHNhdGlzZmllc0Fzc2VydGlvbkZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICBpZiAoc2F0aXNmaWVzQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGEgc2F0aXNmaWVzIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3Qgc2F0aXNmaWVzQXNzZXJ0aW9uVmFsaWRhdGVzID0gc2F0aXNmaWVzQXNzZXJ0aW9uLnZhbGlkYXRlKGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgdmFsaWRhdGVzQXNTYXRpc2ZpZXNBc3NlcnRpb24gPSBzYXRpc2ZpZXNBc3NlcnRpb25WYWxpZGF0ZXM7IC8vL1xuXG4gICAgaWYgKHZhbGlkYXRlc0FzU2F0aXNmaWVzQXNzZXJ0aW9uKSB7XG4gICAgICBjb25zdCBhc3NlcnRpb24gPSBzYXRpc2ZpZXNBc3NlcnRpb247IC8vL1xuXG4gICAgICBjb250ZXh0LmFkZEFzc2VydGlvbihhc3NlcnRpb24pO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBhcyBhIHNhdGlzZmllcyBhc3NlcnRpb24uYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlc0FzU2F0aXNmaWVzQXNzZXJ0aW9uO1xufVxuXG5jb25zdCB2YWxpZGF0ZU1peGlucyA9IFtcbiAgdmFsaWRhdGVBc01ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbixcbiAgdW5pZnlXaXRoQnJhY2tldGVkQ29tYmluYXRvclN0YXRlbWVudCxcbiAgdW5pZnlXaXRoQ29tYmluYXRvcnMsXG4gIHZhbGlkYXRlQXNFcXVhbGl0eSxcbiAgdmFsaWRhdGVBc0p1ZGdlbWVudCxcbiAgdmFsaWRhdGVBc1R5cGVBc3NlcnRpb24sXG4gIHZhbGlkYXRlQXNEZWZpbmVkQXNzZXJ0aW9uLFxuICB2YWxpZGF0ZUFzUHJvcGVydHlBc3NlcnRpb24sXG4gIHZhbGlkYXRlQXNTdWJwcm9vZkFzc2VydGlvbixcbiAgdmFsaWRhdGVBc0NvbnRhaW5lZEFzc2VydGlvbixcbiAgdmFsaWRhdGVBc1NhdGlzZmllc0Fzc2VydGlvblxuXTtcblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGVNaXhpbnM7XG4iXSwibmFtZXMiOlsidmFsaWRhdGVBc01ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbiIsInN0YXRlbWVudCIsImFzc2lnbm1lbnRzIiwic3RhdGVkIiwiY29udGV4dCIsInZhbGlkYXRlc0FzTWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uIiwibWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudCIsInN0YXRlbWVudFN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwibWV0YXZhcmlhYmxlVmFsaWRhdGVzIiwidmFsaWRhdGUiLCJUZXJtU3Vic3RpdHV0aW9uIiwiZWxlbWVudHMiLCJGcmFtZVN1YnN0aXR1dGlvbiIsImZyYW1lU3Vic3RpdHV0aW9uIiwiZnJvbVN0YXRlbWVudCIsInRlcm1TdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb25WYWxpZGF0ZXMiLCJkZWJ1ZyIsInVuaWZ5V2l0aEJyYWNrZXRlZENvbWJpbmF0b3JTdGF0ZW1lbnQiLCJCcmFja2V0ZWRDb21iaW5hdG9yU3RhdGVtZW50IiwiYnJhY2tldGVkQ29tYmluYXRvclN0YXRlbWVudCIsImZyb21Ob3RoaW5nIiwidW5pZmllc1dpdGhCcmFja2V0ZWRDb21iaW5hdG9yU3RhdGVtZW50IiwidW5pZnlTdGF0ZW1lbnQiLCJ1bmlmeVdpdGhDb21iaW5hdG9ycyIsImNvbWJpbmF0b3JzIiwiZ2V0Q29tYmluYXRvcnMiLCJ1bmlmaWVzV2l0aENvbWJpbmF0b3JzIiwic29tZSIsImNvbWJpbmF0b3IiLCJ1bmlmaWVzV2l0aENvbWJpbmF0b3IiLCJ2YWxpZGF0ZUFzRXF1YWxpdHkiLCJ2YWxpZGF0ZXNBc0VxdWFsaXR5IiwiZXF1YWxpdHkiLCJlcXVhbGl0eUZyb21TdGF0ZW1lbnQiLCJlcXVhbGl0eVZhbGlkYXRlcyIsInZhbGlkYXRlQXNKdWRnZW1lbnQiLCJ2YWxpZGF0ZXNBc0p1ZGdlbWVudCIsImp1ZGdlbWVudCIsImp1ZGdlbWVudEZyb21TdGF0ZW1lbnQiLCJqdWRnZW1lbnRWYWxpZGF0ZXMiLCJ2YWxpZGF0ZUFzVHlwZUFzc2VydGlvbiIsInZhbGlkYXRlc0FzVHlwZUFzc2VydGlvbiIsInR5cGVBc3NlcnRpb24iLCJ0eXBlQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsInR5cGVBc3NlcnRpb25WYWxpZGF0ZXMiLCJhc3NlcnRpb24iLCJhZGRBc3NlcnRpb24iLCJ2YWxpZGF0ZUFzRGVmaW5lZEFzc2VydGlvbiIsInZhbGlkYXRlc0FzRGVmaW5lZEFzc2VydGlvbiIsImRlZmluZWRBc3NlcnRpb24iLCJkZWZpbmVkQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsImRlZmluZWRBc3NlcnRpb25WYWxpZGF0ZXMiLCJ2YWxpZGF0ZUFzUHJvcGVydHlBc3NlcnRpb24iLCJ2YWxpZGF0ZXNBc1Byb3BlcnR5QXNzZXJ0aW9uIiwicHJvcGVydHlBc3NlcnRpb24iLCJwcm9wZXJ0eUFzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJwcm9wZXJ0eUFzc2VydGlvblZhbGlkYXRlcyIsInZhbGlkYXRlQXNTdWJwcm9vZkFzc2VydGlvbiIsInZhbGlkYXRlc0FzU3VicHJvb2ZBc3NlcnRpb24iLCJzdWJwcm9vZkFzc2VydGlvbiIsInN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsInN1YnByb29mQXNzZXJ0aW9uVmFsaWRhdGVzIiwidmFsaWRhdGVBc0NvbnRhaW5lZEFzc2VydGlvbiIsInZhbGlkYXRlc0FzQ29udGFpbmVkQXNzZXJ0aW9uIiwiY29udGFpbmVkQXNzZXJ0aW9uIiwiY29udGFpbmVkQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsImNvbnRhaW5lZEFzc2VydGlvblZhbGlkYXRlcyIsInZhbGlkYXRlQXNTYXRpc2ZpZXNBc3NlcnRpb24iLCJ2YWxpZGF0ZXNBc1NhdGlzZmllc0Fzc2VydGlvbiIsInNhdGlzZmllc0Fzc2VydGlvbiIsInNhdGlzZmllc0Fzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJzYXRpc2ZpZXNBc3NlcnRpb25WYWxpZGF0ZXMiLCJ2YWxpZGF0ZU1peGlucyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBc1NBOzs7ZUFBQTs7OytEQXBTcUI7eUJBVTJCOzs7Ozs7QUFFaEQsU0FBU0Esc0NBQXNDQyxTQUFTLEVBQUVDLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxPQUFPO0lBQ3BGLElBQUlDLHlDQUF5QztJQUU3QyxJQUFNQyxlQUFlQyxJQUFBQSxvQ0FBeUIsRUFBQ04sV0FBV0c7SUFFMUQsSUFBSUUsaUJBQWlC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
|