@witnet/sdk 1.0.0-beta.0
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/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/package.json +72 -0
- package/dist/src/bin/helpers.d.ts +91 -0
- package/dist/src/bin/helpers.d.ts.map +1 -0
- package/dist/src/bin/helpers.js +816 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +47 -0
- package/dist/src/lib/crypto/account.d.ts +32 -0
- package/dist/src/lib/crypto/account.d.ts.map +1 -0
- package/dist/src/lib/crypto/account.js +106 -0
- package/dist/src/lib/crypto/coinbase.d.ts +10 -0
- package/dist/src/lib/crypto/coinbase.d.ts.map +1 -0
- package/dist/src/lib/crypto/coinbase.js +28 -0
- package/dist/src/lib/crypto/index.d.ts +8 -0
- package/dist/src/lib/crypto/index.d.ts.map +1 -0
- package/dist/src/lib/crypto/index.js +30 -0
- package/dist/src/lib/crypto/interfaces.d.ts +85 -0
- package/dist/src/lib/crypto/interfaces.d.ts.map +1 -0
- package/dist/src/lib/crypto/interfaces.js +3 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +55 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.js +339 -0
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts +28 -0
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/StakePayload.js +142 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +36 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.js +154 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +25 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +128 -0
- package/dist/src/lib/crypto/payloads.d.ts +57 -0
- package/dist/src/lib/crypto/payloads.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads.js +170 -0
- package/dist/src/lib/crypto/signer.d.ts +33 -0
- package/dist/src/lib/crypto/signer.d.ts.map +1 -0
- package/dist/src/lib/crypto/signer.js +194 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +15 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.js +23 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +12 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.js +17 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +18 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +53 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +11 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.js +16 -0
- package/dist/src/lib/crypto/transmitters.d.ts +47 -0
- package/dist/src/lib/crypto/transmitters.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters.js +416 -0
- package/dist/src/lib/crypto/types.d.ts +161 -0
- package/dist/src/lib/crypto/types.d.ts.map +1 -0
- package/dist/src/lib/crypto/types.js +273 -0
- package/dist/src/lib/crypto/utils.d.ts +21 -0
- package/dist/src/lib/crypto/utils.d.ts.map +1 -0
- package/dist/src/lib/crypto/utils.js +156 -0
- package/dist/src/lib/crypto/wallet.d.ts +120 -0
- package/dist/src/lib/crypto/wallet.d.ts.map +1 -0
- package/dist/src/lib/crypto/wallet.js +258 -0
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +44 -0
- package/dist/src/lib/radon/ccdr/eth.d.ts +160 -0
- package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/eth.js +272 -0
- package/dist/src/lib/radon/ccdr/index.d.ts +14 -0
- package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/index.js +39 -0
- package/dist/src/lib/radon/ccdr/wit.d.ts +23 -0
- package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/wit.js +35 -0
- package/dist/src/lib/radon/filters.d.ts +14 -0
- package/dist/src/lib/radon/filters.d.ts.map +1 -0
- package/dist/src/lib/radon/filters.js +45 -0
- package/dist/src/lib/radon/index.d.ts +296 -0
- package/dist/src/lib/radon/index.d.ts.map +1 -0
- package/dist/src/lib/radon/index.js +707 -0
- package/dist/src/lib/radon/reducers.d.ts +29 -0
- package/dist/src/lib/radon/reducers.d.ts.map +1 -0
- package/dist/src/lib/radon/reducers.js +66 -0
- package/dist/src/lib/radon/types.d.ts +521 -0
- package/dist/src/lib/radon/types.d.ts.map +1 -0
- package/dist/src/lib/radon/types.js +936 -0
- package/dist/src/lib/radon/utils.d.ts +53 -0
- package/dist/src/lib/radon/utils.d.ts.map +1 -0
- package/dist/src/lib/radon/utils.js +153 -0
- package/dist/src/lib/rpc/index.d.ts +3 -0
- package/dist/src/lib/rpc/index.d.ts.map +1 -0
- package/dist/src/lib/rpc/index.js +19 -0
- package/dist/src/lib/rpc/nodes.d.ts +40 -0
- package/dist/src/lib/rpc/nodes.d.ts.map +1 -0
- package/dist/src/lib/rpc/nodes.js +293 -0
- package/dist/src/lib/rpc/provider.d.ts +88 -0
- package/dist/src/lib/rpc/provider.d.ts.map +1 -0
- package/dist/src/lib/rpc/provider.js +336 -0
- package/dist/src/lib/rpc/reporter.d.ts +18 -0
- package/dist/src/lib/rpc/reporter.d.ts.map +1 -0
- package/dist/src/lib/rpc/reporter.js +30 -0
- package/dist/src/lib/rpc/types.d.ts +409 -0
- package/dist/src/lib/rpc/types.d.ts.map +1 -0
- package/dist/src/lib/rpc/types.js +81 -0
- package/dist/src/lib/types.d.ts +18 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +7 -0
- package/dist/src/lib/utils.d.ts +13 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +97 -0
- package/dist/witnet/assets/index.d.ts +30 -0
- package/dist/witnet/assets/index.d.ts.map +1 -0
- package/dist/witnet/assets/index.js +6 -0
- package/dist/witnet/assets/modals/index.d.ts +18 -0
- package/dist/witnet/assets/modals/index.d.ts.map +1 -0
- package/dist/witnet/assets/modals/index.js +21 -0
- package/dist/witnet/assets/modals/web3/eth.d.ts +5 -0
- package/dist/witnet/assets/modals/web3/eth.d.ts.map +1 -0
- package/dist/witnet/assets/modals/web3/eth.js +26 -0
- package/dist/witnet/assets/modals/web3/wit.d.ts +4 -0
- package/dist/witnet/assets/modals/web3/wit.d.ts.map +1 -0
- package/dist/witnet/assets/modals/web3/wit.js +20 -0
- package/dist/witnet/assets/requests.d.ts +11 -0
- package/dist/witnet/assets/requests.d.ts.map +1 -0
- package/dist/witnet/assets/requests.js +88 -0
- package/dist/witnet/witnet.proto.json +1325 -0
- package/package.json +72 -0
- package/src/bin/cli/history.js +31 -0
- package/src/bin/cli/inspect.js +359 -0
- package/src/bin/cli/network.js +592 -0
- package/src/bin/cli/nodes.js +364 -0
- package/src/bin/cli/radon.js +814 -0
- package/src/bin/cli/wallet.js +1000 -0
- package/src/bin/helpers.js +829 -0
- package/src/bin/postinstall.js +9 -0
- package/src/bin/toolkit.js +294 -0
- package/witnet/assets/_index.js +8 -0
- package/witnet/assets/_requests.js +25 -0
- package/witnet/assets/_sources.js +36 -0
- package/witnet/assets/_templates.js +36 -0
- package/witnet/assets/index.js +4 -0
- package/witnet/assets/modals/index.js +25 -0
- package/witnet/assets/modals/web3/btc.js +0 -0
- package/witnet/assets/modals/web3/eth.js +29 -0
- package/witnet/assets/modals/web3/sol.js +0 -0
- package/witnet/assets/modals/web3/wit.js +23 -0
- package/witnet/assets/requests.js +94 -0
- package/witnet/witnet.proto.json +1325 -0
|
@@ -0,0 +1,936 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.RadonString = exports.RadonMap = exports.RadonInteger = exports.RadonFloat = exports.RadonBytes = exports.RadonBoolean = exports.RadonArray = exports.RadonAny = exports.RadonScript = exports.RadonOperator = exports.RadonOperators = exports.RadonEncodings = void 0;
|
|
37
|
+
const cbor_1 = require("cbor");
|
|
38
|
+
const helpers = __importStar(require("../../bin/helpers"));
|
|
39
|
+
const Utils = __importStar(require("../utils"));
|
|
40
|
+
var RadonEncodings;
|
|
41
|
+
(function (RadonEncodings) {
|
|
42
|
+
RadonEncodings[RadonEncodings["HexString"] = 0] = "HexString";
|
|
43
|
+
RadonEncodings[RadonEncodings["Base64"] = 1] = "Base64";
|
|
44
|
+
})(RadonEncodings || (exports.RadonEncodings = RadonEncodings = {}));
|
|
45
|
+
var RadonOperators;
|
|
46
|
+
(function (RadonOperators) {
|
|
47
|
+
RadonOperators[RadonOperators["ArrayLength"] = 16] = "ArrayLength";
|
|
48
|
+
RadonOperators[RadonOperators["ArrayFilter"] = 17] = "ArrayFilter";
|
|
49
|
+
RadonOperators[RadonOperators["ArrayJoin"] = 18] = "ArrayJoin";
|
|
50
|
+
RadonOperators[RadonOperators["ArrayGetArray"] = 19] = "ArrayGetArray";
|
|
51
|
+
RadonOperators[RadonOperators["ArrayGetBoolean"] = 20] = "ArrayGetBoolean";
|
|
52
|
+
RadonOperators[RadonOperators["ArrayGetBytes"] = 21] = "ArrayGetBytes";
|
|
53
|
+
RadonOperators[RadonOperators["ArrayGetFloat"] = 22] = "ArrayGetFloat";
|
|
54
|
+
RadonOperators[RadonOperators["ArrayGetInteger"] = 23] = "ArrayGetInteger";
|
|
55
|
+
RadonOperators[RadonOperators["ArrayGetMap"] = 24] = "ArrayGetMap";
|
|
56
|
+
RadonOperators[RadonOperators["ArrayGetString"] = 25] = "ArrayGetString";
|
|
57
|
+
RadonOperators[RadonOperators["ArrayMap"] = 26] = "ArrayMap";
|
|
58
|
+
RadonOperators[RadonOperators["ArrayReduce"] = 27] = "ArrayReduce";
|
|
59
|
+
RadonOperators[RadonOperators["ArraySort"] = 29] = "ArraySort";
|
|
60
|
+
RadonOperators[RadonOperators["ArrayPick"] = 30] = "ArrayPick";
|
|
61
|
+
RadonOperators[RadonOperators["BooleanStringify"] = 32] = "BooleanStringify";
|
|
62
|
+
RadonOperators[RadonOperators["BooleanNegate"] = 34] = "BooleanNegate";
|
|
63
|
+
RadonOperators[RadonOperators["BytesStringify"] = 48] = "BytesStringify";
|
|
64
|
+
RadonOperators[RadonOperators["BytesHash"] = 49] = "BytesHash";
|
|
65
|
+
RadonOperators[RadonOperators["BytesAsInteger"] = 50] = "BytesAsInteger";
|
|
66
|
+
RadonOperators[RadonOperators["BytesLength"] = 52] = "BytesLength";
|
|
67
|
+
RadonOperators[RadonOperators["BytesSlice"] = 60] = "BytesSlice";
|
|
68
|
+
RadonOperators[RadonOperators["FloatAbsolute"] = 80] = "FloatAbsolute";
|
|
69
|
+
RadonOperators[RadonOperators["FloatStringify"] = 81] = "FloatStringify";
|
|
70
|
+
RadonOperators[RadonOperators["FloatCeiling"] = 82] = "FloatCeiling";
|
|
71
|
+
RadonOperators[RadonOperators["FloatGreaterThan"] = 83] = "FloatGreaterThan";
|
|
72
|
+
RadonOperators[RadonOperators["FloatFloor"] = 84] = "FloatFloor";
|
|
73
|
+
RadonOperators[RadonOperators["FloatLessThan"] = 85] = "FloatLessThan";
|
|
74
|
+
RadonOperators[RadonOperators["FloatModule"] = 86] = "FloatModule";
|
|
75
|
+
RadonOperators[RadonOperators["FloatMultiply"] = 87] = "FloatMultiply";
|
|
76
|
+
RadonOperators[RadonOperators["FloatNegate"] = 88] = "FloatNegate";
|
|
77
|
+
RadonOperators[RadonOperators["FloatPower"] = 89] = "FloatPower";
|
|
78
|
+
RadonOperators[RadonOperators["FloatRound"] = 91] = "FloatRound";
|
|
79
|
+
RadonOperators[RadonOperators["FloatTruncate"] = 93] = "FloatTruncate";
|
|
80
|
+
RadonOperators[RadonOperators["IntegerAbsolute"] = 64] = "IntegerAbsolute";
|
|
81
|
+
RadonOperators[RadonOperators["IntegerToFloat"] = 65] = "IntegerToFloat";
|
|
82
|
+
RadonOperators[RadonOperators["IntegerStringify"] = 66] = "IntegerStringify";
|
|
83
|
+
RadonOperators[RadonOperators["IntegerGreaterThan"] = 67] = "IntegerGreaterThan";
|
|
84
|
+
RadonOperators[RadonOperators["IntegerLessThan"] = 68] = "IntegerLessThan";
|
|
85
|
+
RadonOperators[RadonOperators["IntegerModulo"] = 70] = "IntegerModulo";
|
|
86
|
+
RadonOperators[RadonOperators["IntegerMultiply"] = 71] = "IntegerMultiply";
|
|
87
|
+
RadonOperators[RadonOperators["IntegerNegate"] = 72] = "IntegerNegate";
|
|
88
|
+
RadonOperators[RadonOperators["IntegerPower"] = 73] = "IntegerPower";
|
|
89
|
+
RadonOperators[RadonOperators["IntegerToBytes"] = 74] = "IntegerToBytes";
|
|
90
|
+
RadonOperators[RadonOperators["MapStringify"] = 96] = "MapStringify";
|
|
91
|
+
RadonOperators[RadonOperators["MapGetArray"] = 97] = "MapGetArray";
|
|
92
|
+
RadonOperators[RadonOperators["MapGetBoolean"] = 98] = "MapGetBoolean";
|
|
93
|
+
RadonOperators[RadonOperators["MapGetFloat"] = 100] = "MapGetFloat";
|
|
94
|
+
RadonOperators[RadonOperators["MapGetInteger"] = 101] = "MapGetInteger";
|
|
95
|
+
RadonOperators[RadonOperators["MapGetMap"] = 102] = "MapGetMap";
|
|
96
|
+
RadonOperators[RadonOperators["MapGetString"] = 103] = "MapGetString";
|
|
97
|
+
RadonOperators[RadonOperators["MapKeys"] = 104] = "MapKeys";
|
|
98
|
+
RadonOperators[RadonOperators["MapValues"] = 105] = "MapValues";
|
|
99
|
+
RadonOperators[RadonOperators["MapAlter"] = 107] = "MapAlter";
|
|
100
|
+
RadonOperators[RadonOperators["MapPick"] = 110] = "MapPick";
|
|
101
|
+
RadonOperators[RadonOperators["StringAsBoolean"] = 112] = "StringAsBoolean";
|
|
102
|
+
RadonOperators[RadonOperators["StringAsBytes"] = 113] = "StringAsBytes";
|
|
103
|
+
RadonOperators[RadonOperators["StringAsFloat"] = 114] = "StringAsFloat";
|
|
104
|
+
RadonOperators[RadonOperators["StringLength"] = 116] = "StringLength";
|
|
105
|
+
RadonOperators[RadonOperators["StringMatch"] = 117] = "StringMatch";
|
|
106
|
+
RadonOperators[RadonOperators["StringParseJSONArray"] = 118] = "StringParseJSONArray";
|
|
107
|
+
RadonOperators[RadonOperators["StringParseJSONMap"] = 119] = "StringParseJSONMap";
|
|
108
|
+
RadonOperators[RadonOperators["StringParseXMLMap"] = 120] = "StringParseXMLMap";
|
|
109
|
+
RadonOperators[RadonOperators["StringToLowerCase"] = 121] = "StringToLowerCase";
|
|
110
|
+
RadonOperators[RadonOperators["StringToUppserCase"] = 122] = "StringToUppserCase";
|
|
111
|
+
RadonOperators[RadonOperators["StringParseReplace"] = 123] = "StringParseReplace";
|
|
112
|
+
RadonOperators[RadonOperators["StringParseSlice"] = 124] = "StringParseSlice";
|
|
113
|
+
RadonOperators[RadonOperators["StringParseSplit"] = 125] = "StringParseSplit";
|
|
114
|
+
})(RadonOperators || (exports.RadonOperators = RadonOperators = {}));
|
|
115
|
+
class RadonClass {
|
|
116
|
+
constructor(prev) {
|
|
117
|
+
this.prev = prev;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
class RadonOperator extends RadonClass {
|
|
121
|
+
constructor(opcode, params, ops) {
|
|
122
|
+
super(ops);
|
|
123
|
+
this.opcode = opcode;
|
|
124
|
+
this.params = params || [];
|
|
125
|
+
}
|
|
126
|
+
argsCount() {
|
|
127
|
+
let maxCount = 0;
|
|
128
|
+
this.params?.forEach(param => {
|
|
129
|
+
if (typeof param === 'string') {
|
|
130
|
+
const count = helpers.getWildcardsCountFromString(param);
|
|
131
|
+
if (count > maxCount)
|
|
132
|
+
maxCount = count;
|
|
133
|
+
}
|
|
134
|
+
else if (typeof param === 'object' && param instanceof RadonScript) {
|
|
135
|
+
const count = param.argsCount();
|
|
136
|
+
if (count > maxCount)
|
|
137
|
+
maxCount = count;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return Math.max(maxCount, this.prev?.argsCount() || 0);
|
|
141
|
+
}
|
|
142
|
+
disect(level = 0) {
|
|
143
|
+
const result = this?.prev?.disect(level) || [];
|
|
144
|
+
const operator = RadonOperators[this.opcode];
|
|
145
|
+
const inputType = `Radon${operator.split(/(?=[A-Z])/)[0]}`;
|
|
146
|
+
let radonCall = operator.split(/(?=[A-Z])/).slice(1).join('');
|
|
147
|
+
radonCall = radonCall.charAt(0).toLowerCase() + radonCall.slice(1);
|
|
148
|
+
let args = "";
|
|
149
|
+
let script;
|
|
150
|
+
if (this.params && this.params[0] !== undefined) {
|
|
151
|
+
this.params.map(param => {
|
|
152
|
+
if (typeof param !== 'object' || !(param instanceof RadonScript)) {
|
|
153
|
+
args += (typeof param === 'string' ? `"${param}"` : param.toString()) + ", ";
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
script = param;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
if (script)
|
|
160
|
+
args += "RadonOperator {";
|
|
161
|
+
else
|
|
162
|
+
args = args.slice(0, -2);
|
|
163
|
+
}
|
|
164
|
+
if (script) {
|
|
165
|
+
const outputType = `${script.outputType?.constructor.name || "RadonAny"}`;
|
|
166
|
+
radonCall += `(${args}`;
|
|
167
|
+
result.push([level, inputType, radonCall]);
|
|
168
|
+
result.push(...script.disect(level + 1));
|
|
169
|
+
result.push([level, outputType, "})"]);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
radonCall += `(${args})`;
|
|
173
|
+
result.push([level, inputType, radonCall]);
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
encode() {
|
|
178
|
+
let encoded;
|
|
179
|
+
if (this?.params && this.params[0] !== undefined) {
|
|
180
|
+
const args = this.params.map(param => {
|
|
181
|
+
if (typeof param === 'object') {
|
|
182
|
+
if (param instanceof RadonAny) {
|
|
183
|
+
return param.prev?.encode();
|
|
184
|
+
}
|
|
185
|
+
else if (param instanceof RadonOperator) {
|
|
186
|
+
return param.encode();
|
|
187
|
+
}
|
|
188
|
+
else if (param instanceof RadonScript) {
|
|
189
|
+
return param.encode();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
return param;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
encoded = [this.opcode, ...args];
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
encoded = this.opcode;
|
|
200
|
+
}
|
|
201
|
+
if (this.prev) {
|
|
202
|
+
return [...this.prev.encode(), encoded];
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
return [encoded];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
replaceWildcards(args) {
|
|
209
|
+
if (args.length < this.argsCount()) {
|
|
210
|
+
throw EvalError(`Insufficent args were provided (${args.length} < ${this.argsCount()})`);
|
|
211
|
+
}
|
|
212
|
+
return new RadonOperator(this.opcode, this.params?.map(param => {
|
|
213
|
+
if (typeof param === 'string') {
|
|
214
|
+
return helpers.replaceWildcards(param, args);
|
|
215
|
+
}
|
|
216
|
+
else if (typeof param === 'object' && param instanceof RadonScript) {
|
|
217
|
+
return param.replaceWildcards(...args);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
return param;
|
|
221
|
+
}
|
|
222
|
+
}), this?.prev?.replaceWildcards(args));
|
|
223
|
+
}
|
|
224
|
+
spliceWildcard(argIndex, argValue) {
|
|
225
|
+
return new RadonOperator(this.opcode, this.params?.map(param => {
|
|
226
|
+
if (typeof param === 'string') {
|
|
227
|
+
return helpers.spliceWildcard(param, argIndex, argValue, this.argsCount());
|
|
228
|
+
}
|
|
229
|
+
else if (typeof param === 'object' && param instanceof RadonScript) {
|
|
230
|
+
return param.spliceWildcard(argIndex, argValue);
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
return param;
|
|
234
|
+
}
|
|
235
|
+
}), this?.prev?.spliceWildcard(argIndex, argValue));
|
|
236
|
+
}
|
|
237
|
+
toString(left = "", indent = 4, level = 0) {
|
|
238
|
+
const lf = left !== "" ? "\n" : "";
|
|
239
|
+
let str = this?.prev?.toString(left, indent, level) || "";
|
|
240
|
+
let methodName = RadonOperators[this.opcode].split(/(?=[A-Z])/).slice(1).join('');
|
|
241
|
+
methodName = methodName.charAt(0).toLowerCase() + methodName.slice(1);
|
|
242
|
+
str += `${left}${" ".repeat(indent * level)}.${methodName}(`;
|
|
243
|
+
if (this.params && this.params[0] !== undefined) {
|
|
244
|
+
this.params.forEach(param => {
|
|
245
|
+
if (typeof param === 'string') {
|
|
246
|
+
str += `"${param}", `;
|
|
247
|
+
}
|
|
248
|
+
else if (typeof param === 'object' && param instanceof RadonScript) {
|
|
249
|
+
str += `${param.toString(left, indent, level + 1)}${left}${" ".repeat(indent * level)}, `;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
str += param.toString() + ", ";
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
str = str.slice(0, -2);
|
|
256
|
+
}
|
|
257
|
+
str += `)${lf}`;
|
|
258
|
+
return str;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.RadonOperator = RadonOperator;
|
|
262
|
+
class RadonScript {
|
|
263
|
+
constructor(output) {
|
|
264
|
+
this.ops = output?.prev;
|
|
265
|
+
const radonTypes = {
|
|
266
|
+
"Array": RadonArray,
|
|
267
|
+
"Boolean": RadonBoolean,
|
|
268
|
+
"Bytes": RadonBytes,
|
|
269
|
+
"Float": RadonFloat,
|
|
270
|
+
"Integer": RadonInteger,
|
|
271
|
+
"Map": RadonMap,
|
|
272
|
+
"String": RadonString,
|
|
273
|
+
};
|
|
274
|
+
let input = output?.prev;
|
|
275
|
+
while (input?.prev)
|
|
276
|
+
input = input?.prev;
|
|
277
|
+
const inputType = Object.entries(radonTypes).find(([prefix, _]) => input && RadonOperators[input.opcode].startsWith(prefix));
|
|
278
|
+
if (inputType && inputType[1])
|
|
279
|
+
this.inputType = new inputType[1]();
|
|
280
|
+
const outputType = Object.values(radonTypes).find(outputType => output instanceof outputType);
|
|
281
|
+
if (outputType)
|
|
282
|
+
this.outputType = new outputType();
|
|
283
|
+
}
|
|
284
|
+
argsCount() {
|
|
285
|
+
return this.ops?.argsCount() || 0;
|
|
286
|
+
}
|
|
287
|
+
disect(level = 0) {
|
|
288
|
+
return this.ops?.disect(level) || [[level, "RadonAny", ""]];
|
|
289
|
+
}
|
|
290
|
+
encode() {
|
|
291
|
+
return this.ops?.encode() || [];
|
|
292
|
+
}
|
|
293
|
+
replaceWildcards(...args) {
|
|
294
|
+
const OutputType = [
|
|
295
|
+
RadonArray,
|
|
296
|
+
RadonBoolean,
|
|
297
|
+
RadonBytes,
|
|
298
|
+
RadonFloat,
|
|
299
|
+
RadonInteger,
|
|
300
|
+
RadonMap,
|
|
301
|
+
RadonString,
|
|
302
|
+
].find(OutputType => this.outputType instanceof OutputType);
|
|
303
|
+
if (OutputType) {
|
|
304
|
+
return new OutputType(this.ops?.replaceWildcards(args));
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
throw EvalError(`Cannot replace wildcards on empty script`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
spliceWildcard(argIndex, argValue) {
|
|
311
|
+
const OutputType = [
|
|
312
|
+
RadonArray,
|
|
313
|
+
RadonBoolean,
|
|
314
|
+
RadonBytes,
|
|
315
|
+
RadonFloat,
|
|
316
|
+
RadonInteger,
|
|
317
|
+
RadonMap,
|
|
318
|
+
RadonString,
|
|
319
|
+
].find(OutputType => this.outputType instanceof OutputType);
|
|
320
|
+
if (OutputType) {
|
|
321
|
+
return new OutputType(this.ops?.spliceWildcard(argIndex, argValue));
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
throw EvalError(`Cannot splice wildcards on empty script`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
toBytecode() {
|
|
328
|
+
return Utils.toHexString(Object.values(Uint8Array.from((0, cbor_1.encode)(this.encode()))), true);
|
|
329
|
+
}
|
|
330
|
+
toString(left = "", indent = 0, level = 0) {
|
|
331
|
+
const lf = left !== "" ? "\n" : "";
|
|
332
|
+
return `RadonOperator(${this.inputType?.constructor.name || ""})${lf}${this.ops?.toString(left, indent, level + 1)}`;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
exports.RadonScript = RadonScript;
|
|
336
|
+
class RadonAny extends RadonClass {
|
|
337
|
+
_pushOperator(outputType, params) {
|
|
338
|
+
let name;
|
|
339
|
+
try {
|
|
340
|
+
throw new Error();
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
const result = err;
|
|
344
|
+
name = result.stack?.split(' at ')[2]
|
|
345
|
+
.split(' ')[0]
|
|
346
|
+
.split('.')
|
|
347
|
+
.map(part => helpers.toUpperCamelCase(part))
|
|
348
|
+
.join('')
|
|
349
|
+
.split(/(?=[A-Z])/).slice(1)
|
|
350
|
+
.join('');
|
|
351
|
+
}
|
|
352
|
+
const opcode = RadonOperators[name];
|
|
353
|
+
if (!opcode) {
|
|
354
|
+
throw Error(`Fatal: unknown Radon Operator opcode '${name}'`);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
return new outputType(new RadonOperator(opcode, [...params], this?.prev));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
exports.RadonAny = RadonAny;
|
|
362
|
+
class RadonArray extends RadonAny {
|
|
363
|
+
/**
|
|
364
|
+
* Discard the items in the input array that make the given `innerScript` to return a `false` value.
|
|
365
|
+
* @param script Filtering script ultimately returning a `RadonBoolean` object.
|
|
366
|
+
* Must accept as input the same data types as the ones of the items being iterated.
|
|
367
|
+
* @returns A `RadonArray` object containing only the items that make the `innerScript` to return a `true` value.
|
|
368
|
+
*/
|
|
369
|
+
filter(innerScript) {
|
|
370
|
+
if (!(innerScript instanceof RadonBoolean)) {
|
|
371
|
+
throw new EvalError(`Inner script must fetch a RadonBoolean value`);
|
|
372
|
+
}
|
|
373
|
+
return this._pushOperator((RadonArray), [new RadonScript(innerScript)]);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Fetch the item at the given `index` as a `RadonArray` object.
|
|
377
|
+
* @param index
|
|
378
|
+
*/
|
|
379
|
+
getArray(index) {
|
|
380
|
+
return this._pushOperator((RadonArray), [index]);
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Fetch the item at the given `index` as a `RadonBoolean` object.
|
|
384
|
+
* @param index
|
|
385
|
+
*/
|
|
386
|
+
getBoolean(index) {
|
|
387
|
+
return this._pushOperator(RadonBoolean, [index]);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Fetch the item at the given `index` as a `RadonBytes` object.
|
|
391
|
+
* @param index
|
|
392
|
+
*/
|
|
393
|
+
getBytes(index) {
|
|
394
|
+
return this._pushOperator(RadonBytes, [index]);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Fetch the item at the given `index` as a `RadonFloat` object.
|
|
398
|
+
* @param index
|
|
399
|
+
*/
|
|
400
|
+
getFloat(index) {
|
|
401
|
+
return this._pushOperator(RadonFloat, [index]);
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Fetch the item at the given `index` as a `RadonInteger` object.
|
|
405
|
+
* @param index
|
|
406
|
+
*/
|
|
407
|
+
getInteger(index) {
|
|
408
|
+
return this._pushOperator(RadonInteger, [index]);
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Fetch the item at the given `index` as a `RadonMap` object.
|
|
412
|
+
* @param index
|
|
413
|
+
*/
|
|
414
|
+
getMap(index) {
|
|
415
|
+
return this._pushOperator(RadonMap, [index]);
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Fetch the item at the given `index` as a `RadonString` object.
|
|
419
|
+
* @param index
|
|
420
|
+
*/
|
|
421
|
+
getString(index) {
|
|
422
|
+
return this._pushOperator(RadonString, [index]);
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Join all items of the array into a value of the given type. The array must be homogeneous,
|
|
426
|
+
* all items being of the same type as the outputType`, if specified, or the Array's itemsType otherwise.
|
|
427
|
+
* @param separator Separator to be used when joining strings. When joining RadonMaps, it can be used to settle base schema on resulting object.
|
|
428
|
+
* @param outputType Radon type of the output value.
|
|
429
|
+
*/
|
|
430
|
+
join(separator = "", outputType) {
|
|
431
|
+
if (outputType)
|
|
432
|
+
this._pushOperator((RadonArray), [separator]);
|
|
433
|
+
else
|
|
434
|
+
this._pushOperator((RadonArray), [separator]);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Count the number of items.
|
|
438
|
+
* @returns A `RadonInteger` object.
|
|
439
|
+
*/
|
|
440
|
+
length() {
|
|
441
|
+
return this._pushOperator(RadonInteger, []);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Map all items in the array with the given `innerScript`.
|
|
445
|
+
* @param innerScript Mapping script returning some `RadonAny` object.
|
|
446
|
+
* Must accept as input the same data type as the one of the items being iterated.
|
|
447
|
+
* @returns A `RadonArray` object containing the mapped values.
|
|
448
|
+
*/
|
|
449
|
+
map(innerScript) {
|
|
450
|
+
return this._pushOperator(RadonArray, [innerScript]);
|
|
451
|
+
}
|
|
452
|
+
// public map<OutputItemsType extends RadonAny>(innerScript: RadonOperator<OutputItemsType>) {
|
|
453
|
+
// // todo: check script's input type matches array's items type, if any ??
|
|
454
|
+
// return this._pushOperator(RadonArray<OutputItemsType>, [innerScript])
|
|
455
|
+
// }
|
|
456
|
+
/**
|
|
457
|
+
* Reduce all items in the array into a single value.
|
|
458
|
+
* @param reductor The reductor method to be applied. All array items must be
|
|
459
|
+
* convertable into float values.
|
|
460
|
+
* @returns A `RadonFloat` object.
|
|
461
|
+
*/
|
|
462
|
+
reduce(reductor) {
|
|
463
|
+
return this._pushOperator(RadonFloat, [reductor]);
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Order the array items based either on the results of applying the given `innerScript` to every item, or on the
|
|
467
|
+
* actual item values (as long as these are either integers or strings).
|
|
468
|
+
* Fails if applied on non-homegenous arrays (i.e. not all items sharing the same `RadonAny`).
|
|
469
|
+
* @param innerScript (Optional) Sorting script returning either a `RadonInteger` or a `RadonString` object.
|
|
470
|
+
* @returns A `RadonArray` object.
|
|
471
|
+
*/
|
|
472
|
+
// TODO
|
|
473
|
+
// public sort(innerScript?: RadonOperator<RadonString | RadonInteger>) {
|
|
474
|
+
// return this._pushOperator(RadonArray<ItemsType>, [innerScript])
|
|
475
|
+
// }
|
|
476
|
+
/**
|
|
477
|
+
* Take a selection of items from the input array.
|
|
478
|
+
* @param indexes Indexes of the input items to take into the output array.
|
|
479
|
+
* @return A `RadonArray` object.
|
|
480
|
+
*/
|
|
481
|
+
pick(...indexes) {
|
|
482
|
+
if (Array(indexes).length == 0) {
|
|
483
|
+
throw new EvalError(`\x1b[1;33mRadonArray::pick: a non-empty array of numbers must be provided\x1b[0m`);
|
|
484
|
+
}
|
|
485
|
+
return this._pushOperator((RadonArray), [...indexes]);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
exports.RadonArray = RadonArray;
|
|
489
|
+
class RadonBoolean extends RadonAny {
|
|
490
|
+
/**
|
|
491
|
+
* Reverse value.
|
|
492
|
+
* @returns A `RadonBoolean` object.
|
|
493
|
+
*/
|
|
494
|
+
negate() {
|
|
495
|
+
return this._pushOperator(RadonBoolean, []);
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Cast value into a string.
|
|
499
|
+
* @returns A `RadonString` object.
|
|
500
|
+
*/
|
|
501
|
+
stringify() {
|
|
502
|
+
return this._pushOperator(RadonString, []);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
exports.RadonBoolean = RadonBoolean;
|
|
506
|
+
class RadonBytes extends RadonAny {
|
|
507
|
+
/**
|
|
508
|
+
* Convert buffer into (big-endian) integer.
|
|
509
|
+
* @returns A `RadonBytes` object.
|
|
510
|
+
*/
|
|
511
|
+
asInteger() {
|
|
512
|
+
return this._pushOperator(RadonInteger, []);
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Apply the SHA2-256 hash function.
|
|
516
|
+
* @returns A `RadonBytes` object.
|
|
517
|
+
*/
|
|
518
|
+
hash() {
|
|
519
|
+
return this._pushOperator(RadonBytes, []);
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Count the number of bytes.
|
|
523
|
+
* @returns A `RadonInteger` object.
|
|
524
|
+
*/
|
|
525
|
+
length() {
|
|
526
|
+
return this._pushOperator(RadonInteger, []);
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Returns a slice extracted from the input buffer.
|
|
530
|
+
* A `startIndex` of 0 refers to the beginning of the input buffer. If no `endIndex` is provided, it will be assumed
|
|
531
|
+
* the length of the input buffer. Negative values will be relative to the end of the input buffer.
|
|
532
|
+
* @param startIndex Position within input buffer where the output buffer will start.
|
|
533
|
+
* @param endIndex Position within input buffer where the output buffer will end
|
|
534
|
+
* @returns A `RadonBytes` object.
|
|
535
|
+
*/
|
|
536
|
+
slice(startIndex = 0, endIndex) {
|
|
537
|
+
return this._pushOperator(RadonBytes, [startIndex, endIndex]);
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Convert the input buffer into a string.
|
|
541
|
+
* @param encoding Enum integer value specifying the encoding schema on the output string, standing:
|
|
542
|
+
* 0 -> Hex string (default, if none was specified)
|
|
543
|
+
* 1 -> Base64 string
|
|
544
|
+
* @returns A `RadonString` object.
|
|
545
|
+
*/
|
|
546
|
+
stringify(encoding = RadonEncodings.HexString) {
|
|
547
|
+
return this._pushOperator(RadonString, [encoding]);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
exports.RadonBytes = RadonBytes;
|
|
551
|
+
RadonBytes.Encodings = RadonEncodings;
|
|
552
|
+
class RadonFloat extends RadonAny {
|
|
553
|
+
/**
|
|
554
|
+
* Compute the absolute value.
|
|
555
|
+
* @returns A `RadonFloat` object.
|
|
556
|
+
*/
|
|
557
|
+
absolute() {
|
|
558
|
+
return this._pushOperator(RadonFloat, []);
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Compute the lowest integer greater than or equal to the float value.
|
|
562
|
+
* @returns A `RadonInteger` object.
|
|
563
|
+
*/
|
|
564
|
+
ceiling() {
|
|
565
|
+
return this._pushOperator(RadonFloat, []);
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Compute the greatest integer less than or equal to the float value.
|
|
569
|
+
* @returns A `RadonInteger` object.
|
|
570
|
+
*/
|
|
571
|
+
floor() {
|
|
572
|
+
return this._pushOperator(RadonInteger, []);
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Determine if the float value is greater than the given `input`.
|
|
576
|
+
* @param input
|
|
577
|
+
* @returns A `RadonBoolean` object.
|
|
578
|
+
*/
|
|
579
|
+
greaterThan(input) {
|
|
580
|
+
return this._pushOperator(RadonBoolean, [input]);
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Determine if the float value is less than the given `input`.
|
|
584
|
+
* @param input
|
|
585
|
+
* @returns A `RadonBoolean` object.
|
|
586
|
+
*/
|
|
587
|
+
lessThan(input) {
|
|
588
|
+
return this._pushOperator(RadonBoolean, [input]);
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Compute the float remainder of dividing the value by the given `integer`.
|
|
592
|
+
* @param integer
|
|
593
|
+
* @returns A `RadonFloat` object.
|
|
594
|
+
*/
|
|
595
|
+
modulo(integer) {
|
|
596
|
+
return this._pushOperator(RadonFloat, [integer]);
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Multiply the float value by the given `factor`.
|
|
600
|
+
* @param factor
|
|
601
|
+
* @returns A `RadonFloat` object.
|
|
602
|
+
*/
|
|
603
|
+
multiply(factor) {
|
|
604
|
+
return this._pushOperator(RadonFloat, [factor]);
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Negate the float value.
|
|
608
|
+
* @returns A `RadonFloat` object.
|
|
609
|
+
*/
|
|
610
|
+
negate() {
|
|
611
|
+
return this._pushOperator(RadonFloat, []);
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Compute the float value raised to the power of given `exponent`
|
|
615
|
+
* @param exponent
|
|
616
|
+
* @returns A `RadonFloat` object.
|
|
617
|
+
*/
|
|
618
|
+
power(exponent) {
|
|
619
|
+
return this._pushOperator(RadonFloat, [exponent]);
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Round to the closest integer value.
|
|
623
|
+
* @returns A `RadonInteger` object.
|
|
624
|
+
*/
|
|
625
|
+
round() {
|
|
626
|
+
return this._pushOperator(RadonInteger, []);
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Stringify the float value.
|
|
630
|
+
* @returns A `RadonString` object.
|
|
631
|
+
*/
|
|
632
|
+
stringify() {
|
|
633
|
+
return this._pushOperator(RadonString, []);
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Take the integer part of the float value.
|
|
637
|
+
* @returns A `RadonInteger` object.
|
|
638
|
+
*/
|
|
639
|
+
truncate() {
|
|
640
|
+
return this._pushOperator(RadonInteger, []);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
exports.RadonFloat = RadonFloat;
|
|
644
|
+
class RadonInteger extends RadonAny {
|
|
645
|
+
/**
|
|
646
|
+
* Compute the absolute value.
|
|
647
|
+
* @returns A `RadonInteger` object.
|
|
648
|
+
*/
|
|
649
|
+
absolute() {
|
|
650
|
+
return this._pushOperator(RadonInteger, []);
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Determine if the integer value is greater than the given `input`.
|
|
654
|
+
* @param input
|
|
655
|
+
* @returns A `RadonBoolean` object.
|
|
656
|
+
*/
|
|
657
|
+
greaterThan(input) {
|
|
658
|
+
return this._pushOperator(RadonBoolean, [input]);
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* Determine if the integer value is less than the given `input`.
|
|
662
|
+
* @param input
|
|
663
|
+
* @returns A `RadonBoolean` object.
|
|
664
|
+
*/
|
|
665
|
+
lessThan(input) {
|
|
666
|
+
return this._pushOperator(RadonBoolean, [input]);
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Compute the remainder of dividing the value by the given `integer`.
|
|
670
|
+
* @param integer
|
|
671
|
+
* @returns A `RadonFloat` object.
|
|
672
|
+
*/
|
|
673
|
+
modulo(integer) {
|
|
674
|
+
return this._pushOperator(RadonInteger, [integer]);
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Multiply the value by the given `integer`.
|
|
678
|
+
* @param integer
|
|
679
|
+
* @returns A `RadonInteger` object.
|
|
680
|
+
*/
|
|
681
|
+
multiply(integer) {
|
|
682
|
+
return this._pushOperator(RadonInteger, [integer]);
|
|
683
|
+
}
|
|
684
|
+
/**
|
|
685
|
+
* Negate the integer value.
|
|
686
|
+
* @returns A `RadonFloat` object.
|
|
687
|
+
*/
|
|
688
|
+
negate() {
|
|
689
|
+
return this._pushOperator(RadonInteger, []);
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Compute the value raised to the power of given `exponent`
|
|
693
|
+
* @param exponent
|
|
694
|
+
* @returns A `RadonInteger` object.
|
|
695
|
+
*/
|
|
696
|
+
power(exponent) {
|
|
697
|
+
return this._pushOperator(RadonInteger, [exponent]);
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Stringify the value.
|
|
701
|
+
* @returns A `RadonString` object.
|
|
702
|
+
*/
|
|
703
|
+
stringify() {
|
|
704
|
+
return this._pushOperator(RadonString, []);
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* Cast into a big-endian bytes buffer.
|
|
708
|
+
* @returns A `RadonBytes` object.
|
|
709
|
+
*/
|
|
710
|
+
toBytes() {
|
|
711
|
+
return this._pushOperator(RadonBytes, []);
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Cast into a float value.
|
|
715
|
+
* @returns A `RadonFloat` object.
|
|
716
|
+
*/
|
|
717
|
+
toFloat() {
|
|
718
|
+
return this._pushOperator(RadonFloat, []);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
exports.RadonInteger = RadonInteger;
|
|
722
|
+
class RadonMap extends RadonAny {
|
|
723
|
+
/**
|
|
724
|
+
* Alter the value of the item(s) identified by `keys`, applying the given `innerScript` to each one of them.
|
|
725
|
+
* @param key
|
|
726
|
+
* @param innerScript
|
|
727
|
+
* @returns The same RadonMap upon which this operator is executed, with the specified item(s) altered
|
|
728
|
+
* by the given `innerScript`.
|
|
729
|
+
*/
|
|
730
|
+
// TODO
|
|
731
|
+
// public alter<AlteredOutputType extends RadonAny>(innerScript: RadonOperator<AlteredOutputType>, ...keys: string[]) {
|
|
732
|
+
// return this._pushOperator(RadonMap, [innerScript, ...keys])
|
|
733
|
+
// }
|
|
734
|
+
/**
|
|
735
|
+
* Fetch the array within the specified `key` field.
|
|
736
|
+
* @param key
|
|
737
|
+
* @returns A `RadonArray` object.
|
|
738
|
+
*/
|
|
739
|
+
getArray(key, _itemsType) {
|
|
740
|
+
return this._pushOperator((RadonArray), [key]);
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Fetch the boolean within the specified `key` field.
|
|
744
|
+
* @param key
|
|
745
|
+
* @returns A `RadonBoolean` object.
|
|
746
|
+
*/
|
|
747
|
+
getBoolean(key) {
|
|
748
|
+
return this._pushOperator(RadonBoolean, [key]);
|
|
749
|
+
}
|
|
750
|
+
/**
|
|
751
|
+
* Fetch the float value within the specified `key` field.
|
|
752
|
+
* @param key
|
|
753
|
+
* @returns A `RadonFloat` object.
|
|
754
|
+
*/
|
|
755
|
+
getFloat(key) {
|
|
756
|
+
return this._pushOperator(RadonFloat, [key]);
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Fetch the integer value within the specified `key` field.
|
|
760
|
+
* @param key
|
|
761
|
+
* @returns A `RadonInteger` object.
|
|
762
|
+
*/
|
|
763
|
+
getInteger(key) {
|
|
764
|
+
return this._pushOperator(RadonInteger, [key]);
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
767
|
+
* Fetch the map object within the specified `key` field.
|
|
768
|
+
* @param key
|
|
769
|
+
* @returns A `RadonMap` object.
|
|
770
|
+
*/
|
|
771
|
+
getMap(key) {
|
|
772
|
+
return this._pushOperator(RadonMap, [key]);
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* Fetch the string within the specified `key` field.
|
|
776
|
+
* @param key
|
|
777
|
+
* @returns A `RadonString` object.
|
|
778
|
+
*/
|
|
779
|
+
getString(key) {
|
|
780
|
+
return this._pushOperator(RadonString, [key]);
|
|
781
|
+
}
|
|
782
|
+
/**
|
|
783
|
+
* Extract key names of the map into an array of strings.
|
|
784
|
+
* @returns A `RadonArray` object.
|
|
785
|
+
*/
|
|
786
|
+
keys() {
|
|
787
|
+
return this._pushOperator((RadonArray), []);
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* Take a selection of items from the input map. Fails if unexistent items are referred.
|
|
791
|
+
* @param keys Key string of the input items to take into the output map.
|
|
792
|
+
* @return A `RadonMap` object.
|
|
793
|
+
*/
|
|
794
|
+
pick(...keys) {
|
|
795
|
+
if (Array(keys).length == 0) {
|
|
796
|
+
throw new EvalError(`\x1b[1;33mRadonMap::pick: a non-empty array of key strings must be provided\x1b[0m`);
|
|
797
|
+
}
|
|
798
|
+
return this._pushOperator(RadonMap, [...keys]);
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Extract the map values into an array.
|
|
802
|
+
* @returns A `RadonArray` object.
|
|
803
|
+
*/
|
|
804
|
+
values() {
|
|
805
|
+
return this._pushOperator(RadonArray, []);
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* Stringify input `RadonMap` object into a JSON string.
|
|
809
|
+
* @return A `RadonString` object.
|
|
810
|
+
*/
|
|
811
|
+
stringify() {
|
|
812
|
+
return this._pushOperator(RadonString, []);
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
exports.RadonMap = RadonMap;
|
|
816
|
+
class RadonString extends RadonAny {
|
|
817
|
+
/**
|
|
818
|
+
* Cast into a boolean value.
|
|
819
|
+
* @returns A `RadonBoolean` object.
|
|
820
|
+
*/
|
|
821
|
+
asBoolean() {
|
|
822
|
+
return this._pushOperator(RadonBoolean, []);
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Convert the input string into a bytes buffer.
|
|
826
|
+
* @param encoding Enum integer value specifying the encoding schema on the input string, standing:
|
|
827
|
+
* 0 -> Hex string (default, if none was specified)
|
|
828
|
+
* 1 -> Base64 string
|
|
829
|
+
* @returns A `RadonBytes` object.
|
|
830
|
+
*/
|
|
831
|
+
asBytes(encoding = RadonEncodings.HexString) {
|
|
832
|
+
return this._pushOperator(RadonBytes, [encoding]);
|
|
833
|
+
}
|
|
834
|
+
/**
|
|
835
|
+
* Cast into a float number.
|
|
836
|
+
* @returns A `RadonFloat` object.
|
|
837
|
+
*/
|
|
838
|
+
asFloat() {
|
|
839
|
+
return this._pushOperator(RadonFloat, []);
|
|
840
|
+
}
|
|
841
|
+
/**
|
|
842
|
+
* Count the number of chars.
|
|
843
|
+
* @returns A `RadonInteger` object.
|
|
844
|
+
*/
|
|
845
|
+
length() {
|
|
846
|
+
return this._pushOperator(RadonInteger, []);
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* Replace the string by a value of type `outputType`, determined on whether the string value matches
|
|
850
|
+
* any of the keys within the provided `matchingMap`, or set to a `defaultValue` if no match is found.
|
|
851
|
+
* @param outputType Radon type of the output value.
|
|
852
|
+
* @param matchingMap Map determining the output value depending on the string value.
|
|
853
|
+
* @param defaultValue Value returned if no match is found.
|
|
854
|
+
* @returns
|
|
855
|
+
*/
|
|
856
|
+
match(outputType, matchingMap, defaultValue) {
|
|
857
|
+
return this._pushOperator(outputType, [matchingMap, defaultValue]);
|
|
858
|
+
// this._bytecode = [
|
|
859
|
+
// 0x75,
|
|
860
|
+
// matchingMap,
|
|
861
|
+
// defaultValue
|
|
862
|
+
// ]
|
|
863
|
+
// this._method = "match"
|
|
864
|
+
// this._params = `{ ${Object.entries(matchingMap).map((entry: [string, any]) => `\"${entry[0]}\": ${entry[1]}, `)}}, ${defaultValue}`
|
|
865
|
+
// let keys: string = ""
|
|
866
|
+
// Object.keys(matchingMap).map((key: string) => keys += key + ";")
|
|
867
|
+
// return new outputType(this, keys)
|
|
868
|
+
}
|
|
869
|
+
/**
|
|
870
|
+
* Parse input string as an array of JSON items.
|
|
871
|
+
* @param jsonPaths (optional) Array of JSON paths within input `RadonString` from where to fetch items that will be appended to the output `RadonArray`.
|
|
872
|
+
* @returns A `RadonArray` object.
|
|
873
|
+
*/
|
|
874
|
+
parseJSONArray(...jsonPaths) {
|
|
875
|
+
return this._pushOperator((RadonArray), [...jsonPaths]);
|
|
876
|
+
}
|
|
877
|
+
/**
|
|
878
|
+
* Parse string as a JSON-encoded map.
|
|
879
|
+
* @param jsonPath (optional) JSON path within input `RadonString` from where to extract the output `RadonMap`.
|
|
880
|
+
* @returns A `RadonMap` object.
|
|
881
|
+
*/
|
|
882
|
+
parseJSONMap(jsonPath) {
|
|
883
|
+
return this._pushOperator(RadonMap, [jsonPath]);
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* Parse string as an XML-encoded map.
|
|
887
|
+
* @returns A `RadonMap` object.
|
|
888
|
+
*/
|
|
889
|
+
parseXMLMap() {
|
|
890
|
+
return this._pushOperator(RadonMap, []);
|
|
891
|
+
}
|
|
892
|
+
/**
|
|
893
|
+
* Replace with given `replacement` string, all parts of the input string that match with given regular expression.
|
|
894
|
+
* @param regex Regular expression to be matched.
|
|
895
|
+
* @param replacement Text that will replace all occurences.
|
|
896
|
+
* @returns A `RadonString` object.
|
|
897
|
+
*/
|
|
898
|
+
replace(regex = "", replacement = "") {
|
|
899
|
+
return this._pushOperator(RadonString, [regex, replacement]);
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* Returns a slice extracted from the input string.
|
|
903
|
+
* A `startIndex` of 0 refers to the beginning of the input string. If no `endIndex` is provided, it will be assumed
|
|
904
|
+
* the length of the input string. Negative values will be relative to the end of the input string.
|
|
905
|
+
* @param startIndex Position within input string where the output string will start.
|
|
906
|
+
* @param endIndex Position within input string where the output string will end.
|
|
907
|
+
* @returns A `RadonString` object.
|
|
908
|
+
*/
|
|
909
|
+
slice(startIndex = 0, endIndex) {
|
|
910
|
+
return this._pushOperator(RadonString, [startIndex, endIndex]);
|
|
911
|
+
}
|
|
912
|
+
/**
|
|
913
|
+
* Divides input string into an array of substrings,
|
|
914
|
+
* @param regex The string or regular expression to use for splitting.
|
|
915
|
+
* @returns A `RadonArray` object.
|
|
916
|
+
*/
|
|
917
|
+
split(regex = "\r") {
|
|
918
|
+
return this._pushOperator((RadonArray), [regex]);
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* Lower case all characters.
|
|
922
|
+
* @returns A `RadonString` object.
|
|
923
|
+
*/
|
|
924
|
+
toLowercase() {
|
|
925
|
+
return this._pushOperator(RadonString, []);
|
|
926
|
+
}
|
|
927
|
+
/**
|
|
928
|
+
* Upper case all characters.
|
|
929
|
+
* @returns A `RadonString` object.
|
|
930
|
+
*/
|
|
931
|
+
toUpperCase() {
|
|
932
|
+
return this._pushOperator(RadonString, []);
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
exports.RadonString = RadonString;
|
|
936
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUEyQztBQUMzQywyREFBNEM7QUFHNUMsZ0RBQWlDO0FBSWpDLElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN0Qiw2REFBYSxDQUFBO0lBQ2IsdURBQVUsQ0FBQTtBQUNkLENBQUMsRUFIVyxjQUFjLDhCQUFkLGNBQWMsUUFHekI7QUFFRCxJQUFZLGNBb0VYO0FBcEVELFdBQVksY0FBYztJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQixrRUFBa0IsQ0FBQTtJQUNsQiw4REFBZ0IsQ0FBQTtJQUNoQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixzRUFBb0IsQ0FBQTtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQix3RUFBcUIsQ0FBQTtJQUNyQiw0REFBZSxDQUFBO0lBQ2Ysa0VBQWtCLENBQUE7SUFDbEIsOERBQWdCLENBQUE7SUFDaEIsOERBQWdCLENBQUE7SUFDaEIsNEVBQXVCLENBQUE7SUFDdkIsc0VBQW9CLENBQUE7SUFDcEIsd0VBQXFCLENBQUE7SUFDckIsOERBQWdCLENBQUE7SUFDaEIsd0VBQXFCLENBQUE7SUFDckIsa0VBQWtCLENBQUE7SUFDbEIsZ0VBQWlCLENBQUE7SUFDakIsc0VBQW9CLENBQUE7SUFDcEIsd0VBQXFCLENBQUE7SUFDckIsb0VBQW1CLENBQUE7SUFDbkIsNEVBQXVCLENBQUE7SUFDdkIsZ0VBQWlCLENBQUE7SUFDakIsc0VBQW9CLENBQUE7SUFDcEIsa0VBQWtCLENBQUE7SUFDbEIsc0VBQW9CLENBQUE7SUFDcEIsa0VBQWtCLENBQUE7SUFDbEIsZ0VBQWlCLENBQUE7SUFDakIsZ0VBQWlCLENBQUE7SUFDakIsc0VBQW9CLENBQUE7SUFDcEIsMEVBQXNCLENBQUE7SUFDdEIsd0VBQXFCLENBQUE7SUFDckIsNEVBQXVCLENBQUE7SUFDdkIsZ0ZBQXlCLENBQUE7SUFDekIsMEVBQXNCLENBQUE7SUFDdEIsc0VBQW9CLENBQUE7SUFDcEIsMEVBQXNCLENBQUE7SUFDdEIsc0VBQW9CLENBQUE7SUFDcEIsb0VBQW1CLENBQUE7SUFDbkIsd0VBQXFCLENBQUE7SUFDckIsb0VBQW1CLENBQUE7SUFDbkIsa0VBQWtCLENBQUE7SUFDbEIsc0VBQW9CLENBQUE7SUFDcEIsbUVBQWtCLENBQUE7SUFDbEIsdUVBQW9CLENBQUE7SUFDcEIsK0RBQWdCLENBQUE7SUFDaEIscUVBQW1CLENBQUE7SUFDbkIsMkRBQWMsQ0FBQTtJQUNkLCtEQUFnQixDQUFBO0lBQ2hCLDZEQUFlLENBQUE7SUFDZiwyREFBYyxDQUFBO0lBQ2QsMkVBQXNCLENBQUE7SUFDdEIsdUVBQW9CLENBQUE7SUFDcEIsdUVBQW9CLENBQUE7SUFDcEIscUVBQW1CLENBQUE7SUFDbkIsbUVBQWtCLENBQUE7SUFDbEIscUZBQTJCLENBQUE7SUFDM0IsaUZBQXlCLENBQUE7SUFDekIsK0VBQXdCLENBQUE7SUFDeEIsK0VBQXdCLENBQUE7SUFDeEIsaUZBQXlCLENBQUE7SUFDekIsaUZBQXlCLENBQUE7SUFDekIsNkVBQXVCLENBQUE7SUFDdkIsNkVBQXVCLENBQUE7QUFDM0IsQ0FBQyxFQXBFVyxjQUFjLDhCQUFkLGNBQWMsUUFvRXpCO0FBRUQsTUFBZSxVQUFVO0lBRXJCLFlBQVksSUFBb0I7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7SUFDcEIsQ0FBQztDQUNKO0FBRUQsTUFBYSxhQUFjLFNBQVEsVUFBVTtJQUd6QyxZQUFZLE1BQXNCLEVBQUUsTUFBYyxFQUFFLEdBQW1CO1FBQ25FLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNWLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQTtJQUM5QixDQUFDO0lBQ00sU0FBUztRQUNaLElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQTtRQUN4QixJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ3hELElBQUksS0FBSyxHQUFHLFFBQVE7b0JBQUUsUUFBUSxHQUFHLEtBQUssQ0FBQTtZQUMxQyxDQUFDO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssWUFBWSxXQUFXLEVBQUUsQ0FBQztnQkFDbkUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFBO2dCQUMvQixJQUFJLEtBQUssR0FBRyxRQUFRO29CQUFFLFFBQVEsR0FBRyxLQUFLLENBQUE7WUFDMUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUNYLFFBQVEsRUFDUixJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FDOUIsQ0FBQTtJQUNMLENBQUM7SUFDTSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzlDLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDNUMsTUFBTSxTQUFTLEdBQUcsUUFBUSxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDMUQsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzdELFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbEUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ2IsSUFBSSxNQUFNLENBQUE7UUFDVixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDcEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUMvRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQTtnQkFDakYsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE1BQU0sR0FBRyxLQUFLLENBQUE7Z0JBQ2xCLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksTUFBTTtnQkFBRSxJQUFJLElBQUksaUJBQWlCLENBQUE7O2dCQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQyxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sVUFBVSxHQUFHLEdBQUksTUFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQTtZQUMxRixTQUFTLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQTtZQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1lBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBSSxNQUFzQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN6RCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzFDLENBQUM7YUFBTSxDQUFDO1lBQ0osU0FBUyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUE7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUM5QyxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDakIsQ0FBQztJQUNNLE1BQU07UUFDVCxJQUFJLE9BQU8sQ0FBQTtRQUNYLElBQUksSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM1QixJQUFJLEtBQUssWUFBWSxRQUFRLEVBQUUsQ0FBQzt3QkFDNUIsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFBO29CQUMvQixDQUFDO3lCQUFNLElBQUksS0FBSyxZQUFZLGFBQWEsRUFBRSxDQUFDO3dCQUN4QyxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQTtvQkFDekIsQ0FBQzt5QkFBTSxJQUFJLEtBQUssWUFBWSxXQUFXLEVBQUUsQ0FBQzt3QkFDdEMsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUE7b0JBQ3pCLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE9BQU8sS0FBSyxDQUFBO2dCQUNoQixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUE7WUFDRixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUN6QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BCLENBQUM7SUFDTCxDQUFDO0lBQ00sZ0JBQWdCLENBQUMsSUFBYztRQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxTQUFTLENBQUMsbUNBQW1DLElBQUksQ0FBQyxNQUFNLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUM1RixDQUFDO1FBQ0QsT0FBTyxJQUFJLGFBQWEsQ0FDcEIsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDaEQsQ0FBQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLFlBQVksV0FBVyxFQUFFLENBQUM7Z0JBQ25FLE9BQU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7WUFDMUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE9BQU8sS0FBSyxDQUFBO1lBQ2hCLENBQUM7UUFDTCxDQUFDLENBQUMsRUFDRixJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUNyQyxDQUFBO0lBQ0wsQ0FBQztJQUNNLGNBQWMsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO1FBQ3BELE9BQU8sSUFBSSxhQUFhLENBQ3BCLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBQzlFLENBQUM7aUJBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLFdBQVcsRUFBRSxDQUFDO2dCQUNuRSxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ25ELENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLEtBQUssQ0FBQTtZQUNoQixDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUNqRCxDQUFBO0lBQ0wsQ0FBQztJQUNNLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDbEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDekQsSUFBSSxVQUFVLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNqRixVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQTtRQUM1RCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDNUIsR0FBRyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUE7Z0JBQ3pCLENBQUM7cUJBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLFdBQVcsRUFBRSxDQUFDO29CQUNuRSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFBO2dCQUM3RixDQUFDO3FCQUFNLENBQUM7b0JBQ0osR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUE7Z0JBQ2xDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQTtZQUNGLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzFCLENBQUM7UUFDRCxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQTtRQUNmLE9BQU8sR0FBRyxDQUFBO0lBQ2QsQ0FBQztDQUNKO0FBdklELHNDQXVJQztBQUVELE1BQWEsV0FBVztJQUlwQixZQUFhLE1BQWdCO1FBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLElBQUksQ0FBQztRQUN4QixNQUFNLFVBQVUsR0FBRztZQUNmLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLEtBQUssRUFBRSxRQUFRO1lBQ2YsUUFBUSxFQUFFLFdBQVc7U0FDeEIsQ0FBQTtRQUNELElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxJQUFJLENBQUE7UUFDeEIsT0FBTyxLQUFLLEVBQUUsSUFBSTtZQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFBO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQzVILElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDbEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxNQUFNLFlBQVksVUFBVSxDQUFDLENBQUM7UUFDOUYsSUFBSSxVQUFVO1lBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFBO0lBQ3RELENBQUM7SUFDTSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ00sTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBQ00sTUFBTTtRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUNNLGdCQUFnQixDQUFDLEdBQUcsSUFBYztRQUNyQyxNQUFNLFVBQVUsR0FBRztZQUNmLFVBQVU7WUFDVixZQUFZO1lBQ1osVUFBVTtZQUNWLFVBQVU7WUFDVixZQUFZO1lBQ1osUUFBUTtZQUNSLFdBQVc7U0FDZCxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLFlBQVksVUFBVSxDQUFDLENBQUM7UUFDNUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNiLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzNELENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxTQUFTLENBQUMsMENBQTBDLENBQUMsQ0FBQTtRQUMvRCxDQUFDO0lBQ0wsQ0FBQztJQUNNLGNBQWMsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO1FBQ3BELE1BQU0sVUFBVSxHQUFHO1lBQ2YsVUFBVTtZQUNWLFlBQVk7WUFDWixVQUFVO1lBQ1YsVUFBVTtZQUNWLFlBQVk7WUFDWixRQUFRO1lBQ1IsV0FBVztTQUNkLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsWUFBWSxVQUFVLENBQUMsQ0FBQztRQUM1RCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUN2RSxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sU0FBUyxDQUFDLHlDQUF5QyxDQUFDLENBQUE7UUFDOUQsQ0FBQztJQUNMLENBQUM7SUFDTSxVQUFVO1FBQ2IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFBLGFBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUNNLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDbEMsT0FBTyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUN4SCxDQUFDO0NBQ0o7QUF0RUQsa0NBc0VDO0FBRUQsTUFBc0IsUUFBUyxTQUFRLFVBQVU7SUFDbkMsYUFBYSxDQUNuQixVQUFxRCxFQUNyRCxNQUFhO1FBRWIsSUFBSSxJQUFJLENBQUE7UUFDUixJQUFJLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDWCxNQUFNLE1BQU0sR0FBSSxHQUFhLENBQUE7WUFDN0IsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDYixLQUFLLENBQUMsR0FBRyxDQUFDO2lCQUNWLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDM0MsSUFBSSxDQUFDLEVBQUUsQ0FBQztpQkFDUixLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDM0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2pCLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsSUFBbUMsQ0FBQyxDQUFBO1FBQ2xFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE1BQU0sS0FBSyxDQUFDLHlDQUF5QyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBQ2pFLENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLGFBQWEsQ0FDbkMsTUFBTSxFQUNOLENBQUMsR0FBRyxNQUFNLENBQUMsRUFDWCxJQUFJLEVBQUUsSUFBSSxDQUNiLENBQUMsQ0FBQTtRQUNOLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUE3QkQsNEJBNkJDO0FBTUQsTUFBYSxVQUFrRCxTQUFRLFFBQVE7SUFDM0U7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsV0FBeUI7UUFDbkMsSUFBSSxDQUFDLENBQUMsV0FBVyxZQUFZLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLFNBQVMsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO1FBQ3ZFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxVQUFxQixDQUFBLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEYsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFFBQVEsQ0FBMkMsS0FBYTtRQUNuRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxVQUF3QixDQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFDRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsS0FBYTtRQUMzQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNwRCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksUUFBUSxDQUFDLEtBQWE7UUFDekIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFhO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ2xELENBQUM7SUFDRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsS0FBYTtRQUMzQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNwRCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLEtBQWE7UUFDdkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFNBQVMsQ0FBQyxLQUFhO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLElBQUksQ0FBeUMsU0FBUyxHQUFHLEVBQUUsRUFBRSxVQUFrQztRQUNsRyxJQUFJLFVBQVU7WUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUEsVUFBc0IsQ0FBQSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTs7WUFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBLFVBQXFCLENBQUEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUNEOzs7T0FHRztJQUNJLE1BQU07UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLEdBQUcsQ0FBQyxXQUEwQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0lBQ0QsOEZBQThGO0lBQzlGLCtFQUErRTtJQUMvRSw0RUFBNEU7SUFDNUUsSUFBSTtJQUNKOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFFBQTZCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFDRDs7Ozs7O09BTUc7SUFDSCxPQUFPO0lBQ1AseUVBQXlFO0lBQ3pFLHNFQUFzRTtJQUN0RSxJQUFJO0lBQ0o7Ozs7T0FJRztJQUNJLElBQUksQ0FBQyxHQUFHLE9BQWlCO1FBQzVCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksU0FBUyxDQUFDLGtGQUFrRixDQUFDLENBQUE7UUFDM0csQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBLFVBQXFCLENBQUEsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUNsRSxDQUFDO0NBQ0o7QUEzSEQsZ0NBMkhDO0FBRUQsTUFBYSxZQUFhLFNBQVEsUUFBUTtJQUN0Qzs7O09BR0c7SUFDSSxNQUFNO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksU0FBUztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztDQUNKO0FBZkQsb0NBZUM7QUFFRCxNQUFhLFVBQVcsU0FBUSxRQUFRO0lBRXBDOzs7T0FHRztJQUNJLFNBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFDRDs7O09BR0c7SUFDSSxJQUFJO1FBQ1AsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksTUFBTTtRQUNULE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUNEOzs7Ozs7O09BT0c7SUFDSSxLQUFLLENBQUMsYUFBcUIsQ0FBQyxFQUFFLFFBQWlCO1FBQ2xELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUNqRSxDQUFDO0lBQ0Q7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsU0FBUztRQUNoRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUN0RCxDQUFDOztBQTNDTCxnQ0E0Q0M7QUEzQ21CLG9CQUFTLEdBQUcsY0FBYyxDQUFDO0FBNkMvQyxNQUFhLFVBQVcsU0FBUSxRQUFRO0lBQ3BDOzs7T0FHRztJQUNJLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFDRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUU3QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksS0FBSztRQUNSLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsS0FBc0I7UUFDckMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsS0FBc0I7UUFDbEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsT0FBd0I7UUFDbEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsTUFBdUI7UUFDbkMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUNEOzs7T0FHRztJQUNJLE1BQU07UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLFFBQXlCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFDRDs7O09BR0c7SUFDSSxLQUFLO1FBQ1IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksU0FBUztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUM7Q0FDSjtBQTNGRCxnQ0EyRkM7QUFFRCxNQUFhLFlBQWEsU0FBUSxRQUFRO0lBQ3RDOzs7T0FHRztJQUNJLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLEtBQXNCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksUUFBUSxDQUFDLEtBQXNCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQXdCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksUUFBUSxDQUFDLE9BQXdCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFDRDs7O09BR0c7SUFDSSxNQUFNO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxRQUF5QjtRQUNsQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksU0FBUztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUNEOzs7T0FHRztJQUNJLE9BQU87UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFDRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0NBQ0o7QUE1RUQsb0NBNEVDO0FBRUQsTUFBYSxRQUFTLFNBQVEsUUFBUTtJQUNsQzs7Ozs7O09BTUc7SUFDSCxPQUFPO0lBQ1AsdUhBQXVIO0lBQ3ZILGtFQUFrRTtJQUNsRSxJQUFJO0lBQ0o7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBd0MsR0FBVyxFQUFFLFVBQWtDO1FBQ2xHLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBLFVBQXFCLENBQUEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxVQUFVLENBQUMsR0FBVztRQUN6QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxHQUFXO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ2hELENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksVUFBVSxDQUFDLEdBQVc7UUFDekIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsR0FBVztRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLFNBQVMsQ0FBQyxHQUFXO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFDRDs7O09BR0c7SUFDSSxJQUFJO1FBQ1AsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUEsVUFBdUIsQ0FBQSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzFELENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksSUFBSSxDQUFDLEdBQUcsSUFBYztRQUN6QixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLFNBQVMsQ0FBQyxvRkFBb0YsQ0FBQyxDQUFBO1FBQzdHLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBRWxELENBQUM7SUFDRDs7O09BR0c7SUFDSSxNQUFNO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksU0FBUztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztDQUNKO0FBN0ZELDRCQTZGQztBQUVELE1BQWEsV0FBWSxTQUFRLFFBQVE7SUFDckM7OztPQUdHO0lBQ0ksU0FBUztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUNEOzs7Ozs7T0FNRztJQUNJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFNBQVM7UUFDOUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDckQsQ0FBQztJQUNEOzs7T0FHRztJQUNJLE9BQU87UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFDRDs7O09BR0c7SUFDSSxNQUFNO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNJLEtBQUssQ0FDUixVQUFzRCxFQUN0RCxXQUE2QixFQUM3QixZQUFpQjtRQUVqQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUE7UUFDbEUsc0JBQXNCO1FBQ3RCLGNBQWM7UUFDZCxtQkFBbUI7UUFDbkIsbUJBQW1CO1FBQ25CLElBQUk7UUFDSix5QkFBeUI7UUFDekIsc0lBQXNJO1FBQ3RJLHdCQUF3QjtRQUN4QixtRUFBbUU7UUFDbkUsb0NBQW9DO0lBQ3hDLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksY0FBYyxDQUFDLEdBQUcsU0FBbUI7UUFDeEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUEsVUFBb0IsQ0FBQSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFDLFFBQWlCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFDRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSxPQUFPLENBQUMsUUFBZ0IsRUFBRSxFQUFFLGNBQXNCLEVBQUU7UUFDdkQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFDRDs7Ozs7OztPQU9HO0lBQ0ksS0FBSyxDQUFDLGFBQXFCLENBQUMsRUFBRSxRQUFpQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsUUFBZ0IsSUFBSTtRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxVQUF1QixDQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFDRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztDQUNKO0FBMUhELGtDQTBIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuY29kZSBhcyBjYm9yRW5jb2RlIH0gZnJvbSBcImNib3JcIlxyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gXCIuLi8uLi9iaW4vaGVscGVyc1wiXHJcblxyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIFJhZG9uUmVkdWNlck9wY29kZXMgfSBmcm9tICcuL3JlZHVjZXJzJ1xyXG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuLi91dGlscydcclxuXHJcbmV4cG9ydCB7IEhleFN0cmluZyBhcyBSYWRvbkJ5dGVjb2RlIH0gZnJvbSBcIi4uL3R5cGVzXCJcclxuXHJcbmV4cG9ydCBlbnVtIFJhZG9uRW5jb2RpbmdzIHtcclxuICAgIEhleFN0cmluZyA9IDAsXHJcbiAgICBCYXNlNjQgPSAxLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBSYWRvbk9wZXJhdG9ycyB7XHJcbiAgICBBcnJheUxlbmd0aCA9IDB4MTAsXHJcbiAgICBBcnJheUZpbHRlciA9IDB4MTEsXHJcbiAgICBBcnJheUpvaW4gPSAweDEyLFxyXG4gICAgQXJyYXlHZXRBcnJheSA9IDB4MTMsXHJcbiAgICBBcnJheUdldEJvb2xlYW4gPSAweDE0LFxyXG4gICAgQXJyYXlHZXRCeXRlcyA9IDB4MTUsXHJcbiAgICBBcnJheUdldEZsb2F0ID0gMHgxNixcclxuICAgIEFycmF5R2V0SW50ZWdlciA9IDB4MTcsXHJcbiAgICBBcnJheUdldE1hcCA9IDB4MTgsXHJcbiAgICBBcnJheUdldFN0cmluZyA9IDB4MTksXHJcbiAgICBBcnJheU1hcCA9IDB4MWEsXHJcbiAgICBBcnJheVJlZHVjZSA9IDB4MWIsXHJcbiAgICBBcnJheVNvcnQgPSAweDFkLFxyXG4gICAgQXJyYXlQaWNrID0gMHgxZSxcclxuICAgIEJvb2xlYW5TdHJpbmdpZnkgPSAweDIwLFxyXG4gICAgQm9vbGVhbk5lZ2F0ZSA9IDB4MjIsXHJcbiAgICBCeXRlc1N0cmluZ2lmeSA9IDB4MzAsXHJcbiAgICBCeXRlc0hhc2ggPSAweDMxLFxyXG4gICAgQnl0ZXNBc0ludGVnZXIgPSAweDMyLFxyXG4gICAgQnl0ZXNMZW5ndGggPSAweDM0LFxyXG4gICAgQnl0ZXNTbGljZSA9IDB4M2MsXHJcbiAgICBGbG9hdEFic29sdXRlID0gMHg1MCxcclxuICAgIEZsb2F0U3RyaW5naWZ5ID0gMHg1MSxcclxuICAgIEZsb2F0Q2VpbGluZyA9IDB4NTIsXHJcbiAgICBGbG9hdEdyZWF0ZXJUaGFuID0gMHg1MyxcclxuICAgIEZsb2F0Rmxvb3IgPSAweDU0LFxyXG4gICAgRmxvYXRMZXNzVGhhbiA9IDB4NTUsXHJcbiAgICBGbG9hdE1vZHVsZSA9IDB4NTYsXHJcbiAgICBGbG9hdE11bHRpcGx5ID0gMHg1NyxcclxuICAgIEZsb2F0TmVnYXRlID0gMHg1OCxcclxuICAgIEZsb2F0UG93ZXIgPSAweDU5LFxyXG4gICAgRmxvYXRSb3VuZCA9IDB4NWIsXHJcbiAgICBGbG9hdFRydW5jYXRlID0gMHg1ZCxcclxuICAgIEludGVnZXJBYnNvbHV0ZSA9IDB4NDAsXHJcbiAgICBJbnRlZ2VyVG9GbG9hdCA9IDB4NDEsXHJcbiAgICBJbnRlZ2VyU3RyaW5naWZ5ID0gMHg0MixcclxuICAgIEludGVnZXJHcmVhdGVyVGhhbiA9IDB4NDMsXHJcbiAgICBJbnRlZ2VyTGVzc1RoYW4gPSAweDQ0LFxyXG4gICAgSW50ZWdlck1vZHVsbyA9IDB4NDYsXHJcbiAgICBJbnRlZ2VyTXVsdGlwbHkgPSAweDQ3LFxyXG4gICAgSW50ZWdlck5lZ2F0ZSA9IDB4NDgsXHJcbiAgICBJbnRlZ2VyUG93ZXIgPSAweDQ5LFxyXG4gICAgSW50ZWdlclRvQnl0ZXMgPSAweDRhLFxyXG4gICAgTWFwU3RyaW5naWZ5ID0gMHg2MCxcclxuICAgIE1hcEdldEFycmF5ID0gMHg2MSxcclxuICAgIE1hcEdldEJvb2xlYW4gPSAweDYyLFxyXG4gICAgTWFwR2V0RmxvYXQgPSAweDY0LFxyXG4gICAgTWFwR2V0SW50ZWdlciA9IDB4NjUsXHJcbiAgICBNYXBHZXRNYXAgPSAweDY2LFxyXG4gICAgTWFwR2V0U3RyaW5nID0gMHg2NyxcclxuICAgIE1hcEtleXMgPSAweDY4LFxyXG4gICAgTWFwVmFsdWVzID0gMHg2OSxcclxuICAgIE1hcEFsdGVyID0gMHg2YixcclxuICAgIE1hcFBpY2sgPSAweDZlLCAgIFxyXG4gICAgU3RyaW5nQXNCb29sZWFuID0gMHg3MCxcclxuICAgIFN0cmluZ0FzQnl0ZXMgPSAweDcxLFxyXG4gICAgU3RyaW5nQXNGbG9hdCA9IDB4NzIsXHJcbiAgICBTdHJpbmdMZW5ndGggPSAweDc0LFxyXG4gICAgU3RyaW5nTWF0Y2ggPSAweDc1LFxyXG4gICAgU3RyaW5nUGFyc2VKU09OQXJyYXkgPSAweDc2LFxyXG4gICAgU3RyaW5nUGFyc2VKU09OTWFwID0gMHg3NyxcclxuICAgIFN0cmluZ1BhcnNlWE1MTWFwID0gMHg3OCxcclxuICAgIFN0cmluZ1RvTG93ZXJDYXNlID0gMHg3OSxcclxuICAgIFN0cmluZ1RvVXBwc2VyQ2FzZSA9IDB4N2EsXHJcbiAgICBTdHJpbmdQYXJzZVJlcGxhY2UgPSAweDdiLFxyXG4gICAgU3RyaW5nUGFyc2VTbGljZSA9IDB4N2MsXHJcbiAgICBTdHJpbmdQYXJzZVNwbGl0ID0gMHg3ZCxcclxufVxyXG5cclxuYWJzdHJhY3QgY2xhc3MgUmFkb25DbGFzcyB7XHJcbiAgICByZWFkb25seSBwcmV2PzogUmFkb25PcGVyYXRvcjtcclxuICAgIGNvbnN0cnVjdG9yKHByZXY/OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2ID0gcHJldlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25PcGVyYXRvciBleHRlbmRzIFJhZG9uQ2xhc3Mge1xyXG4gICAgcmVhZG9ubHkgb3Bjb2RlOiBSYWRvbk9wZXJhdG9yc1xyXG4gICAgcmVhZG9ubHkgcGFyYW1zPzogYW55W11cclxuICAgIGNvbnN0cnVjdG9yKG9wY29kZTogUmFkb25PcGVyYXRvcnMsIHBhcmFtcz86IGFueVtdLCBvcHM/OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgc3VwZXIob3BzKVxyXG4gICAgICAgIHRoaXMub3Bjb2RlID0gb3Bjb2RlXHJcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwgW11cclxuICAgIH1cclxuICAgIHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHsgXHJcbiAgICAgICAgbGV0IG1heENvdW50OiBudW1iZXIgPSAwXHJcbiAgICAgICAgdGhpcy5wYXJhbXM/LmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBoZWxwZXJzLmdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhwYXJhbSlcclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IG1heENvdW50KSBtYXhDb3VudCA9IGNvdW50XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHBhcmFtLmFyZ3NDb3VudCgpXHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhDb3VudCkgbWF4Q291bnQgPSBjb3VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgIG1heENvdW50LFxyXG4gICAgICAgICAgICB0aGlzLnByZXY/LmFyZ3NDb3VudCgpIHx8IDBcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzPy5wcmV2Py5kaXNlY3QobGV2ZWwpIHx8IFtdXHJcbiAgICAgICAgY29uc3Qgb3BlcmF0b3IgPSBSYWRvbk9wZXJhdG9yc1t0aGlzLm9wY29kZV1cclxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBgUmFkb24ke29wZXJhdG9yLnNwbGl0KC8oPz1bQS1aXSkvKVswXX1gXHJcbiAgICAgICAgbGV0IHJhZG9uQ2FsbCA9IG9wZXJhdG9yLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKS5qb2luKCcnKVxyXG4gICAgICAgIHJhZG9uQ2FsbCA9IHJhZG9uQ2FsbC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHJhZG9uQ2FsbC5zbGljZSgxKVxyXG4gICAgICAgIGxldCBhcmdzID0gXCJcIlxyXG4gICAgICAgIGxldCBzY3JpcHRcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5tYXAocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSAhPT0gJ29iamVjdCcgfHwgIShwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycgPyAgYFwiJHtwYXJhbX1cImAgOiBwYXJhbS50b1N0cmluZygpKSArIFwiLCBcIlxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZiAoc2NyaXB0KSBhcmdzICs9IFwiUmFkb25PcGVyYXRvciB7XCJcclxuICAgICAgICAgICAgZWxzZSBhcmdzID0gYXJncy5zbGljZSgwLCAtMilcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjcmlwdCkge1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gYCR7KHNjcmlwdCBhcyBSYWRvblNjcmlwdCkub3V0cHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSB8fCBcIlJhZG9uQW55XCJ9YFxyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9YFxyXG4gICAgICAgICAgICByZXN1bHQucHVzaChbbGV2ZWwsIGlucHV0VHlwZSwgcmFkb25DYWxsXSlcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uKHNjcmlwdCBhcyBSYWRvblNjcmlwdCkuZGlzZWN0KGxldmVsICsgMSkpXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtsZXZlbCwgb3V0cHV0VHlwZSwgXCJ9KVwiXSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9KWBcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgIH1cclxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10geyBcclxuICAgICAgICBsZXQgZW5jb2RlZFxyXG4gICAgICAgIGlmICh0aGlzPy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJhbXMubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25BbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnByZXY/LmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uT3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5lbmNvZGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVuY29kZWQgPSBbdGhpcy5vcGNvZGUsIC4uLmFyZ3NdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMub3Bjb2RlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnByZXYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsuLi50aGlzLnByZXYuZW5jb2RlKCksIGVuY29kZWRdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtlbmNvZGVkXVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKGFyZ3M6IHN0cmluZ1tdKTogUmFkb25PcGVyYXRvciB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgdGhpcy5hcmdzQ291bnQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYEluc3VmZmljZW50IGFyZ3Mgd2VyZSBwcm92aWRlZCAoJHthcmdzLmxlbmd0aH0gPCAke3RoaXMuYXJnc0NvdW50KCl9KWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuICAgICAgICAgICAgdGhpcy5vcGNvZGUsIFxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcz8ubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnJlcGxhY2VXaWxkY2FyZHMoLi4uYXJncylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgdGhpcz8ucHJldj8ucmVwbGFjZVdpbGRjYXJkcyhhcmdzKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuICAgIHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25PcGVyYXRvciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSYWRvbk9wZXJhdG9yKFxyXG4gICAgICAgICAgICB0aGlzLm9wY29kZSxcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXM/Lm1hcChwYXJhbSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWxwZXJzLnNwbGljZVdpbGRjYXJkKHBhcmFtLCBhcmdJbmRleCwgYXJnVmFsdWUsIHRoaXMuYXJnc0NvdW50KCkpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcgJiYgcGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgdGhpcz8ucHJldj8uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuICAgIHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gNCwgbGV2ZWwgPSAwKTogc3RyaW5nIHsgXHJcbiAgICAgICAgY29uc3QgbGYgPSBsZWZ0ICE9PSBcIlwiID8gXCJcXG5cIiA6IFwiXCJcclxuICAgICAgICBsZXQgc3RyID0gdGhpcz8ucHJldj8udG9TdHJpbmcobGVmdCwgaW5kZW50LCBsZXZlbCkgfHwgXCJcIlxyXG4gICAgICAgIGxldCBtZXRob2ROYW1lID0gUmFkb25PcGVyYXRvcnNbdGhpcy5vcGNvZGVdLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKS5qb2luKCcnKVxyXG4gICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgbWV0aG9kTmFtZS5zbGljZSgxKVxyXG4gICAgICAgIHN0ciArPSBgJHtsZWZ0fSR7XCIgXCIucmVwZWF0KGluZGVudCAqIGxldmVsKX0uJHttZXRob2ROYW1lfShgXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHsgXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYFwiJHtwYXJhbX1cIiwgYFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmIHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYCR7cGFyYW0udG9TdHJpbmcobGVmdCwgaW5kZW50LCBsZXZlbCArIDEpfSR7bGVmdH0ke1wiIFwiLnJlcGVhdChpbmRlbnQgKiBsZXZlbCl9LCBgXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSBwYXJhbS50b1N0cmluZygpICsgXCIsIFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCAtMilcclxuICAgICAgICB9XHJcbiAgICAgICAgc3RyICs9IGApJHtsZn1gXHJcbiAgICAgICAgcmV0dXJuIHN0clxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25TY3JpcHQge1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wcz86IFJhZG9uT3BlcmF0b3I7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRUeXBlPzogUmFkb25Bbnk7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0VHlwZT86IFJhZG9uQW55O1xyXG4gICAgY29uc3RydWN0b3IgKG91dHB1dDogUmFkb25BbnkpIHtcclxuICAgICAgICB0aGlzLm9wcyA9IG91dHB1dD8ucHJldjtcclxuICAgICAgICBjb25zdCByYWRvblR5cGVzID0ge1xyXG4gICAgICAgICAgICBcIkFycmF5XCI6IFJhZG9uQXJyYXksXHJcbiAgICAgICAgICAgIFwiQm9vbGVhblwiOiBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFwiQnl0ZXNcIjogUmFkb25CeXRlcyxcclxuICAgICAgICAgICAgXCJGbG9hdFwiOiBSYWRvbkZsb2F0LFxyXG4gICAgICAgICAgICBcIkludGVnZXJcIjogUmFkb25JbnRlZ2VyLFxyXG4gICAgICAgICAgICBcIk1hcFwiOiBSYWRvbk1hcCxcclxuICAgICAgICAgICAgXCJTdHJpbmdcIjogUmFkb25TdHJpbmcsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpbnB1dCA9IG91dHB1dD8ucHJldlxyXG4gICAgICAgIHdoaWxlIChpbnB1dD8ucHJldikgaW5wdXQgPSBpbnB1dD8ucHJldlxyXG4gICAgICAgIGNvbnN0IGlucHV0VHlwZSA9IE9iamVjdC5lbnRyaWVzKHJhZG9uVHlwZXMpLmZpbmQoKFtwcmVmaXgsIF9dKSA9PiBpbnB1dCAmJiBSYWRvbk9wZXJhdG9yc1tpbnB1dC5vcGNvZGVdLnN0YXJ0c1dpdGgocHJlZml4KSlcclxuICAgICAgICBpZiAoaW5wdXRUeXBlICYmIGlucHV0VHlwZVsxXSkgdGhpcy5pbnB1dFR5cGUgPSBuZXcgaW5wdXRUeXBlWzFdKClcclxuICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gT2JqZWN0LnZhbHVlcyhyYWRvblR5cGVzKS5maW5kKG91dHB1dFR5cGUgPT4gb3V0cHV0IGluc3RhbmNlb2Ygb3V0cHV0VHlwZSk7XHJcbiAgICAgICAgaWYgKG91dHB1dFR5cGUpIHRoaXMub3V0cHV0VHlwZSA9IG5ldyBvdXRwdXRUeXBlKClcclxuICAgIH1cclxuICAgIHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmFyZ3NDb3VudCgpIHx8IDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmRpc2VjdChsZXZlbCkgfHwgW1tsZXZlbCwgXCJSYWRvbkFueVwiLCBcIlwiXV1cclxuICAgIH1cclxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wcz8uZW5jb2RlKCkgfHwgW107XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcmVwbGFjZVdpbGRjYXJkcyguLi5hcmdzOiBzdHJpbmdbXSk6IFJhZG9uQW55IHtcclxuICAgICAgICBjb25zdCBPdXRwdXRUeXBlID0gW1xyXG4gICAgICAgICAgICBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFJhZG9uRmxvYXQsXHJcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChPdXRwdXRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3V0cHV0VHlwZSh0aGlzLm9wcz8ucmVwbGFjZVdpbGRjYXJkcyhhcmdzKSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYENhbm5vdCByZXBsYWNlIHdpbGRjYXJkcyBvbiBlbXB0eSBzY3JpcHRgKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25Bbnkge1xyXG4gICAgICAgIGNvbnN0IE91dHB1dFR5cGUgPSBbXHJcbiAgICAgICAgICAgIFJhZG9uQXJyYXksXHJcbiAgICAgICAgICAgIFJhZG9uQm9vbGVhbixcclxuICAgICAgICAgICAgUmFkb25CeXRlcyxcclxuICAgICAgICAgICAgUmFkb25GbG9hdCxcclxuICAgICAgICAgICAgUmFkb25JbnRlZ2VyLFxyXG4gICAgICAgICAgICBSYWRvbk1hcCxcclxuICAgICAgICAgICAgUmFkb25TdHJpbmcsXHJcbiAgICAgICAgXS5maW5kKE91dHB1dFR5cGUgPT4gdGhpcy5vdXRwdXRUeXBlIGluc3RhbmNlb2YgT3V0cHV0VHlwZSk7XHJcbiAgICAgICAgaWYgKE91dHB1dFR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRUeXBlKHRoaXMub3BzPy5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IEV2YWxFcnJvcihgQ2Fubm90IHNwbGljZSB3aWxkY2FyZHMgb24gZW1wdHkgc2NyaXB0YClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9CeXRlY29kZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBVdGlscy50b0hleFN0cmluZyhPYmplY3QudmFsdWVzKFVpbnQ4QXJyYXkuZnJvbShjYm9yRW5jb2RlKHRoaXMuZW5jb2RlKCkpKSksIHRydWUpXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9TdHJpbmcobGVmdCA9IFwiXCIsIGluZGVudCA9IDAsIGxldmVsID0gMCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgbGYgPSBsZWZ0ICE9PSBcIlwiID8gXCJcXG5cIiA6IFwiXCJcclxuICAgICAgICByZXR1cm4gYFJhZG9uT3BlcmF0b3IoJHt0aGlzLmlucHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSB8fCBcIlwifSkke2xmfSR7dGhpcy5vcHM/LnRvU3RyaW5nKGxlZnQsIGluZGVudCwgbGV2ZWwgKyAxKX1gXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSYWRvbkFueSBleHRlbmRzIFJhZG9uQ2xhc3Mge1xyXG4gICAgcHJvdGVjdGVkIF9wdXNoT3BlcmF0b3I8T3V0cHV0VHlwZSBleHRlbmRzIFJhZG9uQW55PihcclxuICAgICAgICBvdXRwdXRUeXBlOiB7IG5ldyhvcHM/OiBSYWRvbk9wZXJhdG9yKTogT3V0cHV0VHlwZTsgfSwgXHJcbiAgICAgICAgcGFyYW1zOiBhbnlbXSxcclxuICAgICk6IE91dHB1dFR5cGUge1xyXG4gICAgICAgIGxldCBuYW1lXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IChlcnIgYXMgRXJyb3IpXHJcbiAgICAgICAgICAgIG5hbWUgPSByZXN1bHQuc3RhY2s/LnNwbGl0KCcgYXQgJylbMl1cclxuICAgICAgICAgICAgICAgIC5zcGxpdCgnICcpWzBdXHJcbiAgICAgICAgICAgICAgICAuc3BsaXQoJy4nKVxyXG4gICAgICAgICAgICAgICAgLm1hcChwYXJ0ID0+IGhlbHBlcnMudG9VcHBlckNhbWVsQ2FzZShwYXJ0KSlcclxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKVxyXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wY29kZSA9IFJhZG9uT3BlcmF0b3JzW25hbWUgYXMga2V5b2YgdHlwZW9mIFJhZG9uT3BlcmF0b3JzXVxyXG4gICAgICAgIGlmICghb3Bjb2RlKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBGYXRhbDogdW5rbm93biBSYWRvbiBPcGVyYXRvciBvcGNvZGUgJyR7bmFtZX0nYClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IG91dHB1dFR5cGUobmV3IFJhZG9uT3BlcmF0b3IoXHJcbiAgICAgICAgICAgICAgICBvcGNvZGUsIFxyXG4gICAgICAgICAgICAgICAgWy4uLnBhcmFtc10sIFxyXG4gICAgICAgICAgICAgICAgdGhpcz8ucHJldlxyXG4gICAgICAgICAgICApKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55PiB7XHJcbiAgICBpdGVtc1R5cGU6IEl0ZW1zVHlwZTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uQXJyYXk8SXRlbXNUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvbkFueT4gZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIERpc2NhcmQgdGhlIGl0ZW1zIGluIHRoZSBpbnB1dCBhcnJheSB0aGF0IG1ha2UgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYGZhbHNlYCB2YWx1ZS4gXHJcbiAgICAgKiBAcGFyYW0gc2NyaXB0IEZpbHRlcmluZyBzY3JpcHQgdWx0aW1hdGVseSByZXR1cm5pbmcgYSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKiBNdXN0IGFjY2VwdCBhcyBpbnB1dCB0aGUgc2FtZSBkYXRhIHR5cGVzIGFzIHRoZSBvbmVzIG9mIHRoZSBpdGVtcyBiZWluZyBpdGVyYXRlZC4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBpdGVtcyB0aGF0IG1ha2UgdGhlIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYHRydWVgIHZhbHVlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbHRlcihpbm5lclNjcmlwdDogUmFkb25Cb29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCEoaW5uZXJTY3JpcHQgaW5zdGFuY2VvZiBSYWRvbkJvb2xlYW4pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYElubmVyIHNjcmlwdCBtdXN0IGZldGNoIGEgUmFkb25Cb29sZWFuIHZhbHVlYClcclxuICAgICAgICB9IFxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbbmV3IFJhZG9uU2NyaXB0KGlubmVyU2NyaXB0KV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFycmF5PFN1Ykl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+KGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8U3ViSXRlbXNUeXBlPiwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCb29sZWFuKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Qnl0ZXMoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmxvYXQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbnRlZ2VyKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25NYXBgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1hcChpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0cmluZyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSm9pbiBhbGwgaXRlbXMgb2YgdGhlIGFycmF5IGludG8gYSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gVGhlIGFycmF5IG11c3QgYmUgaG9tb2dlbmVvdXMsIFxyXG4gICAgICogYWxsIGl0ZW1zIGJlaW5nIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG91dHB1dFR5cGVgLCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBBcnJheSdzIGl0ZW1zVHlwZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIFNlcGFyYXRvciB0byBiZSB1c2VkIHdoZW4gam9pbmluZyBzdHJpbmdzLiBXaGVuIGpvaW5pbmcgUmFkb25NYXBzLCBpdCBjYW4gYmUgdXNlZCB0byBzZXR0bGUgYmFzZSBzY2hlbWEgb24gcmVzdWx0aW5nIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBvdXRwdXRUeXBlIFJhZG9uIHR5cGUgb2YgdGhlIG91dHB1dCB2YWx1ZS4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBqb2luPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihzZXBhcmF0b3IgPSBcIlwiLCBvdXRwdXRUeXBlPzogeyBuZXcoKTogSXRlbXNUeXBlOyB9KSB7XHJcbiAgICAgICAgaWYgKG91dHB1dFR5cGUpIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PE91dHB1dFR5cGU+LCBbc2VwYXJhdG9yXSlcclxuICAgICAgICBlbHNlIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PEl0ZW1zVHlwZT4sIFtzZXBhcmF0b3JdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGl0ZW1zLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGVuZ3RoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTWFwIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgd2l0aCB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgTWFwcGluZyBzY3JpcHQgcmV0dXJuaW5nIHNvbWUgYFJhZG9uQW55YCBvYmplY3QuXHJcbiAgICAgKiBNdXN0IGFjY2VwdCBhcyBpbnB1dCB0aGUgc2FtZSBkYXRhIHR5cGUgYXMgdGhlIG9uZSBvZiB0aGUgaXRlbXMgYmVpbmcgaXRlcmF0ZWQuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1hcHBlZCB2YWx1ZXMuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKGlubmVyU2NyaXB0OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgfVxyXG4gICAgLy8gcHVibGljIG1hcDxPdXRwdXRJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueT4oaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3I8T3V0cHV0SXRlbXNUeXBlPikge1xyXG4gICAgLy8gICAgIC8vIHRvZG86IGNoZWNrIHNjcmlwdCdzIGlucHV0IHR5cGUgbWF0Y2hlcyBhcnJheSdzIGl0ZW1zIHR5cGUsIGlmIGFueSA/P1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxPdXRwdXRJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgLy8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWR1Y2UgYWxsIGl0ZW1zIGluIHRoZSBhcnJheSBpbnRvIGEgc2luZ2xlIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHJlZHVjdG9yIFRoZSByZWR1Y3RvciBtZXRob2QgdG8gYmUgYXBwbGllZC4gQWxsIGFycmF5IGl0ZW1zIG11c3QgYmUgXHJcbiAgICAgKiBjb252ZXJ0YWJsZSBpbnRvIGZsb2F0IHZhbHVlcy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZHVjZShyZWR1Y3RvcjogUmFkb25SZWR1Y2VyT3Bjb2Rlcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW3JlZHVjdG9yXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3JkZXIgdGhlIGFycmF5IGl0ZW1zIGJhc2VkIGVpdGhlciBvbiB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YCB0byBldmVyeSBpdGVtLCBvciBvbiB0aGUgXHJcbiAgICAgKiBhY3R1YWwgaXRlbSB2YWx1ZXMgKGFzIGxvbmcgYXMgdGhlc2UgYXJlIGVpdGhlciBpbnRlZ2VycyBvciBzdHJpbmdzKS5cclxuICAgICAqIEZhaWxzIGlmIGFwcGxpZWQgb24gbm9uLWhvbWVnZW5vdXMgYXJyYXlzIChpLmUuIG5vdCBhbGwgaXRlbXMgc2hhcmluZyB0aGUgc2FtZSBgUmFkb25BbnlgKS4gXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgKE9wdGlvbmFsKSBTb3J0aW5nIHNjcmlwdCByZXR1cm5pbmcgZWl0aGVyIGEgYFJhZG9uSW50ZWdlcmAgb3IgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgLy8gVE9ET1xyXG4gICAgLy8gcHVibGljIHNvcnQoaW5uZXJTY3JpcHQ/OiBSYWRvbk9wZXJhdG9yPFJhZG9uU3RyaW5nIHwgUmFkb25JbnRlZ2VyPikge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgLy8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIGZyb20gdGhlIGlucHV0IGFycmF5LlxyXG4gICAgICogQHBhcmFtIGluZGV4ZXMgSW5kZXhlcyBvZiB0aGUgaW5wdXQgaXRlbXMgdG8gdGFrZSBpbnRvIHRoZSBvdXRwdXQgYXJyYXkuIFxyXG4gICAgICogQHJldHVybiBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrKC4uLmluZGV4ZXM6IG51bWJlcltdKSB7XHJcbiAgICAgICAgaWYgKEFycmF5KGluZGV4ZXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25BcnJheTo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVycyBtdXN0IGJlIHByb3ZpZGVkXFx4MWJbMG1gKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgWy4uLmluZGV4ZXNdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25Cb29sZWFuIGV4dGVuZHMgUmFkb25Bbnkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXZlcnNlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZWdhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXN0IHZhbHVlIGludG8gYSBzdHJpbmcuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uQnl0ZXMgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgRW5jb2RpbmdzID0gUmFkb25FbmNvZGluZ3M7XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgYnVmZmVyIGludG8gKGJpZy1lbmRpYW4pIGludGVnZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc0ludGVnZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSB0aGUgU0hBMi0yNTYgaGFzaCBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBieXRlcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiBcclxuICAgICAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkIFxyXG4gICAgICogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyLiBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgYnVmZmVyIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIHdpbGwgc3RhcnQuXHJcbiAgICAgKiBAcGFyYW0gZW5kSW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsIGVuZFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtzdGFydEluZGV4LCBlbmRJbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBpbnRvIGEgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIG91dHB1dCBzdHJpbmcsIHN0YW5kaW5nOlxyXG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcclxuICAgICAqICAgMSAtPiBCYXNlNjQgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyaW5naWZ5KGVuY29kaW5nID0gUmFkb25FbmNvZGluZ3MuSGV4U3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW2VuY29kaW5nXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uRmxvYXQgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGFic29sdXRlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzb2x1dGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgbG93ZXN0IGludGVnZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNlaWxpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGdyZWF0ZXN0IGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmxvb3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JlYXRlclRoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC5cclxuICAgICAqIEBwYXJhbSBpbnB1dCBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGVzc1RoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSBmbG9hdCByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIHZhbHVlIGJ5IHRoZSBnaXZlbiBgaW50ZWdlcmAuXHJcbiAgICAgKiBAcGFyYW0gaW50ZWdlciBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZHVsbyhpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbnRlZ2VyXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhlIGZsb2F0IHZhbHVlIGJ5IHRoZSBnaXZlbiBgZmFjdG9yYC5cclxuICAgICAqIEBwYXJhbSBmYWN0b3IgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbHkoZmFjdG9yOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtmYWN0b3JdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhlIGZsb2F0IHZhbHVlLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5lZ2F0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSBmbG9hdCB2YWx1ZSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGdpdmVuIGBleHBvbmVudGBcclxuICAgICAqIEBwYXJhbSBleHBvbmVudFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG93ZXIoZXhwb25lbnQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2V4cG9uZW50XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUm91bmQgdG8gdGhlIGNsb3Nlc3QgaW50ZWdlciB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm91bmQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgdGhlIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGFrZSB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBmbG9hdCB2YWx1ZS4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRydW5jYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uSW50ZWdlciBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic29sdXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JlYXRlclRoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGludGVnZXIgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLiBcclxuICAgICAqIEBwYXJhbSBpbnB1dFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsZXNzVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgdmFsdWUgYnkgdGhlIGdpdmVuIGBpbnRlZ2VyYC5cclxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW9kdWxvKGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW50ZWdlcl0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoZSB2YWx1ZSBieSB0aGUgZ2l2ZW4gYGludGVnZXJgLlxyXG4gICAgICogQHBhcmFtIGludGVnZXIgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2ludGVnZXJdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhlIGludGVnZXIgdmFsdWUuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiBnaXZlbiBgZXhwb25lbnRgXHJcbiAgICAgKiBAcGFyYW0gZXhwb25lbnRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG93ZXIoZXhwb25lbnQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbZXhwb25lbnRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgdGhlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgYmlnLWVuZGlhbiBieXRlcyBidWZmZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0J5dGVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9GbG9hdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25NYXAgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIEFsdGVyIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbShzKSBpZGVudGlmaWVkIGJ5IGBrZXlzYCwgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZWFjaCBvbmUgb2YgdGhlbS5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgc2FtZSBSYWRvbk1hcCB1cG9uIHdoaWNoIHRoaXMgb3BlcmF0b3IgaXMgZXhlY3V0ZWQsIHdpdGggdGhlIHNwZWNpZmllZCBpdGVtKHMpIGFsdGVyZWRcclxuICAgICAqIGJ5IHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgLlxyXG4gICAgICovXHJcbiAgICAvLyBUT0RPXHJcbiAgICAvLyBwdWJsaWMgYWx0ZXI8QWx0ZXJlZE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueT4oaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3I8QWx0ZXJlZE91dHB1dFR5cGU+LCAuLi5rZXlzOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFtpbm5lclNjcmlwdCwgLi4ua2V5c10pXHJcbiAgICAvLyB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBhcnJheSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBcnJheTxJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihrZXk6IHN0cmluZywgX2l0ZW1zVHlwZT86IHsgbmV3KCk6IEl0ZW1zVHlwZTsgfSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBba2V5XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGJvb2xlYW4gd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuIFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBmbG9hdCB2YWx1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGbG9hdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEludGVnZXIoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBtYXAgb2JqZWN0IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TWFwKGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBzdHJpbmcgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0cmluZyhrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtrZXldKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHRyYWN0IGtleSBuYW1lcyBvZiB0aGUgbWFwIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uU3RyaW5nPiwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRha2UgYSBzZWxlY3Rpb24gb2YgaXRlbXMgZnJvbSB0aGUgaW5wdXQgbWFwLiBGYWlscyBpZiB1bmV4aXN0ZW50IGl0ZW1zIGFyZSByZWZlcnJlZC5cclxuICAgICAqIEBwYXJhbSBrZXlzIEtleSBzdHJpbmcgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IG1hcC4gXHJcbiAgICAgKiBAcmV0dXJuIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrKC4uLmtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKEFycmF5KGtleXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25NYXA6OnBpY2s6IGEgbm9uLWVtcHR5IGFycmF5IG9mIGtleSBzdHJpbmdzIG11c3QgYmUgcHJvdmlkZWRcXHgxYlswbWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFsuLi5rZXlzXSlcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhY3QgdGhlIG1hcCB2YWx1ZXMgaW50byBhbiBhcnJheS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXksIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgaW5wdXQgYFJhZG9uTWFwYCBvYmplY3QgaW50byBhIEpTT04gc3RyaW5nLlxyXG4gICAgICogQHJldHVybiBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyaW5naWZ5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25TdHJpbmcgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGJvb2xlYW4gdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzQm9vbGVhbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgdGhlIGlucHV0IHN0cmluZyBpbnRvIGEgYnl0ZXMgYnVmZmVyLlxyXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIGlucHV0IHN0cmluZywgc3RhbmRpbmc6XHJcbiAgICAgKiAgIDAgLT4gSGV4IHN0cmluZyAoZGVmYXVsdCwgaWYgbm9uZSB3YXMgc3BlY2lmaWVkKVxyXG4gICAgICogICAxIC0+IEJhc2U2NCBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzQnl0ZXMoZW5jb2RpbmcgPSBSYWRvbkVuY29kaW5ncy5IZXhTdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtlbmNvZGluZ10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IG51bWJlci5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzRmxvYXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBjaGFycy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2UgdGhlIHN0cmluZyBieSBhIHZhbHVlIG9mIHR5cGUgYG91dHB1dFR5cGVgLCBkZXRlcm1pbmVkIG9uIHdoZXRoZXIgdGhlIHN0cmluZyB2YWx1ZSBtYXRjaGVzIFxyXG4gICAgICogYW55IG9mIHRoZSBrZXlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgYG1hdGNoaW5nTWFwYCwgb3Igc2V0IHRvIGEgYGRlZmF1bHRWYWx1ZWAgaWYgbm8gbWF0Y2ggaXMgZm91bmQuXHJcbiAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSBSYWRvbiB0eXBlIG9mIHRoZSBvdXRwdXQgdmFsdWUuIFxyXG4gICAgICogQHBhcmFtIG1hdGNoaW5nTWFwIE1hcCBkZXRlcm1pbmluZyB0aGUgb3V0cHV0IHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgc3RyaW5nIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBWYWx1ZSByZXR1cm5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZC4gXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hdGNoPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uU3RyaW5nPihcclxuICAgICAgICBvdXRwdXRUeXBlOiB7IG5ldyhwcmV2PzogUmFkb25PcGVyYXRvcik6IE91dHB1dFR5cGU7IH0sIFxyXG4gICAgICAgIG1hdGNoaW5nTWFwOiBNYXA8c3RyaW5nLCBhbnk+LCBcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IGFueVxyXG4gICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihvdXRwdXRUeXBlLCBbbWF0Y2hpbmdNYXAsIGRlZmF1bHRWYWx1ZV0pXHJcbiAgICAgICAgLy8gdGhpcy5fYnl0ZWNvZGUgPSBbIFxyXG4gICAgICAgIC8vICAgICAweDc1LCAgXHJcbiAgICAgICAgLy8gICAgIG1hdGNoaW5nTWFwLFxyXG4gICAgICAgIC8vICAgICBkZWZhdWx0VmFsdWVcclxuICAgICAgICAvLyBdXHJcbiAgICAgICAgLy8gdGhpcy5fbWV0aG9kID0gXCJtYXRjaFwiXHJcbiAgICAgICAgLy8gdGhpcy5fcGFyYW1zID0gYHsgJHtPYmplY3QuZW50cmllcyhtYXRjaGluZ01hcCkubWFwKChlbnRyeTogW3N0cmluZywgYW55XSkgPT4gYFxcXCIke2VudHJ5WzBdfVxcXCI6ICR7ZW50cnlbMV19LCBgKX19LCAke2RlZmF1bHRWYWx1ZX1gXHJcbiAgICAgICAgLy8gbGV0IGtleXM6IHN0cmluZyA9IFwiXCJcclxuICAgICAgICAvLyBPYmplY3Qua2V5cyhtYXRjaGluZ01hcCkubWFwKChrZXk6IHN0cmluZykgPT4ga2V5cyArPSBrZXkgKyBcIjtcIilcclxuICAgICAgICAvLyByZXR1cm4gbmV3IG91dHB1dFR5cGUodGhpcywga2V5cylcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2UgaW5wdXQgc3RyaW5nIGFzIGFuIGFycmF5IG9mIEpTT04gaXRlbXMuIFxyXG4gICAgICogQHBhcmFtIGpzb25QYXRocyAob3B0aW9uYWwpIEFycmF5IG9mIEpTT04gcGF0aHMgd2l0aGluIGlucHV0IGBSYWRvblN0cmluZ2AgZnJvbSB3aGVyZSB0byBmZXRjaCBpdGVtcyB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIG91dHB1dCBgUmFkb25BcnJheWAuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFyc2VKU09OQXJyYXkoLi4uanNvblBhdGhzOiBzdHJpbmdbXSk6IFJhZG9uQXJyYXk8UmFkb25Bbnk+IHsgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uQW55PiwgWy4uLmpzb25QYXRoc10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlIHN0cmluZyBhcyBhIEpTT04tZW5jb2RlZCBtYXAuIFxyXG4gICAgICogQHBhcmFtIGpzb25QYXRoIChvcHRpb25hbCkgSlNPTiBwYXRoIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZXh0cmFjdCB0aGUgb3V0cHV0IGBSYWRvbk1hcGAuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25NYXBgIG9iamVjdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZUpTT05NYXAoanNvblBhdGg/OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbanNvblBhdGhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSBzdHJpbmcgYXMgYW4gWE1MLWVuY29kZWQgbWFwLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZVhNTE1hcCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZSB3aXRoIGdpdmVuIGByZXBsYWNlbWVudGAgc3RyaW5nLCBhbGwgcGFydHMgb2YgdGhlIGlucHV0IHN0cmluZyB0aGF0IG1hdGNoIHdpdGggZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLiBcclxuICAgICAqIEBwYXJhbSByZWdleCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgbWF0Y2hlZC5cclxuICAgICAqIEBwYXJhbSByZXBsYWNlbWVudCBUZXh0IHRoYXQgd2lsbCByZXBsYWNlIGFsbCBvY2N1cmVuY2VzLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXBsYWNlKHJlZ2V4OiBzdHJpbmcgPSBcIlwiLCByZXBsYWNlbWVudDogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtyZWdleCwgcmVwbGFjZW1lbnRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgc2xpY2UgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IHN0cmluZy4gXHJcbiAgICAgKiBBIGBzdGFydEluZGV4YCBvZiAwIHJlZmVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBzdHJpbmcuIElmIG5vIGBlbmRJbmRleGAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYXNzdW1lZCBcclxuICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHN0cmluZy4gTmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIHN0YXJ0SW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IHN0cmluZyB3aGVyZSB0aGUgb3V0cHV0IHN0cmluZyB3aWxsIHN0YXJ0LlxyXG4gICAgICogQHBhcmFtIGVuZEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBzdHJpbmcgd2hlcmUgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBlbmQuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbc3RhcnRJbmRleCwgZW5kSW5kZXhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXZpZGVzIGlucHV0IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN1YnN0cmluZ3MsIFxyXG4gICAgICogQHBhcmFtIHJlZ2V4IFRoZSBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uIHRvIHVzZSBmb3Igc3BsaXR0aW5nLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3BsaXQocmVnZXg6IHN0cmluZyA9IFwiXFxyXCIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25TdHJpbmc+LCBbcmVnZXhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb3dlciBjYXNlIGFsbCBjaGFyYWN0ZXJzLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvTG93ZXJjYXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcHBlciBjYXNlIGFsbCBjaGFyYWN0ZXJzLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvVXBwZXJDYXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|