@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,707 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.types = exports.retrievals = exports.reducers = exports.filters = exports.RadonRetrieval = exports.RadonModal = exports.RadonTemplate = exports.RadonRequest = void 0;
|
|
40
|
+
exports.RadonRequestFromAssets = RadonRequestFromAssets;
|
|
41
|
+
exports.RadonScript = RadonScript;
|
|
42
|
+
const cbor_1 = require("cbor");
|
|
43
|
+
const graphql_query_compress_1 = __importDefault(require("graphql-query-compress"));
|
|
44
|
+
const protoBuf = require("protobufjs").Root.fromJSON(require("../../../witnet/witnet.proto.json"));
|
|
45
|
+
const RADRequest = protoBuf.lookupType("RADRequest");
|
|
46
|
+
const helpers_1 = require("../../bin/helpers");
|
|
47
|
+
const utils_1 = require("../crypto/utils");
|
|
48
|
+
const utils_2 = require("./utils");
|
|
49
|
+
const filters_1 = require("./filters");
|
|
50
|
+
const reducers_1 = require("./reducers");
|
|
51
|
+
const types_1 = require("./types");
|
|
52
|
+
class RadonArtifact {
|
|
53
|
+
constructor(specs) {
|
|
54
|
+
if (!specs.sources || !Array.isArray(specs.sources) || specs.sources.length == 0) {
|
|
55
|
+
throw TypeError("RadonArtifact: cannot build if no retrievals are passed");
|
|
56
|
+
}
|
|
57
|
+
specs.sources?.forEach((retrieval, index) => {
|
|
58
|
+
if (retrieval === undefined) {
|
|
59
|
+
throw TypeError(`RadonArtifact: retrieval #${index} is undefined`);
|
|
60
|
+
}
|
|
61
|
+
else if (!(retrieval instanceof RadonRetrieval)) {
|
|
62
|
+
throw TypeError(`RadonArtifact: retrieval #${index}: invalid type`);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
this.sources = specs.sources;
|
|
66
|
+
this.sourcesReducer = specs.sourcesReducer;
|
|
67
|
+
this.witnessReducer = specs.witnessReducer;
|
|
68
|
+
}
|
|
69
|
+
opsCount() {
|
|
70
|
+
return (this.sources?.map(retrieval => retrieval.opsCount()).reduce((sum, a) => sum + a) || 0)
|
|
71
|
+
+ this.sourcesReducer?.opsCount()
|
|
72
|
+
+ this.witnessReducer?.opsCount();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
class RadonRequest extends RadonArtifact {
|
|
76
|
+
/**
|
|
77
|
+
* Decodes a RadonRequest artifact out from a Protobuf-serialized bytecode.
|
|
78
|
+
* @param bytecode Radon request bytecode.
|
|
79
|
+
* @returns RadonRequest object.
|
|
80
|
+
*/
|
|
81
|
+
static fromBytecode(bytecode) {
|
|
82
|
+
let buffer;
|
|
83
|
+
if ((0, helpers_1.isHexString)(bytecode)) {
|
|
84
|
+
buffer = (0, helpers_1.fromHexString)(bytecode);
|
|
85
|
+
}
|
|
86
|
+
else if (bytecode instanceof Uint8Array) {
|
|
87
|
+
buffer = Buffer.from(bytecode);
|
|
88
|
+
}
|
|
89
|
+
else if (bytecode instanceof Buffer) {
|
|
90
|
+
buffer = bytecode;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
throw new TypeError(`RadonRequest: unsupported bytecode format: ${bytecode}`);
|
|
94
|
+
}
|
|
95
|
+
const obj = RADRequest.decode(buffer);
|
|
96
|
+
return RadonRequest.fromProtobuf(obj);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Decodes a RadonRequest artifact out from a Protobuf object.
|
|
100
|
+
* @param obj Protobuf object.
|
|
101
|
+
* @returns RadonRequest object.
|
|
102
|
+
*/
|
|
103
|
+
static fromProtobuf(obj) {
|
|
104
|
+
const sources = obj.retrieve.map((retrieval) => {
|
|
105
|
+
const specs = {};
|
|
106
|
+
if (retrieval?.url) {
|
|
107
|
+
specs.url = retrieval.url;
|
|
108
|
+
}
|
|
109
|
+
if (retrieval?.headers) {
|
|
110
|
+
specs.headers = Object.fromEntries(retrieval.headers.map((stringPair) => [
|
|
111
|
+
stringPair.left,
|
|
112
|
+
stringPair.right
|
|
113
|
+
]));
|
|
114
|
+
}
|
|
115
|
+
if (retrieval?.body && retrieval.body.length > 0) {
|
|
116
|
+
specs.body = (0, helpers_1.utf8ArrayToStr)(Object.values(retrieval.body));
|
|
117
|
+
}
|
|
118
|
+
if (retrieval?.script)
|
|
119
|
+
specs.script = (0, utils_2.parseRadonScript)((0, helpers_1.toHexString)(retrieval.script));
|
|
120
|
+
specs.method = retrieval.kind;
|
|
121
|
+
return new RadonRetrieval(specs);
|
|
122
|
+
});
|
|
123
|
+
const decodeFilter = (f) => {
|
|
124
|
+
if (f?.args && f.args.length > 0)
|
|
125
|
+
return new filters_1.RadonFilter(f.op, (0, cbor_1.decode)(Uint8Array.from(f.args)));
|
|
126
|
+
else
|
|
127
|
+
return new filters_1.RadonFilter(f.op);
|
|
128
|
+
};
|
|
129
|
+
return new RadonRequest({
|
|
130
|
+
sources,
|
|
131
|
+
sourcesReducer: new reducers_1.RadonReducer(obj.aggregate.reducer, obj.aggregate.filters?.map(decodeFilter)),
|
|
132
|
+
witnessReducer: new reducers_1.RadonReducer(obj.tally.reducer, obj.tally.filters?.map(decodeFilter))
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
constructor(specs) {
|
|
136
|
+
const sources = Array.isArray(specs.sources) ? specs.sources : [specs.sources];
|
|
137
|
+
super({
|
|
138
|
+
sources,
|
|
139
|
+
sourcesReducer: specs?.sourcesReducer || reducers.Mode(),
|
|
140
|
+
witnessReducer: specs?.witnessReducer || reducers.Mode(),
|
|
141
|
+
});
|
|
142
|
+
let argsCount = sources.map(retrieval => retrieval.argsCount).reduce((prev, curr) => prev + curr);
|
|
143
|
+
if (argsCount > 0) {
|
|
144
|
+
throw TypeError("RadonRequest: parameterized retrievals were passed");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
_encode() {
|
|
148
|
+
const payload = this.toProtobuf();
|
|
149
|
+
const errMsg = RADRequest.verify(payload);
|
|
150
|
+
if (errMsg) {
|
|
151
|
+
throw Error(errMsg);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const message = RADRequest.fromObject(payload);
|
|
155
|
+
return RADRequest.encode(message).finish();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async execDryRun() {
|
|
159
|
+
return (await (0, helpers_1.execRadonBytecode)(this.toBytecode(), '--json')).trim();
|
|
160
|
+
}
|
|
161
|
+
get radHash() {
|
|
162
|
+
return (0, helpers_1.toHexString)((0, utils_1.sha256)(this._encode()), false);
|
|
163
|
+
}
|
|
164
|
+
toBytecode() {
|
|
165
|
+
return (0, helpers_1.toHexString)(this._encode()); //encodeRADRequest(this.toProtobuf()), true)
|
|
166
|
+
}
|
|
167
|
+
toJSON(humanize) {
|
|
168
|
+
return {
|
|
169
|
+
retrieve: this.sources.map(retrieval => retrieval.toJSON(humanize)),
|
|
170
|
+
aggregate: this.sourcesReducer.toJSON(humanize),
|
|
171
|
+
tally: this.witnessReducer.toJSON(humanize),
|
|
172
|
+
...(humanize ? {} : { time_lock: 0 }),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
toProtobuf() {
|
|
176
|
+
return {
|
|
177
|
+
//timeLock: 0,
|
|
178
|
+
retrieve: this.sources.map(retrieval => retrieval.toProtobuf()),
|
|
179
|
+
aggregate: this.sourcesReducer.toProtobuf(),
|
|
180
|
+
tally: this.witnessReducer.toProtobuf(),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
weight() {
|
|
184
|
+
return this.toBytecode().slice(2).length / 2;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.RadonRequest = RadonRequest;
|
|
188
|
+
function RadonRequestFromAssets(specs) {
|
|
189
|
+
const sources = [];
|
|
190
|
+
const dict = retrievals.fromRadonAssets(specs.assets);
|
|
191
|
+
// const args: string[][] = []
|
|
192
|
+
Object.keys(specs.argsMap).forEach(key => {
|
|
193
|
+
const retrieval = dict[key];
|
|
194
|
+
const args = specs.argsMap[key];
|
|
195
|
+
if (retrieval.argsCount > 0) {
|
|
196
|
+
if (!args || args.length < retrieval.argsCount) {
|
|
197
|
+
throw TypeError(`Insufficient args passed to retrieval named as '${key}': ${args.length} < ${retrieval.argsCount}`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
sources.push(retrieval.foldArgs(args));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
sources.push(retrieval);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
return new RadonRequest({ sources, sourcesReducer: specs?.sourcesReducer, witnessReducer: specs?.witnessReducer });
|
|
208
|
+
}
|
|
209
|
+
;
|
|
210
|
+
function RadonScript(inputType) {
|
|
211
|
+
if (!inputType)
|
|
212
|
+
throw TypeError("Input Radon data type must be specified when declaring a new Radon script.");
|
|
213
|
+
return new inputType();
|
|
214
|
+
}
|
|
215
|
+
class RadonTemplate extends RadonArtifact {
|
|
216
|
+
constructor(specs, samples) {
|
|
217
|
+
const sources = Array.isArray(specs.sources) ? specs.sources : [specs.sources];
|
|
218
|
+
super({
|
|
219
|
+
sources,
|
|
220
|
+
sourcesReducer: specs?.sourcesReducer || reducers.Mode(),
|
|
221
|
+
witnessReducer: specs?.witnessReducer || reducers.Mode(),
|
|
222
|
+
});
|
|
223
|
+
this._argsCount = sources.map(retrieval => retrieval?.argsCount).reduce((prev, curr) => Math.max(prev, curr), 0);
|
|
224
|
+
if (this._argsCount == 0) {
|
|
225
|
+
throw TypeError("RadonTemplate: no parameterized retrievals were passed");
|
|
226
|
+
}
|
|
227
|
+
this.homogeneous = !sources.find(retrieval => retrieval.argsCount !== this._argsCount);
|
|
228
|
+
if (samples) {
|
|
229
|
+
Object.keys(samples).forEach(sample => {
|
|
230
|
+
let sampleArgs = Object(samples)[sample];
|
|
231
|
+
if (typeof sampleArgs === "string") {
|
|
232
|
+
sampleArgs = [sampleArgs];
|
|
233
|
+
}
|
|
234
|
+
if (sampleArgs.length > 0) {
|
|
235
|
+
if (!Array.isArray(sampleArgs[0])) {
|
|
236
|
+
Object(samples)[sample] = Array(sources.length).fill(sampleArgs);
|
|
237
|
+
sampleArgs = Object(samples)[sample];
|
|
238
|
+
}
|
|
239
|
+
else if (sampleArgs?.length != sources.length) {
|
|
240
|
+
throw TypeError(`RadonTemplate: arguments mismatch in sample "${sample}": ${sampleArgs?.length} samples given vs. ${sources.length} expected`);
|
|
241
|
+
}
|
|
242
|
+
sampleArgs?.forEach((subargs, index) => {
|
|
243
|
+
if (subargs.length < sources[index].argsCount) {
|
|
244
|
+
throw TypeError(`\x1b[1;33mRadonRequestTemplate: arguments mismatch in test \x1b[1;31m'${sample}'\x1b[1;33m: \x1b[1;37mRetrieval #${index}\x1b[1;33m: ${subargs?.length} parameters given vs. ${sources[index].argsCount} expected\x1b[0m`);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
this.samples = samples;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
get argsCount() {
|
|
253
|
+
return this._argsCount;
|
|
254
|
+
}
|
|
255
|
+
buildRadonRequest(args) {
|
|
256
|
+
const sources = [];
|
|
257
|
+
if (this.homogeneous) {
|
|
258
|
+
// args can be either any, string[] or string[0][]
|
|
259
|
+
if (Array.isArray(args) && args[0] && Array.isArray(args[0])) {
|
|
260
|
+
if (args.length > 1) {
|
|
261
|
+
throw new TypeError(`RadonTemplate: homogeneous template: args vector dimension ${args.length} > 1.`);
|
|
262
|
+
}
|
|
263
|
+
args = args[0];
|
|
264
|
+
}
|
|
265
|
+
else if (Array.isArray(args) && args.length !== this.argsCount) {
|
|
266
|
+
throw new TypeError(`RadonTemplate: homogenous template: missing ${this.argsCount - args.length} out of ${args.length} parameters.`);
|
|
267
|
+
}
|
|
268
|
+
this.sources.forEach(retrieval => sources.push(retrieval.foldArgs(args)));
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
if (!Array.isArray(args) || args.length !== this.sources.length) {
|
|
272
|
+
throw new TypeError(`RadonTemplate: args vector dimension ${args.length} != ${this.sources.length}`);
|
|
273
|
+
}
|
|
274
|
+
this.sources.forEach((retrieval, index) => {
|
|
275
|
+
if (Array.isArray(args[index]) && retrieval.argsCount !== args[index].length) {
|
|
276
|
+
throw new TypeError(`RadonTemplate: retrieval #${index + 1}: mismatching args count: ${args[index].length} != ${retrieval.argsCount} ([${args[index]})]`);
|
|
277
|
+
}
|
|
278
|
+
sources.push(retrieval.foldArgs(args[index]));
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
return new RadonRequest({
|
|
282
|
+
sources,
|
|
283
|
+
sourcesReducer: this.sourcesReducer,
|
|
284
|
+
witnessReducer: this.witnessReducer,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
exports.RadonTemplate = RadonTemplate;
|
|
289
|
+
class RadonModal extends RadonTemplate {
|
|
290
|
+
constructor(specs) {
|
|
291
|
+
if (!specs.retrieval.isModal()) {
|
|
292
|
+
throw TypeError("RadonModal: no modal retrieval was passed.");
|
|
293
|
+
}
|
|
294
|
+
super({
|
|
295
|
+
sources: [specs.retrieval],
|
|
296
|
+
sourcesReducer: specs?.sourcesReducer || reducers.Mode(),
|
|
297
|
+
witnessReducer: specs?.witnessReducer || reducers.Mode(),
|
|
298
|
+
}, specs.retrieval?.samples);
|
|
299
|
+
if (specs?.providers) {
|
|
300
|
+
this._providers = this._checkProviders(specs.providers);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
this._providers = [];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
get argsCount() {
|
|
307
|
+
return this._argsCount - 1;
|
|
308
|
+
}
|
|
309
|
+
get providers() {
|
|
310
|
+
return this._providers;
|
|
311
|
+
}
|
|
312
|
+
set providers(providers) {
|
|
313
|
+
this._providers = this._checkProviders(providers);
|
|
314
|
+
}
|
|
315
|
+
buildRadonRequest(args) {
|
|
316
|
+
if (this.argsCount > 0) {
|
|
317
|
+
return this.buildRadonTemplate(this.providers).buildRadonRequest(args);
|
|
318
|
+
}
|
|
319
|
+
else if (this.providers.length === 0) {
|
|
320
|
+
throw new TypeError(`RadonModal: no providers were previously settled.`);
|
|
321
|
+
}
|
|
322
|
+
return new RadonRequest({
|
|
323
|
+
sources: this.sources[0].spawnRetrievals(...this.providers),
|
|
324
|
+
sourcesReducer: this.sourcesReducer,
|
|
325
|
+
witnessReducer: this.witnessReducer,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
buildRadonTemplate(providers) {
|
|
329
|
+
if (!providers) {
|
|
330
|
+
providers = this._checkProviders([...this._providers]);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
providers = this._checkProviders([...providers]);
|
|
334
|
+
}
|
|
335
|
+
if (!providers || providers.length === 0) {
|
|
336
|
+
throw new TypeError(`RadonModal: no providers were specified.`);
|
|
337
|
+
}
|
|
338
|
+
return new RadonTemplate({
|
|
339
|
+
sources: this.sources[0].spawnRetrievals(...providers),
|
|
340
|
+
sourcesReducer: this.sourcesReducer,
|
|
341
|
+
witnessReducer: this.witnessReducer,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
_checkProviders(providers) {
|
|
345
|
+
providers.forEach(provider => {
|
|
346
|
+
const [schema,] = (0, helpers_1.parseURL)(provider);
|
|
347
|
+
if (!schema.startsWith("http://") && !schema.startsWith("https://")) {
|
|
348
|
+
throw TypeError(`RadonModal: invalid provider: ${provider}`);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
return providers;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
exports.RadonModal = RadonModal;
|
|
355
|
+
class RadonRetrieval {
|
|
356
|
+
constructor(specs, samples) {
|
|
357
|
+
if (specs.method === retrievals.Methods.RNG && (specs?.url || specs?.headers?.size || specs?.body)) {
|
|
358
|
+
throw TypeError("RadonRetrieval: RNG accepts no URLs or headers");
|
|
359
|
+
// } else if (!specs?.url && (method == Methods.HttpPost || method == Methods.HttpGet)) {
|
|
360
|
+
// throw TypeError("RadonRetrieval: URL must be specified");
|
|
361
|
+
}
|
|
362
|
+
else if (specs?.body && specs.method == retrievals.Methods.HttpGet) {
|
|
363
|
+
throw TypeError("RadonRetrieval: body cannot be specified in HTTP-GET queries");
|
|
364
|
+
}
|
|
365
|
+
this.method = specs.method;
|
|
366
|
+
if (specs?.url) {
|
|
367
|
+
this.url = specs.url;
|
|
368
|
+
if (!(0, helpers_1.isWildcard)(specs.url)) {
|
|
369
|
+
try {
|
|
370
|
+
let parts = (0, helpers_1.parseURL)(specs.url);
|
|
371
|
+
this.schema = parts[0];
|
|
372
|
+
if (parts[1] !== "")
|
|
373
|
+
this.authority = parts[1];
|
|
374
|
+
if (parts[2] !== "")
|
|
375
|
+
this.path = parts[2];
|
|
376
|
+
if (parts[3] !== "")
|
|
377
|
+
this.query = parts[3];
|
|
378
|
+
}
|
|
379
|
+
catch { }
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
else if (specs.method === retrievals.Methods.HttpGet
|
|
383
|
+
|| specs.method === retrievals.Methods.HttpPost
|
|
384
|
+
|| specs.method === retrievals.Methods.HttpHead) {
|
|
385
|
+
this.url = "\\0\\";
|
|
386
|
+
}
|
|
387
|
+
if (specs?.headers) {
|
|
388
|
+
if (typeof specs.headers !== 'object' || Array.isArray(specs.headers)) {
|
|
389
|
+
throw new TypeError("RadonRetrieval: HTTP headers must be of type Record<string, string>");
|
|
390
|
+
}
|
|
391
|
+
this.headers = specs?.headers;
|
|
392
|
+
}
|
|
393
|
+
this.body = specs?.body;
|
|
394
|
+
if (specs?.script)
|
|
395
|
+
this.script = new types_1.RadonScript(specs?.script);
|
|
396
|
+
this.argsCount = Math.max((0, helpers_1.getWildcardsCountFromString)(this?.url), (0, helpers_1.getWildcardsCountFromString)(this?.body), ...Object.keys(this?.headers || {}).map(key => (0, helpers_1.getWildcardsCountFromString)(key)) ?? [], ...Object.values(this?.headers || {}).map(value => (0, helpers_1.getWildcardsCountFromString)(value)) ?? [], this.script?.argsCount() || 0);
|
|
397
|
+
if (samples && this.argsCount === 0) {
|
|
398
|
+
throw new TypeError("RadonRetrieval: passed samples to non-parameterized retrieval.");
|
|
399
|
+
}
|
|
400
|
+
this.samples = samples;
|
|
401
|
+
if (specs?.argsKeys) {
|
|
402
|
+
if (this.argsCount === 0) {
|
|
403
|
+
throw new TypeError("RadonRetrieval: passed args keys to non-parameterized retrieval");
|
|
404
|
+
}
|
|
405
|
+
else if (specs.argsKeys.length !== this.argsCount) {
|
|
406
|
+
throw new TypeError(`RadonRetrieval: passed invalid number of args keys: ${specs.argsKeys.length} != ${this.argsCount}`);
|
|
407
|
+
}
|
|
408
|
+
this.argsKeys = specs.argsKeys;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
isModal() {
|
|
412
|
+
return !this.url || this.url === "\\0\\";
|
|
413
|
+
}
|
|
414
|
+
isParameterized() {
|
|
415
|
+
return this.argsCount > 0;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Creates a new Radon Retrieval by orderly replacing indexed wildcards with given parameters.
|
|
419
|
+
* Fails if not parameterized, of if passing too many parameters.
|
|
420
|
+
*/
|
|
421
|
+
foldArgs(args) {
|
|
422
|
+
if (this.argsCount === 0) {
|
|
423
|
+
throw new TypeError(`RadonRetrieval: cannot fold unparameterized retrieval`);
|
|
424
|
+
}
|
|
425
|
+
const params = [];
|
|
426
|
+
if (Array.isArray(args)) {
|
|
427
|
+
if (args.length > this.argsCount) {
|
|
428
|
+
throw new TypeError(`RadonRetrieval: too may args passed: ${args.length} > ${this.argsCount}`);
|
|
429
|
+
}
|
|
430
|
+
params.push(...args);
|
|
431
|
+
}
|
|
432
|
+
else if (typeof args === 'object') {
|
|
433
|
+
if (!this.argsKeys) {
|
|
434
|
+
throw new TypeError(`RadonRetrieval: unexpected args map: undefined args keys.`);
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
this.argsKeys.forEach(key => {
|
|
438
|
+
if (!args[key]) {
|
|
439
|
+
throw new TypeError(`RadonRetrieval: missing value for parameter "${key}".`);
|
|
440
|
+
}
|
|
441
|
+
params.push(args[key]);
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
params.push(args);
|
|
447
|
+
}
|
|
448
|
+
return new RadonRetrieval({
|
|
449
|
+
method: this.method,
|
|
450
|
+
url: (0, helpers_1.replaceWildcards)(this.url, params),
|
|
451
|
+
body: (0, helpers_1.replaceWildcards)(this.body, params),
|
|
452
|
+
headers: Object.fromEntries(Object.entries(this.headers || {}).map(([key, value]) => [
|
|
453
|
+
(0, helpers_1.replaceWildcards)(key, params),
|
|
454
|
+
(0, helpers_1.replaceWildcards)(value, params),
|
|
455
|
+
])),
|
|
456
|
+
script: this.script?.replaceWildcards(...params),
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Creates one or more clones of this retrieval, in which the index-0 wildcard
|
|
461
|
+
* will be replaced by the given values. Fails if the retrieval is not parameterized.
|
|
462
|
+
*/
|
|
463
|
+
spawnRetrievals(...values) {
|
|
464
|
+
const _spawned = [];
|
|
465
|
+
if (this.argsCount == 0) {
|
|
466
|
+
throw new TypeError(`RadonRetrieval: cannot spawn from unparameterized retrieval`);
|
|
467
|
+
}
|
|
468
|
+
values.forEach(value => {
|
|
469
|
+
_spawned.push(new RadonRetrieval({
|
|
470
|
+
method: this.method,
|
|
471
|
+
url: (0, helpers_1.spliceWildcard)(this.url, 0, value, this.argsCount),
|
|
472
|
+
body: (0, helpers_1.spliceWildcard)(this.body, 0, value, this.argsCount),
|
|
473
|
+
headers: Object.fromEntries(Object.entries(this.headers || {}).map(([headerKey, headerValue]) => [
|
|
474
|
+
(0, helpers_1.spliceWildcard)(headerKey, 0, value, this.argsCount),
|
|
475
|
+
(0, helpers_1.spliceWildcard)(headerValue, 0, value, this.argsCount),
|
|
476
|
+
])),
|
|
477
|
+
script: this.script?.spliceWildcard(0, value),
|
|
478
|
+
argsKeys: this.argsKeys?.slice(1),
|
|
479
|
+
}));
|
|
480
|
+
});
|
|
481
|
+
return _spawned;
|
|
482
|
+
}
|
|
483
|
+
toJSON(humanize) {
|
|
484
|
+
const kind = ["", "HTTP-GET", "RNG", "HTTP-POST", "HTTP-HEAD"];
|
|
485
|
+
let json = {
|
|
486
|
+
kind: kind[this.method] // humanize ? Methods[this.method] : this.method,
|
|
487
|
+
};
|
|
488
|
+
if (this.url)
|
|
489
|
+
json.url = this.url;
|
|
490
|
+
if (this.headers) {
|
|
491
|
+
json.headers = Object.entries(this.headers);
|
|
492
|
+
}
|
|
493
|
+
if (this.body)
|
|
494
|
+
json.body = this.body;
|
|
495
|
+
json.script = humanize ? this.script?.toString() : Array.from((0, helpers_1.fromHexString)(this.script?.toBytecode() || '0x80'));
|
|
496
|
+
return json;
|
|
497
|
+
}
|
|
498
|
+
toProtobuf() {
|
|
499
|
+
let protobuf = {
|
|
500
|
+
kind: this.method,
|
|
501
|
+
};
|
|
502
|
+
if (this.url)
|
|
503
|
+
protobuf.url = this.url;
|
|
504
|
+
if (this.headers) {
|
|
505
|
+
protobuf.headers = Object.entries(this.headers).map(([headerKey, headerValue]) => {
|
|
506
|
+
return {
|
|
507
|
+
left: headerKey,
|
|
508
|
+
right: headerValue,
|
|
509
|
+
};
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
if (this.body) {
|
|
513
|
+
const utf8Array = (0, helpers_1.toUtf8Array)(this.body);
|
|
514
|
+
protobuf.body = utf8Array;
|
|
515
|
+
}
|
|
516
|
+
protobuf.script = Object.values(Uint8Array.from((0, cbor_1.encode)(this.script?.encode() || [])));
|
|
517
|
+
return protobuf;
|
|
518
|
+
}
|
|
519
|
+
opsCount() {
|
|
520
|
+
return this._countOps(this.script?.encode() || []);
|
|
521
|
+
}
|
|
522
|
+
_countOps(items) {
|
|
523
|
+
return items.length > 0 ? items.map(item => Array.isArray(item) ? this._countOps(item) : 1).reduce((sum, a) => sum + a) : 0;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
exports.RadonRetrieval = RadonRetrieval;
|
|
527
|
+
var filters;
|
|
528
|
+
(function (filters) {
|
|
529
|
+
filters.Opcodes = filters_1.Opcodes;
|
|
530
|
+
filters.Class = filters_1.RadonFilter;
|
|
531
|
+
function Mode() { return new filters_1.RadonFilter(filters_1.Opcodes.Mode); }
|
|
532
|
+
filters.Mode = Mode;
|
|
533
|
+
function Stdev(stdev) { return new filters_1.RadonFilter(filters_1.Opcodes.StandardDeviation, stdev); }
|
|
534
|
+
filters.Stdev = Stdev;
|
|
535
|
+
})(filters || (exports.filters = filters = {}));
|
|
536
|
+
var reducers;
|
|
537
|
+
(function (reducers) {
|
|
538
|
+
reducers.Opcodes = reducers_1.Opcodes;
|
|
539
|
+
reducers.Class = reducers_1.RadonReducer;
|
|
540
|
+
function Mode(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.Mode, filters); }
|
|
541
|
+
reducers.Mode = Mode;
|
|
542
|
+
function Mean(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.MeanAverage, filters); }
|
|
543
|
+
reducers.Mean = Mean;
|
|
544
|
+
function Median(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.MedianAverage, filters); }
|
|
545
|
+
reducers.Median = Median;
|
|
546
|
+
function Stdev(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.StandardDeviation, filters); }
|
|
547
|
+
reducers.Stdev = Stdev;
|
|
548
|
+
function ConcatHash(...filters) { return new reducers_1.RadonReducer(reducers_1.Opcodes.ConcatenateAndHash, filters); }
|
|
549
|
+
reducers.ConcatHash = ConcatHash;
|
|
550
|
+
function PriceAggregate() { return new reducers_1.RadonReducer(reducers_1.Opcodes.MeanAverage, [filters.Stdev(1.4)]); }
|
|
551
|
+
reducers.PriceAggregate = PriceAggregate;
|
|
552
|
+
function PriceTally() { return new reducers_1.RadonReducer(reducers_1.Opcodes.MeanAverage, [filters.Stdev(2.5)]); }
|
|
553
|
+
reducers.PriceTally = PriceTally;
|
|
554
|
+
})(reducers || (exports.reducers = reducers = {}));
|
|
555
|
+
const ccdr = __importStar(require("./ccdr"));
|
|
556
|
+
var retrievals;
|
|
557
|
+
(function (retrievals) {
|
|
558
|
+
retrievals.rpc = ccdr;
|
|
559
|
+
function fromRadonAssets(assets) {
|
|
560
|
+
return new Proxy(assets, proxyHandler(RadonRetrieval));
|
|
561
|
+
}
|
|
562
|
+
retrievals.fromRadonAssets = fromRadonAssets;
|
|
563
|
+
let Methods;
|
|
564
|
+
(function (Methods) {
|
|
565
|
+
Methods[Methods["None"] = 0] = "None";
|
|
566
|
+
Methods[Methods["HttpGet"] = 1] = "HttpGet";
|
|
567
|
+
Methods[Methods["HttpHead"] = 4] = "HttpHead";
|
|
568
|
+
Methods[Methods["HttpPost"] = 3] = "HttpPost";
|
|
569
|
+
Methods[Methods["RNG"] = 2] = "RNG";
|
|
570
|
+
})(Methods = retrievals.Methods || (retrievals.Methods = {}));
|
|
571
|
+
/**
|
|
572
|
+
* Creates a Witnet randomness data source object.
|
|
573
|
+
* @param script (Optional) Radon Script to apply to the random seed proposed by every single witness,
|
|
574
|
+
* before aggregation.
|
|
575
|
+
**/
|
|
576
|
+
function RNG(script) {
|
|
577
|
+
const retrieval = new RadonRetrieval({ method: Methods.RNG, script });
|
|
578
|
+
if (retrieval?.script && retrieval?.script?.inputType?.constructor.name !== "RadonBytes") {
|
|
579
|
+
throw new TypeError("RNG scripts require [RadonBytes] as input type");
|
|
580
|
+
}
|
|
581
|
+
return retrieval;
|
|
582
|
+
}
|
|
583
|
+
retrievals.RNG = RNG;
|
|
584
|
+
;
|
|
585
|
+
/**
|
|
586
|
+
* Creates a HTTP/GET data retrieval object.
|
|
587
|
+
* @param specs Radon Retrieval specs.
|
|
588
|
+
**/
|
|
589
|
+
function HttpGet(specs) {
|
|
590
|
+
return new RadonRetrieval({
|
|
591
|
+
method: Methods.HttpGet,
|
|
592
|
+
url: specs?.url,
|
|
593
|
+
headers: specs?.headers,
|
|
594
|
+
script: specs?.script,
|
|
595
|
+
argsKeys: specs?.argsKeys,
|
|
596
|
+
}, specs?.samples);
|
|
597
|
+
}
|
|
598
|
+
retrievals.HttpGet = HttpGet;
|
|
599
|
+
;
|
|
600
|
+
/**
|
|
601
|
+
* Creates a HTTP/HEAD data retrieval object.
|
|
602
|
+
* @param specs Radon Retrieval specs.
|
|
603
|
+
**/
|
|
604
|
+
function HttpHead(specs) {
|
|
605
|
+
return new RadonRetrieval({
|
|
606
|
+
method: Methods.HttpHead,
|
|
607
|
+
url: specs?.url,
|
|
608
|
+
headers: specs?.headers,
|
|
609
|
+
script: specs?.script,
|
|
610
|
+
argsKeys: specs?.argsKeys,
|
|
611
|
+
}, specs?.samples);
|
|
612
|
+
}
|
|
613
|
+
retrievals.HttpHead = HttpHead;
|
|
614
|
+
;
|
|
615
|
+
/**
|
|
616
|
+
* Creates a HTTP/POST data retrieval object.
|
|
617
|
+
* @param specs Radon Retrieval specs.
|
|
618
|
+
**/
|
|
619
|
+
function HttpPost(specs) {
|
|
620
|
+
return new RadonRetrieval({
|
|
621
|
+
method: Methods.HttpPost,
|
|
622
|
+
url: specs?.url,
|
|
623
|
+
headers: specs?.headers,
|
|
624
|
+
body: specs?.body,
|
|
625
|
+
script: specs?.script,
|
|
626
|
+
argsKeys: specs?.argsKeys,
|
|
627
|
+
}, specs?.samples);
|
|
628
|
+
}
|
|
629
|
+
retrievals.HttpPost = HttpPost;
|
|
630
|
+
;
|
|
631
|
+
/**
|
|
632
|
+
* Creates a GraphQL-query data source object.
|
|
633
|
+
* @param specs Radon Retrieval specs.
|
|
634
|
+
**/
|
|
635
|
+
function GraphQLQuery(specs) {
|
|
636
|
+
return new RadonRetrieval({
|
|
637
|
+
method: Methods.HttpPost,
|
|
638
|
+
url: specs.url,
|
|
639
|
+
body: `{\"query\":\"${(0, graphql_query_compress_1.default)(specs.query).replaceAll('"', '\\"')}\"}`,
|
|
640
|
+
headers: { "Content-Type": "application/json;charset=UTF-8" },
|
|
641
|
+
script: specs?.script,
|
|
642
|
+
argsKeys: specs?.argsKeys,
|
|
643
|
+
}, specs?.samples);
|
|
644
|
+
}
|
|
645
|
+
retrievals.GraphQLQuery = GraphQLQuery;
|
|
646
|
+
;
|
|
647
|
+
/**
|
|
648
|
+
* Creates a JSON-RPC data retrieval object.
|
|
649
|
+
* @param specs Radon Retrieval specs.
|
|
650
|
+
**/
|
|
651
|
+
function JsonRPC(specs) {
|
|
652
|
+
return new RadonRetrieval({
|
|
653
|
+
method: retrievals.Methods.HttpPost,
|
|
654
|
+
url: "\\0\\",
|
|
655
|
+
body: JSON.stringify({
|
|
656
|
+
jsonrpc: "2.0",
|
|
657
|
+
method: specs.rpc.method,
|
|
658
|
+
params: specs.rpc?.params,
|
|
659
|
+
id: 1,
|
|
660
|
+
}).replaceAll('\\\\', '\\'),
|
|
661
|
+
headers: { "Content-Type": "application/json;charset=UTF-8" },
|
|
662
|
+
script: specs?.script,
|
|
663
|
+
argsKeys: specs?.argsKeys,
|
|
664
|
+
}, specs?.samples);
|
|
665
|
+
}
|
|
666
|
+
retrievals.JsonRPC = JsonRPC;
|
|
667
|
+
})(retrievals || (exports.retrievals = retrievals = {}));
|
|
668
|
+
var types;
|
|
669
|
+
(function (types) {
|
|
670
|
+
types.RadonArray = types_1.RadonArray;
|
|
671
|
+
types.RadonBoolean = types_1.RadonBoolean;
|
|
672
|
+
types.RadonBytes = types_1.RadonBytes;
|
|
673
|
+
types.RadonFloat = types_1.RadonFloat;
|
|
674
|
+
types.RadonInteger = types_1.RadonInteger;
|
|
675
|
+
types.RadonMap = types_1.RadonMap;
|
|
676
|
+
types.RadonScript = types_1.RadonScript;
|
|
677
|
+
types.RadonString = types_1.RadonString;
|
|
678
|
+
})(types || (exports.types = types = {}));
|
|
679
|
+
function proxyHandler(t) {
|
|
680
|
+
return {
|
|
681
|
+
get(target, prop) {
|
|
682
|
+
let found = target[prop] ?? findKeyInObject(target, prop);
|
|
683
|
+
// if (!found) {
|
|
684
|
+
// throw EvalError(`['${prop}'] was not found in dictionary`)
|
|
685
|
+
// } else
|
|
686
|
+
if (found && !(found instanceof t)) {
|
|
687
|
+
throw TypeError(`['${prop}'] was found with type ${found?.constructor?.name} instead of ${t.name}!`);
|
|
688
|
+
}
|
|
689
|
+
return found;
|
|
690
|
+
}
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
function findKeyInObject(dict, tag) {
|
|
694
|
+
for (const key in dict) {
|
|
695
|
+
if (typeof dict[key] === 'object') {
|
|
696
|
+
if (key === tag) {
|
|
697
|
+
return dict[key];
|
|
698
|
+
}
|
|
699
|
+
else {
|
|
700
|
+
let found = findKeyInObject(dict[key], tag);
|
|
701
|
+
if (found)
|
|
702
|
+
return found;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdNQSx3REF1QkM7QUFFRCxrQ0FHQztBQTVORCwrQkFHYTtBQUNiLG9GQUFvRDtBQUVwRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFBO0FBQ2xHLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUE7QUFFcEQsK0NBWTBCO0FBRTFCLDJDQUF3QztBQUN4QyxtQ0FBMEM7QUFDMUMsdUNBQTJEO0FBQzNELHlDQUE4RDtBQUU5RCxtQ0FTZ0I7QUFJaEIsTUFBTSxhQUFhO0lBTWpCLFlBQVksS0FJWDtRQUNDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakYsTUFBTSxTQUFTLENBQUMseURBQXlELENBQUMsQ0FBQTtRQUM1RSxDQUFDO1FBQ0QsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sU0FBUyxDQUFDLDZCQUE2QixLQUFLLGVBQWUsQ0FBQyxDQUFBO1lBQ3BFLENBQUM7aUJBQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxZQUFZLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sU0FBUyxDQUFDLDZCQUE2QixLQUFLLGdCQUFn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QUFHLENBQUMsQ0FBQTtZQUN4RyxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUE7UUFDaEIsQ0FBQztLQUNKLENBQUE7QUFDTCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsSUFBUyxFQUFFLEdBQVc7SUFDM0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3BCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLEtBQUssR0FBUSxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUNoRCxJQUFJLEtBQUs7b0JBQUUsT0FBTyxLQUFLLENBQUE7WUFDM0IsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgZGVjb2RlIGFzIGNib3JEZWNvZGUsXHJcbiAgZW5jb2RlIGFzIGNib3JFbmNvZGUsXHJcbn0gZnJvbSAnY2JvcidcclxuaW1wb3J0IGdyYXBoUWxDb21wcmVzcyBmcm9tICdncmFwaHFsLXF1ZXJ5LWNvbXByZXNzJ1xyXG5cclxuY29uc3QgcHJvdG9CdWYgPSByZXF1aXJlKFwicHJvdG9idWZqc1wiKS5Sb290LmZyb21KU09OKHJlcXVpcmUoXCIuLi8uLi8uLi93aXRuZXQvd2l0bmV0LnByb3RvLmpzb25cIikpXHJcbmNvbnN0IFJBRFJlcXVlc3QgPSBwcm90b0J1Zi5sb29rdXBUeXBlKFwiUkFEUmVxdWVzdFwiKVxyXG5cclxuaW1wb3J0IHtcclxuICBleGVjUmFkb25CeXRlY29kZSxcclxuICBmcm9tSGV4U3RyaW5nLFxyXG4gIGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyxcclxuICBpc0hleFN0cmluZyxcclxuICBpc1dpbGRjYXJkLFxyXG4gIHBhcnNlVVJMLFxyXG4gIHJlcGxhY2VXaWxkY2FyZHMsXHJcbiAgc3BsaWNlV2lsZGNhcmQsXHJcbiAgdG9IZXhTdHJpbmcsXHJcbiAgdG9VdGY4QXJyYXksXHJcbiAgdXRmOEFycmF5VG9TdHIsXHJcbn0gZnJvbSBcIi4uLy4uL2Jpbi9oZWxwZXJzXCJcclxuXHJcbmltcG9ydCB7IHNoYTI1NiB9IGZyb20gXCIuLi9jcnlwdG8vdXRpbHNcIlxyXG5pbXBvcnQgeyBwYXJzZVJhZG9uU2NyaXB0IH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIEZpbHRlcnMsIFJhZG9uRmlsdGVyIH0gZnJvbSAnLi9maWx0ZXJzJ1xyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIFJlZHVjZXJzLCBSYWRvblJlZHVjZXIgfSBmcm9tICcuL3JlZHVjZXJzJ1xyXG5pbXBvcnQgeyBSYWRvbkFueSwgUmFkb25TdHJpbmcsIFJhZG9uT3BlcmF0b3IgfSBmcm9tICcuL3R5cGVzJ1xyXG5pbXBvcnQge1xyXG4gIFJhZG9uQXJyYXkgYXMgX1JhZG9uQXJyYXksXHJcbiAgUmFkb25Cb29sZWFuIGFzIF9SYWRvbkJvb2xlYW4sXHJcbiAgUmFkb25CeXRlcyBhcyBfUmFkb25CeXRlcyxcclxuICBSYWRvbkZsb2F0IGFzIF9SYWRvbkZsb2F0LFxyXG4gIFJhZG9uSW50ZWdlciBhcyBfUmFkb25JbnRlZ2VyLFxyXG4gIFJhZG9uTWFwIGFzIF9SYWRvbk1hcCxcclxuICBSYWRvblN0cmluZyBhcyBfUmFkb25TdHJpbmcsXHJcbiAgUmFkb25TY3JpcHQgYXMgX1JhZG9uU2NyaXB0LFxyXG59IGZyb20gJy4vdHlwZXMnXHJcblxyXG50eXBlIEFyZ3MgPSBzdHJpbmdbXSB8IHN0cmluZ1tdW107XHJcblxyXG5jbGFzcyBSYWRvbkFydGlmYWN0IHtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsW107XHJcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZXNSZWR1Y2VyOiBSYWRvblJlZHVjZXI7XHJcbiAgcHVibGljIHJlYWRvbmx5IHdpdG5lc3NSZWR1Y2VyOiBSYWRvblJlZHVjZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHNwZWNzOiB7XHJcbiAgICBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdLFxyXG4gICAgc291cmNlc1JlZHVjZXI6IFJhZG9uUmVkdWNlcixcclxuICAgIHdpdG5lc3NSZWR1Y2VyOiBSYWRvblJlZHVjZXIsXHJcbiAgfSkge1xyXG4gICAgaWYgKCFzcGVjcy5zb3VyY2VzIHx8ICFBcnJheS5pc0FycmF5KHNwZWNzLnNvdXJjZXMpIHx8IHNwZWNzLnNvdXJjZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiUmFkb25BcnRpZmFjdDogY2Fubm90IGJ1aWxkIGlmIG5vIHJldHJpZXZhbHMgYXJlIHBhc3NlZFwiKVxyXG4gICAgfVxyXG4gICAgc3BlY3Muc291cmNlcz8uZm9yRWFjaCgocmV0cmlldmFsLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAocmV0cmlldmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYFJhZG9uQXJ0aWZhY3Q6IHJldHJpZXZhbCAjJHtpbmRleH0gaXMgdW5kZWZpbmVkYClcclxuICAgICAgfSBlbHNlIGlmICghKHJldHJpZXZhbCBpbnN0YW5jZW9mIFJhZG9uUmV0cmlldmFsKSkge1xyXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihgUmFkb25BcnRpZmFjdDogcmV0cmlldmFsICMke2luZGV4fTogaW52YWxpZCB0eXBlYClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHRoaXMuc291cmNlcyA9IHNwZWNzLnNvdXJjZXM7XHJcbiAgICB0aGlzLnNvdXJjZXNSZWR1Y2VyID0gc3BlY3Muc291cmNlc1JlZHVjZXI7XHJcbiAgICB0aGlzLndpdG5lc3NSZWR1Y2VyID0gc3BlY3Mud2l0bmVzc1JlZHVjZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5zb3VyY2VzPy5tYXAocmV0cmlldmFsID0+IHJldHJpZXZhbC5vcHNDb3VudCgpKS5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgYSkgfHwgMClcclxuICAgICAgKyB0aGlzLnNvdXJjZXNSZWR1Y2VyPy5vcHNDb3VudCgpXHJcbiAgICAgICsgdGhpcy53aXRuZXNzUmVkdWNlcj8ub3BzQ291bnQoKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uUmVxdWVzdCBleHRlbmRzIFJhZG9uQXJ0aWZhY3Qge1xyXG5cclxuICAvKipcclxuICAgKiBEZWNvZGVzIGEgUmFkb25SZXF1ZXN0IGFydGlmYWN0IG91dCBmcm9tIGEgUHJvdG9idWYtc2VyaWFsaXplZCBieXRlY29kZS5cclxuICAgKiBAcGFyYW0gYnl0ZWNvZGUgUmFkb24gcmVxdWVzdCBieXRlY29kZS5cclxuICAgKiBAcmV0dXJucyBSYWRvblJlcXVlc3Qgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJ5dGVjb2RlKGJ5dGVjb2RlOiBhbnkpIHtcclxuICAgIGxldCBidWZmZXJcclxuICAgIGlmIChpc0hleFN0cmluZyhieXRlY29kZSkpIHtcclxuICAgICAgYnVmZmVyID0gZnJvbUhleFN0cmluZyhieXRlY29kZSlcclxuICAgIH0gZWxzZSBpZiAoYnl0ZWNvZGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XHJcbiAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJ5dGVjb2RlKVxyXG4gICAgfSBlbHNlIGlmIChieXRlY29kZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xyXG4gICAgICBidWZmZXIgPSBieXRlY29kZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25SZXF1ZXN0OiB1bnN1cHBvcnRlZCBieXRlY29kZSBmb3JtYXQ6ICR7Ynl0ZWNvZGV9YClcclxuICAgIH1cclxuICAgIGNvbnN0IG9iajogYW55ID0gUkFEUmVxdWVzdC5kZWNvZGUoYnVmZmVyKVxyXG4gICAgcmV0dXJuIFJhZG9uUmVxdWVzdC5mcm9tUHJvdG9idWYob2JqKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVjb2RlcyBhIFJhZG9uUmVxdWVzdCBhcnRpZmFjdCBvdXQgZnJvbSBhIFByb3RvYnVmIG9iamVjdC5cclxuICAgKiBAcGFyYW0gb2JqIFByb3RvYnVmIG9iamVjdC5cclxuICAgKiBAcmV0dXJucyBSYWRvblJlcXVlc3Qgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVByb3RvYnVmKG9iajogYW55KSB7XHJcbiAgICBjb25zdCBzb3VyY2VzID0gb2JqLnJldHJpZXZlLm1hcCgocmV0cmlldmFsOiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qgc3BlY3M6IGFueSA9IHt9XHJcbiAgICAgIGlmIChyZXRyaWV2YWw/LnVybCkgeyBzcGVjcy51cmwgPSByZXRyaWV2YWwudXJsIH1cclxuICAgICAgaWYgKHJldHJpZXZhbD8uaGVhZGVycykge1xyXG4gICAgICAgIHNwZWNzLmhlYWRlcnMgPSBPYmplY3QuZnJvbUVudHJpZXMocmV0cmlldmFsLmhlYWRlcnMubWFwKChzdHJpbmdQYWlyOiBhbnkpID0+IFtcclxuICAgICAgICAgIHN0cmluZ1BhaXIubGVmdCxcclxuICAgICAgICAgIHN0cmluZ1BhaXIucmlnaHRcclxuICAgICAgICBdKSlcclxuICAgICAgfVxyXG4gICAgICBpZiAocmV0cmlldmFsPy5ib2R5ICYmIHJldHJpZXZhbC5ib2R5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICBzcGVjcy5ib2R5ID0gdXRmOEFycmF5VG9TdHIoT2JqZWN0LnZhbHVlcyhyZXRyaWV2YWwuYm9keSkpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJldHJpZXZhbD8uc2NyaXB0KSBzcGVjcy5zY3JpcHQgPSBwYXJzZVJhZG9uU2NyaXB0KHRvSGV4U3RyaW5nKHJldHJpZXZhbC5zY3JpcHQpKVxyXG4gICAgICBzcGVjcy5tZXRob2QgPSByZXRyaWV2YWwua2luZFxyXG4gICAgICByZXR1cm4gbmV3IFJhZG9uUmV0cmlldmFsKHNwZWNzKVxyXG4gICAgfSlcclxuICAgIGNvbnN0IGRlY29kZUZpbHRlciA9IChmOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGY/LmFyZ3MgJiYgZi5hcmdzLmxlbmd0aCA+IDApIHJldHVybiBuZXcgUmFkb25GaWx0ZXIoZi5vcCwgY2JvckRlY29kZShVaW50OEFycmF5LmZyb20oZi5hcmdzKSkpXHJcbiAgICAgIGVsc2UgcmV0dXJuIG5ldyBSYWRvbkZpbHRlcihmLm9wKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUmFkb25SZXF1ZXN0KHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IG5ldyBSYWRvblJlZHVjZXIob2JqLmFnZ3JlZ2F0ZS5yZWR1Y2VyLCBvYmouYWdncmVnYXRlLmZpbHRlcnM/Lm1hcChkZWNvZGVGaWx0ZXIpKSxcclxuICAgICAgd2l0bmVzc1JlZHVjZXI6IG5ldyBSYWRvblJlZHVjZXIob2JqLnRhbGx5LnJlZHVjZXIsIG9iai50YWxseS5maWx0ZXJzPy5tYXAoZGVjb2RlRmlsdGVyKSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihzcGVjczoge1xyXG4gICAgc291cmNlczogUmFkb25SZXRyaWV2YWwgfCBSYWRvblJldHJpZXZhbFtdLFxyXG4gICAgc291cmNlc1JlZHVjZXI/OiBSYWRvblJlZHVjZXIsXHJcbiAgICB3aXRuZXNzUmVkdWNlcj86IFJhZG9uUmVkdWNlcixcclxuICB9KSB7XHJcbiAgICBjb25zdCBzb3VyY2VzID0gQXJyYXkuaXNBcnJheShzcGVjcy5zb3VyY2VzKSA/IHNwZWNzLnNvdXJjZXMgYXMgUmFkb25SZXRyaWV2YWxbXSA6IFtzcGVjcy5zb3VyY2VzXVxyXG4gICAgc3VwZXIoe1xyXG4gICAgICBzb3VyY2VzLFxyXG4gICAgICBzb3VyY2VzUmVkdWNlcjogc3BlY3M/LnNvdXJjZXNSZWR1Y2VyIHx8IHJlZHVjZXJzLk1vZGUoKSxcclxuICAgICAgd2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICB9KVxyXG4gICAgbGV0IGFyZ3NDb3VudCA9IHNvdXJjZXMubWFwKHJldHJpZXZhbCA9PiByZXRyaWV2YWwuYXJnc0NvdW50KS5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyKVxyXG4gICAgaWYgKGFyZ3NDb3VudCA+IDApIHtcclxuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiUmFkb25SZXF1ZXN0OiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMgd2VyZSBwYXNzZWRcIilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfZW5jb2RlKCk6IEJ1ZmZlciB7XHJcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy50b1Byb3RvYnVmKClcclxuICAgIGNvbnN0IGVyck1zZyA9IFJBRFJlcXVlc3QudmVyaWZ5KHBheWxvYWQpXHJcbiAgICBpZiAoZXJyTXNnKSB7XHJcbiAgICAgIHRocm93IEVycm9yKGVyck1zZyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBtZXNzYWdlID0gUkFEUmVxdWVzdC5mcm9tT2JqZWN0KHBheWxvYWQpO1xyXG4gICAgICByZXR1cm4gUkFEUmVxdWVzdC5lbmNvZGUobWVzc2FnZSkuZmluaXNoKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBleGVjRHJ5UnVuKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gKGF3YWl0IGV4ZWNSYWRvbkJ5dGVjb2RlKHRoaXMudG9CeXRlY29kZSgpLCAnLS1qc29uJykpLnRyaW0oKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCByYWRIYXNoKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdG9IZXhTdHJpbmcoc2hhMjU2KHRoaXMuX2VuY29kZSgpKSwgZmFsc2UpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9CeXRlY29kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRvSGV4U3RyaW5nKHRoaXMuX2VuY29kZSgpKS8vZW5jb2RlUkFEUmVxdWVzdCh0aGlzLnRvUHJvdG9idWYoKSksIHRydWUpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9KU09OKGh1bWFuaXplPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXRyaWV2ZTogdGhpcy5zb3VyY2VzLm1hcChyZXRyaWV2YWwgPT4gcmV0cmlldmFsLnRvSlNPTihodW1hbml6ZSkpLFxyXG4gICAgICBhZ2dyZWdhdGU6IHRoaXMuc291cmNlc1JlZHVjZXIudG9KU09OKGh1bWFuaXplKSxcclxuICAgICAgdGFsbHk6IHRoaXMud2l0bmVzc1JlZHVjZXIudG9KU09OKGh1bWFuaXplKSxcclxuICAgICAgLi4uKGh1bWFuaXplID8ge30gOiB7IHRpbWVfbG9jazogMCB9KSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b1Byb3RvYnVmKCk6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvL3RpbWVMb2NrOiAwLFxyXG4gICAgICByZXRyaWV2ZTogdGhpcy5zb3VyY2VzLm1hcChyZXRyaWV2YWwgPT4gcmV0cmlldmFsLnRvUHJvdG9idWYoKSksXHJcbiAgICAgIGFnZ3JlZ2F0ZTogdGhpcy5zb3VyY2VzUmVkdWNlci50b1Byb3RvYnVmKCksXHJcbiAgICAgIHRhbGx5OiB0aGlzLndpdG5lc3NSZWR1Y2VyLnRvUHJvdG9idWYoKSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB3ZWlnaHQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnRvQnl0ZWNvZGUoKS5zbGljZSgyKS5sZW5ndGggLyAyO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFJhZG9uUmVxdWVzdEZyb21Bc3NldHMoc3BlY3M6IHtcclxuICBhc3NldHM6IE9iamVjdCxcclxuICBhcmdzTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnkgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4sIFxyXG4gIHNvdXJjZXNSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG59KTogUmFkb25SZXF1ZXN0IHtcclxuICBjb25zdCBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdID0gW11cclxuICBjb25zdCBkaWN0ID0gcmV0cmlldmFscy5mcm9tUmFkb25Bc3NldHMoc3BlY3MuYXNzZXRzKVxyXG4gIC8vIGNvbnN0IGFyZ3M6IHN0cmluZ1tdW10gPSBbXVxyXG4gIE9iamVjdC5rZXlzKHNwZWNzLmFyZ3NNYXApLmZvckVhY2goa2V5ID0+IHtcclxuICAgIGNvbnN0IHJldHJpZXZhbDogUmFkb25SZXRyaWV2YWwgPSBkaWN0W2tleV0gXHJcbiAgICBjb25zdCBhcmdzID0gKHNwZWNzLmFyZ3NNYXAgYXMgYW55KVtrZXldXHJcbiAgICBpZiAocmV0cmlldmFsLmFyZ3NDb3VudCA+IDApIHtcclxuICAgICAgaWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDwgcmV0cmlldmFsLmFyZ3NDb3VudCkge1xyXG4gICAgICAgIHRocm93IFR5cGVFcnJvcihgSW5zdWZmaWNpZW50IGFyZ3MgcGFzc2VkIHRvIHJldHJpZXZhbCBuYW1lZCBhcyAnJHtrZXl9JzogJHthcmdzLmxlbmd0aH0gPCAke3JldHJpZXZhbC5hcmdzQ291bnR9YClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3MpKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsKVxyXG4gICAgfVxyXG4gIH0pXHJcbiAgcmV0dXJuIG5ldyBSYWRvblJlcXVlc3QoeyBzb3VyY2VzLCBzb3VyY2VzUmVkdWNlcjogc3BlY3M/LnNvdXJjZXNSZWR1Y2VyLCB3aXRuZXNzUmVkdWNlcjogc3BlY3M/LndpdG5lc3NSZWR1Y2VyIH0pXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmFkb25TY3JpcHQ8SW5wdXRUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvblN0cmluZz4oaW5wdXRUeXBlOiB7IG5ldyhvcHM/OiBSYWRvbk9wZXJhdG9yKTogSW5wdXRUeXBlOyB9KTogSW5wdXRUeXBlIHtcclxuICBpZiAoIWlucHV0VHlwZSkgdGhyb3cgVHlwZUVycm9yKFwiSW5wdXQgUmFkb24gZGF0YSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gZGVjbGFyaW5nIGEgbmV3IFJhZG9uIHNjcmlwdC5cIilcclxuICByZXR1cm4gbmV3IGlucHV0VHlwZSgpO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25UZW1wbGF0ZSBleHRlbmRzIFJhZG9uQXJ0aWZhY3Qge1xyXG5cclxuICBwcm90ZWN0ZWQgX2FyZ3NDb3VudDogbnVtYmVyO1xyXG4gIFxyXG4gIHB1YmxpYyByZWFkb25seSBob21vZ2VuZW91czogYm9vbGVhbjtcclxuICBwdWJsaWMgcmVhZG9ubHkgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIEFyZ3M+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHNwZWNzOiB7XHJcbiAgICAgIHNvdXJjZXM6IFJhZG9uUmV0cmlldmFsIHwgUmFkb25SZXRyaWV2YWxbXSxcclxuICAgICAgc291cmNlc1JlZHVjZXI/OiBSYWRvblJlZHVjZXIsXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gICAgfSxcclxuICAgIHNhbXBsZXM/OiBSZWNvcmQ8c3RyaW5nLCBBcmdzPlxyXG4gICkge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkoc3BlY3Muc291cmNlcykgPyBzcGVjcy5zb3VyY2VzIGFzIFJhZG9uUmV0cmlldmFsW10gOiBbc3BlY3Muc291cmNlc11cclxuICAgIHN1cGVyKHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiBzcGVjcz8ud2l0bmVzc1JlZHVjZXIgfHwgcmVkdWNlcnMuTW9kZSgpLFxyXG4gICAgfSlcclxuICAgIHRoaXMuX2FyZ3NDb3VudCA9IHNvdXJjZXMubWFwKHJldHJpZXZhbCA9PiByZXRyaWV2YWw/LmFyZ3NDb3VudCkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLm1heChwcmV2LCBjdXJyKSwgMClcclxuICAgIGlmICh0aGlzLl9hcmdzQ291bnQgPT0gMCkge1xyXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvblRlbXBsYXRlOiBubyBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMgd2VyZSBwYXNzZWRcIilcclxuICAgIH1cclxuICAgIHRoaXMuaG9tb2dlbmVvdXMgPSAhc291cmNlcy5maW5kKHJldHJpZXZhbCA9PiByZXRyaWV2YWwuYXJnc0NvdW50ICE9PSB0aGlzLl9hcmdzQ291bnQpXHJcbiAgICBpZiAoc2FtcGxlcykge1xyXG4gICAgICBPYmplY3Qua2V5cyhzYW1wbGVzKS5mb3JFYWNoKHNhbXBsZSA9PiB7XHJcbiAgICAgICAgbGV0IHNhbXBsZUFyZ3M6IEFyZ3MgPSBPYmplY3Qoc2FtcGxlcylbc2FtcGxlXVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2FtcGxlQXJncyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgc2FtcGxlQXJncyA9IFtzYW1wbGVBcmdzXVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2FtcGxlQXJncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2FtcGxlQXJnc1swXSkpIHtcclxuICAgICAgICAgICAgT2JqZWN0KHNhbXBsZXMpW3NhbXBsZV0gPSBBcnJheShzb3VyY2VzLmxlbmd0aCkuZmlsbChzYW1wbGVBcmdzKVxyXG4gICAgICAgICAgICBzYW1wbGVBcmdzID0gT2JqZWN0KHNhbXBsZXMpW3NhbXBsZV1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlQXJncz8ubGVuZ3RoICE9IHNvdXJjZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogYXJndW1lbnRzIG1pc21hdGNoIGluIHNhbXBsZSBcIiR7c2FtcGxlfVwiOiAke3NhbXBsZUFyZ3M/Lmxlbmd0aH0gc2FtcGxlcyBnaXZlbiB2cy4gJHtzb3VyY2VzLmxlbmd0aH0gZXhwZWN0ZWRgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2FtcGxlQXJncz8uZm9yRWFjaCgoc3ViYXJncywgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHN1YmFyZ3MubGVuZ3RoIDwgc291cmNlc1tpbmRleF0uYXJnc0NvdW50KSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBcXHgxYlsxOzMzbVJhZG9uUmVxdWVzdFRlbXBsYXRlOiBhcmd1bWVudHMgbWlzbWF0Y2ggaW4gdGVzdCBcXHgxYlsxOzMxbScke3NhbXBsZX0nXFx4MWJbMTszM206IFxceDFiWzE7MzdtUmV0cmlldmFsICMke2luZGV4fVxceDFiWzE7MzNtOiAke3N1YmFyZ3M/Lmxlbmd0aH0gcGFyYW1ldGVycyBnaXZlbiB2cy4gJHtzb3VyY2VzW2luZGV4XS5hcmdzQ291bnR9IGV4cGVjdGVkXFx4MWJbMG1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5zYW1wbGVzID0gc2FtcGxlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hcmdzQ291bnRcclxuICB9XHJcblxyXG4gIHB1YmxpYyBidWlsZFJhZG9uUmVxdWVzdChhcmdzOiBhbnkgfCBhbnlbXSB8IHN0cmluZ1tdIHwgc3RyaW5nW11bXSk6IFJhZG9uUmVxdWVzdCB7XHJcbiAgICBjb25zdCBzb3VyY2VzOiBSYWRvblJldHJpZXZhbFtdID0gW11cclxuICAgIGlmICh0aGlzLmhvbW9nZW5lb3VzKSB7XHJcbiAgICAgIC8vIGFyZ3MgY2FuIGJlIGVpdGhlciBhbnksIHN0cmluZ1tdIG9yIHN0cmluZ1swXVtdIFxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzWzBdICYmIEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcclxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSAge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogaG9tb2dlbmVvdXMgdGVtcGxhdGU6IGFyZ3MgdmVjdG9yIGRpbWVuc2lvbiAke2FyZ3MubGVuZ3RofSA+IDEuYClcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJncyA9IGFyZ3NbMF1cclxuICAgICAgICBcclxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MubGVuZ3RoICE9PSB0aGlzLmFyZ3NDb3VudCkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgICBgUmFkb25UZW1wbGF0ZTogaG9tb2dlbm91cyB0ZW1wbGF0ZTogbWlzc2luZyAke3RoaXMuYXJnc0NvdW50IC0gYXJncy5sZW5ndGh9IG91dCBvZiAke2FyZ3MubGVuZ3RofSBwYXJhbWV0ZXJzLmBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc291cmNlcy5mb3JFYWNoKHJldHJpZXZhbCA9PiBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3MpKSlcclxuICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpIHx8IGFyZ3MubGVuZ3RoICE9PSB0aGlzLnNvdXJjZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25UZW1wbGF0ZTogYXJncyB2ZWN0b3IgZGltZW5zaW9uICR7YXJncy5sZW5ndGh9ICE9ICR7dGhpcy5zb3VyY2VzLmxlbmd0aH1gKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc291cmNlcy5mb3JFYWNoKChyZXRyaWV2YWwsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1tpbmRleF0pICYmIHJldHJpZXZhbC5hcmdzQ291bnQgIT09IGFyZ3NbaW5kZXhdLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICAgICAgYFJhZG9uVGVtcGxhdGU6IHJldHJpZXZhbCAjJHtcclxuICAgICAgICAgICAgICBpbmRleCArIDFcclxuICAgICAgICAgICAgfTogbWlzbWF0Y2hpbmcgYXJncyBjb3VudDogJHtcclxuICAgICAgICAgICAgICBhcmdzW2luZGV4XS5sZW5ndGhcclxuICAgICAgICAgICAgfSAhPSAke1xyXG4gICAgICAgICAgICAgIHJldHJpZXZhbC5hcmdzQ291bnRcclxuICAgICAgICAgICAgfSAoWyR7YXJnc1tpbmRleF19KV1gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzb3VyY2VzLnB1c2gocmV0cmlldmFsLmZvbGRBcmdzKGFyZ3NbaW5kZXhdKSlcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUmFkb25SZXF1ZXN0KHtcclxuICAgICAgc291cmNlcyxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHRoaXMuc291cmNlc1JlZHVjZXIsXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiB0aGlzLndpdG5lc3NSZWR1Y2VyLFxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbk1vZGFsIGV4dGVuZHMgUmFkb25UZW1wbGF0ZSB7XHJcblxyXG4gIHByb3RlY3RlZCBfcHJvdmlkZXJzOiBBcnJheTxzdHJpbmc+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcGVjczoge1xyXG4gICAgcHJvdmlkZXJzPzogQXJyYXk8c3RyaW5nPixcclxuICAgIHJldHJpZXZhbDogUmFkb25SZXRyaWV2YWwsXHJcbiAgICBzb3VyY2VzUmVkdWNlcj86IFJhZG9uUmVkdWNlcixcclxuICAgIHdpdG5lc3NSZWR1Y2VyPzogUmFkb25SZWR1Y2VyLFxyXG4gIH0pIHtcclxuICAgIGlmICghc3BlY3MucmV0cmlldmFsLmlzTW9kYWwoKSkge1xyXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvbk1vZGFsOiBubyBtb2RhbCByZXRyaWV2YWwgd2FzIHBhc3NlZC5cIilcclxuICAgIH1cclxuICAgIHN1cGVyKFxyXG4gICAgICB7XHJcbiAgICAgICAgc291cmNlczogW3NwZWNzLnJldHJpZXZhbF0sXHJcbiAgICAgICAgc291cmNlc1JlZHVjZXI6IHNwZWNzPy5zb3VyY2VzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgICAgd2l0bmVzc1JlZHVjZXI6IHNwZWNzPy53aXRuZXNzUmVkdWNlciB8fCByZWR1Y2Vycy5Nb2RlKCksXHJcbiAgICAgIH0sIFxyXG4gICAgICBzcGVjcy5yZXRyaWV2YWw/LnNhbXBsZXNcclxuICAgIClcclxuICAgIGlmIChzcGVjcz8ucHJvdmlkZXJzKSB7XHJcbiAgICAgIHRoaXMuX3Byb3ZpZGVycyA9IHRoaXMuX2NoZWNrUHJvdmlkZXJzKHNwZWNzLnByb3ZpZGVycylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3Byb3ZpZGVycyA9IFtdXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFyZ3NDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FyZ3NDb3VudCAtIDE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHByb3ZpZGVycygpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9wcm92aWRlcnNcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgcHJvdmlkZXJzKHByb3ZpZGVyczogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgdGhpcy5fcHJvdmlkZXJzID0gdGhpcy5fY2hlY2tQcm92aWRlcnMocHJvdmlkZXJzKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJ1aWxkUmFkb25SZXF1ZXN0KGFyZ3M/OiBhbnkgfCBzdHJpbmdbXSk6IFJhZG9uUmVxdWVzdCB7XHJcbiAgICBpZiAodGhpcy5hcmdzQ291bnQgPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFkb25UZW1wbGF0ZSh0aGlzLnByb3ZpZGVycykuYnVpbGRSYWRvblJlcXVlc3QoYXJncylcclxuICAgIH0gZWxzZSBpZiAodGhpcy5wcm92aWRlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uTW9kYWw6IG5vIHByb3ZpZGVycyB3ZXJlIHByZXZpb3VzbHkgc2V0dGxlZC5gKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJlcXVlc3Qoe1xyXG4gICAgICBzb3VyY2VzOiB0aGlzLnNvdXJjZXNbMF0uc3Bhd25SZXRyaWV2YWxzKC4uLnRoaXMucHJvdmlkZXJzKSxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHRoaXMuc291cmNlc1JlZHVjZXIsXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiB0aGlzLndpdG5lc3NSZWR1Y2VyLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBidWlsZFJhZG9uVGVtcGxhdGUocHJvdmlkZXJzPzogQXJyYXk8c3RyaW5nPik6IFJhZG9uVGVtcGxhdGUge1xyXG4gICAgaWYgKCFwcm92aWRlcnMpIHtcclxuICAgICAgcHJvdmlkZXJzID0gdGhpcy5fY2hlY2tQcm92aWRlcnMoWyAuLi50aGlzLl9wcm92aWRlcnMgXSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHByb3ZpZGVycyA9IHRoaXMuX2NoZWNrUHJvdmlkZXJzKFsgLi4ucHJvdmlkZXJzIF0pXHJcbiAgICB9XHJcbiAgICBpZiAoIXByb3ZpZGVycyB8fCBwcm92aWRlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uTW9kYWw6IG5vIHByb3ZpZGVycyB3ZXJlIHNwZWNpZmllZC5gKVxyXG4gICAgfSBcclxuICAgIHJldHVybiBuZXcgUmFkb25UZW1wbGF0ZSh7XHJcbiAgICAgIHNvdXJjZXM6IHRoaXMuc291cmNlc1swXS5zcGF3blJldHJpZXZhbHMoLi4ucHJvdmlkZXJzKSxcclxuICAgICAgc291cmNlc1JlZHVjZXI6IHRoaXMuc291cmNlc1JlZHVjZXIsXHJcbiAgICAgIHdpdG5lc3NSZWR1Y2VyOiB0aGlzLndpdG5lc3NSZWR1Y2VyLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIF9jaGVja1Byb3ZpZGVycyhwcm92aWRlcnM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIHByb3ZpZGVycy5mb3JFYWNoKHByb3ZpZGVyID0+IHtcclxuICAgICAgY29uc3QgW3NjaGVtYSxdID0gcGFyc2VVUkwocHJvdmlkZXIpXHJcbiAgICAgIGlmICghc2NoZW1hLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpICYmICFzY2hlbWEuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XHJcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBSYWRvbk1vZGFsOiBpbnZhbGlkIHByb3ZpZGVyOiAke3Byb3ZpZGVyfWApXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICByZXR1cm4gcHJvdmlkZXJzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25SZXRyaWV2YWwge1xyXG5cclxuICBwdWJsaWMgcmVhZG9ubHkgYXJnc0tleXM/OiBBcnJheTxzdHJpbmc+O1xyXG4gIHB1YmxpYyByZWFkb25seSBhcmdzQ291bnQ6IG51bWJlcjtcclxuICBwdWJsaWMgcmVhZG9ubHkgbWV0aG9kOiByZXRyaWV2YWxzLk1ldGhvZHM7XHJcbiAgcHVibGljIHJlYWRvbmx5IGF1dGhvcml0eT86IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgYm9keT86IHN0cmluZztcclxuICBwdWJsaWMgcmVhZG9ubHkgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgcHVibGljIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IHF1ZXJ5Pzogc3RyaW5nO1xyXG4gIHB1YmxpYyByZWFkb25seSBzY2hlbWE/OiBzdHJpbmc7XHJcbiAgcHVibGljIHJlYWRvbmx5IHNjcmlwdD86IF9SYWRvblNjcmlwdDtcclxuICBwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgcmVhZG9ubHkgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBzcGVjczoge1xyXG4gICAgICBtZXRob2Q6IHJldHJpZXZhbHMuTWV0aG9kcyxcclxuICAgICAgdXJsPzogc3RyaW5nLFxyXG4gICAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgYm9keT86IGFueSxcclxuICAgICAgc2NyaXB0PzogUmFkb25BbnksXHJcbiAgICAgIGFyZ3NLZXlzPzogQXJyYXk8c3RyaW5nPixcclxuICAgIH0sIFxyXG4gICAgc2FtcGxlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxyXG4gICkge1xyXG4gICAgaWYgKHNwZWNzLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLlJORyAmJiAoc3BlY3M/LnVybCB8fCBzcGVjcz8uaGVhZGVycz8uc2l6ZSB8fCBzcGVjcz8uYm9keSkpIHtcclxuICAgICAgdGhyb3cgVHlwZUVycm9yKFwiUmFkb25SZXRyaWV2YWw6IFJORyBhY2NlcHRzIG5vIFVSTHMgb3IgaGVhZGVyc1wiKTtcclxuICAgICAgLy8gfSBlbHNlIGlmICghc3BlY3M/LnVybCAmJiAobWV0aG9kID09IE1ldGhvZHMuSHR0cFBvc3QgfHwgbWV0aG9kID09IE1ldGhvZHMuSHR0cEdldCkpIHtcclxuICAgICAgLy8gICAgIHRocm93IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBVUkwgbXVzdCBiZSBzcGVjaWZpZWRcIik7XHJcbiAgICB9IGVsc2UgaWYgKHNwZWNzPy5ib2R5ICYmIHNwZWNzLm1ldGhvZCA9PSByZXRyaWV2YWxzLk1ldGhvZHMuSHR0cEdldCkge1xyXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJSYWRvblJldHJpZXZhbDogYm9keSBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEhUVFAtR0VUIHF1ZXJpZXNcIilcclxuICAgIH1cclxuICAgIHRoaXMubWV0aG9kID0gc3BlY3MubWV0aG9kXHJcbiAgICBpZiAoc3BlY3M/LnVybCkge1xyXG4gICAgICB0aGlzLnVybCA9IHNwZWNzLnVybFxyXG4gICAgICBpZiAoIWlzV2lsZGNhcmQoc3BlY3MudXJsKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBsZXQgcGFydHMgPSBwYXJzZVVSTChzcGVjcy51cmwpXHJcbiAgICAgICAgICB0aGlzLnNjaGVtYSA9IHBhcnRzWzBdXHJcbiAgICAgICAgICBpZiAocGFydHNbMV0gIT09IFwiXCIpIHRoaXMuYXV0aG9yaXR5ID0gcGFydHNbMV1cclxuICAgICAgICAgIGlmIChwYXJ0c1syXSAhPT0gXCJcIikgdGhpcy5wYXRoID0gcGFydHNbMl1cclxuICAgICAgICAgIGlmIChwYXJ0c1szXSAhPT0gXCJcIikgdGhpcy5xdWVyeSA9IHBhcnRzWzNdXHJcbiAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgc3BlY3MubWV0aG9kID09PSByZXRyaWV2YWxzLk1ldGhvZHMuSHR0cEdldFxyXG4gICAgICAgIHx8IHNwZWNzLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLkh0dHBQb3N0IFxyXG4gICAgICAgIHx8IHNwZWNzLm1ldGhvZCA9PT0gcmV0cmlldmFscy5NZXRob2RzLkh0dHBIZWFkXHJcbiAgICApIHtcclxuICAgICAgdGhpcy51cmwgPSBcIlxcXFwwXFxcXFwiXHJcbiAgICB9XHJcbiAgICBpZiAoc3BlY3M/LmhlYWRlcnMpIHtcclxuICAgICAgaWYgKHR5cGVvZiBzcGVjcy5oZWFkZXJzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNwZWNzLmhlYWRlcnMpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBIVFRQIGhlYWRlcnMgbXVzdCBiZSBvZiB0eXBlIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cIilcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmhlYWRlcnMgPSBzcGVjcz8uaGVhZGVyc1xyXG4gICAgfVxyXG4gICAgdGhpcy5ib2R5ID0gc3BlY3M/LmJvZHlcclxuICAgIGlmIChzcGVjcz8uc2NyaXB0KSB0aGlzLnNjcmlwdCA9IG5ldyBfUmFkb25TY3JpcHQoc3BlY3M/LnNjcmlwdClcclxuICAgIHRoaXMuYXJnc0NvdW50ID0gTWF0aC5tYXgoXHJcbiAgICAgIGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyh0aGlzPy51cmwpLFxyXG4gICAgICBnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcodGhpcz8uYm9keSksXHJcbiAgICAgIC4uLk9iamVjdC5rZXlzKHRoaXM/LmhlYWRlcnMgfHwge30pLm1hcChrZXkgPT4gZ2V0V2lsZGNhcmRzQ291bnRGcm9tU3RyaW5nKGtleSkpID8/IFtdLFxyXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHRoaXM/LmhlYWRlcnMgfHwge30pLm1hcCh2YWx1ZSA9PiBnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcodmFsdWUpKSA/PyBbXSxcclxuICAgICAgdGhpcy5zY3JpcHQ/LmFyZ3NDb3VudCgpIHx8IDAsXHJcbiAgICApXHJcbiAgICBpZiAoc2FtcGxlcyAmJiB0aGlzLmFyZ3NDb3VudCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUmFkb25SZXRyaWV2YWw6IHBhc3NlZCBzYW1wbGVzIHRvIG5vbi1wYXJhbWV0ZXJpemVkIHJldHJpZXZhbC5cIilcclxuICAgIH1cclxuICAgIHRoaXMuc2FtcGxlcyA9IHNhbXBsZXNcclxuICAgIGlmIChzcGVjcz8uYXJnc0tleXMpIHtcclxuICAgICAgaWYgKHRoaXMuYXJnc0NvdW50ID09PSAwKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlJhZG9uUmV0cmlldmFsOiBwYXNzZWQgYXJncyBrZXlzIHRvIG5vbi1wYXJhbWV0ZXJpemVkIHJldHJpZXZhbFwiKVxyXG4gICAgICB9IGVsc2UgaWYgKHNwZWNzLmFyZ3NLZXlzLmxlbmd0aCAhPT0gdGhpcy5hcmdzQ291bnQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvblJldHJpZXZhbDogcGFzc2VkIGludmFsaWQgbnVtYmVyIG9mIGFyZ3Mga2V5czogJHtzcGVjcy5hcmdzS2V5cy5sZW5ndGh9ICE9ICR7dGhpcy5hcmdzQ291bnR9YClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFyZ3NLZXlzID0gc3BlY3MuYXJnc0tleXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc01vZGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLnVybCB8fCB0aGlzLnVybCA9PT0gXCJcXFxcMFxcXFxcIlxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzUGFyYW1ldGVyaXplZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFyZ3NDb3VudCA+IDBcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBuZXcgUmFkb24gUmV0cmlldmFsIGJ5IG9yZGVybHkgcmVwbGFjaW5nIGluZGV4ZWQgd2lsZGNhcmRzIHdpdGggZ2l2ZW4gcGFyYW1ldGVycy5cclxuICAgKiBGYWlscyBpZiBub3QgcGFyYW1ldGVyaXplZCwgb2YgaWYgcGFzc2luZyB0b28gbWFueSBwYXJhbWV0ZXJzLiBcclxuICAgKi9cclxuICBwdWJsaWMgZm9sZEFyZ3MoYXJnczogYW55IHwgc3RyaW5nW10pOiBSYWRvblJldHJpZXZhbCB7XHJcbiAgICBpZiAodGhpcy5hcmdzQ291bnQgPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25SZXRyaWV2YWw6IGNhbm5vdCBmb2xkIHVucGFyYW1ldGVyaXplZCByZXRyaWV2YWxgKVxyXG4gICAgfSBcclxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncykpIHtcclxuICAgICAgaWYgKChhcmdzIGFzIGFueVtdKS5sZW5ndGggPiB0aGlzLmFyZ3NDb3VudCkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmV0cmlldmFsOiB0b28gbWF5IGFyZ3MgcGFzc2VkOiAke2FyZ3MubGVuZ3RofSA+ICR7dGhpcy5hcmdzQ291bnR9YClcclxuICAgICAgfVxyXG4gICAgICBwYXJhbXMucHVzaCguLi5hcmdzIGFzIHN0cmluZ1tdKVxyXG4gICAgXHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAoIXRoaXMuYXJnc0tleXMpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSYWRvblJldHJpZXZhbDogdW5leHBlY3RlZCBhcmdzIG1hcDogdW5kZWZpbmVkIGFyZ3Mga2V5cy5gKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYXJnc0tleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFhcmdzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmFkb25SZXRyaWV2YWw6IG1pc3NpbmcgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiLmApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwYXJhbXMucHVzaChhcmdzW2tleV0gYXMgc3RyaW5nKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyYW1zLnB1c2goYXJncyBhcyBzdHJpbmcpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFJhZG9uUmV0cmlldmFsKHtcclxuICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcclxuICAgICAgdXJsOiByZXBsYWNlV2lsZGNhcmRzKHRoaXMudXJsLCBwYXJhbXMpLFxyXG4gICAgICBib2R5OiByZXBsYWNlV2lsZGNhcmRzKHRoaXMuYm9keSwgcGFyYW1zKSxcclxuICAgICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycyB8fCB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcclxuICAgICAgICByZXBsYWNlV2lsZGNhcmRzKGtleSwgcGFyYW1zKSxcclxuICAgICAgICByZXBsYWNlV2lsZGNhcmRzKHZhbHVlLCBwYXJhbXMpLFxyXG4gICAgICBdKSksXHJcbiAgICAgIHNjcmlwdDogdGhpcy5zY3JpcHQ/LnJlcGxhY2VXaWxkY2FyZHMoLi4ucGFyYW1zKSxcclxuICAgIH0pXHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgb25lIG9yIG1vcmUgY2xvbmVzIG9mIHRoaXMgcmV0cmlldmFsLCBpbiB3aGljaCB0aGUgaW5kZXgtMCB3aWxkY2FyZFxyXG4gICAqIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIHZhbHVlcy4gRmFpbHMgaWYgdGhlIHJldHJpZXZhbCBpcyBub3QgcGFyYW1ldGVyaXplZC5cclxuICAgKi9cclxuICBwdWJsaWMgc3Bhd25SZXRyaWV2YWxzKC4uLnZhbHVlczogc3RyaW5nW10pOiBSYWRvblJldHJpZXZhbFtdIHtcclxuICAgIGNvbnN0IF9zcGF3bmVkOiBSYWRvblJldHJpZXZhbFtdID0gW11cclxuICAgIGlmICh0aGlzLmFyZ3NDb3VudCA9PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJhZG9uUmV0cmlldmFsOiBjYW5ub3Qgc3Bhd24gZnJvbSB1bnBhcmFtZXRlcml6ZWQgcmV0cmlldmFsYCk7XHJcbiAgICB9XHJcbiAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgIF9zcGF3bmVkLnB1c2gobmV3IFJhZG9uUmV0cmlldmFsKHtcclxuICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxyXG4gICAgICAgIHVybDogc3BsaWNlV2lsZGNhcmQodGhpcy51cmwsIDAsIHZhbHVlLCB0aGlzLmFyZ3NDb3VudCksXHJcbiAgICAgICAgYm9keTogc3BsaWNlV2lsZGNhcmQodGhpcy5ib2R5LCAwLCB2YWx1ZSwgdGhpcy5hcmdzQ291bnQpLFxyXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMgfHwge30pLm1hcCgoW2hlYWRlcktleSwgaGVhZGVyVmFsdWVdKSA9PiBbXHJcbiAgICAgICAgICBzcGxpY2VXaWxkY2FyZChoZWFkZXJLZXksIDAsIHZhbHVlLCB0aGlzLmFyZ3NDb3VudCksXHJcbiAgICAgICAgICBzcGxpY2VXaWxkY2FyZChoZWFkZXJWYWx1ZSwgMCwgdmFsdWUsIHRoaXMuYXJnc0NvdW50KSxcclxuICAgICAgICBdKSksXHJcbiAgICAgICAgc2NyaXB0OiB0aGlzLnNjcmlwdD8uc3BsaWNlV2lsZGNhcmQoMCwgdmFsdWUpLFxyXG4gICAgICAgIGFyZ3NLZXlzOiB0aGlzLmFyZ3NLZXlzPy5zbGljZSgxKSxcclxuICAgICAgfSkpXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIF9zcGF3bmVkXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9KU09OKGh1bWFuaXplPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBjb25zdCBraW5kID0gW1wiXCIsIFwiSFRUUC1HRVRcIiwgXCJSTkdcIiwgXCJIVFRQLVBPU1RcIiwgXCJIVFRQLUhFQURcIl1cclxuICAgIGxldCBqc29uOiBhbnkgPSB7XHJcbiAgICAgIGtpbmQ6IGtpbmRbdGhpcy5tZXRob2RdIC8vIGh1bWFuaXplID8gTWV0aG9kc1t0aGlzLm1ldGhvZF0gOiB0aGlzLm1ldGhvZCxcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnVybCkganNvbi51cmwgPSB0aGlzLnVybFxyXG4gICAgaWYgKHRoaXMuaGVhZGVycykge1xyXG4gICAgICBqc29uLmhlYWRlcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYm9keSkganNvbi5ib2R5ID0gdGhpcy5ib2R5XHJcbiAgICBqc29uLnNjcmlwdCA9IGh1bWFuaXplID8gdGhpcy5zY3JpcHQ/LnRvU3RyaW5nKCkgOiBBcnJheS5mcm9tKGZyb21IZXhTdHJpbmcodGhpcy5zY3JpcHQ/LnRvQnl0ZWNvZGUoKSB8fCAnMHg4MCcpKVxyXG4gICAgcmV0dXJuIGpzb25cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b1Byb3RvYnVmKCk6IGFueSB7XHJcbiAgICBsZXQgcHJvdG9idWY6IGFueSA9IHtcclxuICAgICAga2luZDogdGhpcy5tZXRob2QsXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy51cmwpIHByb3RvYnVmLnVybCA9IHRoaXMudXJsXHJcbiAgICBpZiAodGhpcy5oZWFkZXJzKSB7XHJcbiAgICAgIHByb3RvYnVmLmhlYWRlcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMpLm1hcCgoW2hlYWRlcktleSwgaGVhZGVyVmFsdWVdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxlZnQ6IGhlYWRlcktleSxcclxuICAgICAgICAgIHJpZ2h0OiBoZWFkZXJWYWx1ZSxcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ib2R5KSB7XHJcbiAgICAgIGNvbnN0IHV0ZjhBcnJheSA9IHRvVXRmOEFycmF5KHRoaXMuYm9keSlcclxuICAgICAgcHJvdG9idWYuYm9keSA9IHV0ZjhBcnJheVxyXG4gICAgfVxyXG4gICAgcHJvdG9idWYuc2NyaXB0ID0gT2JqZWN0LnZhbHVlcyhVaW50OEFycmF5LmZyb20oY2JvckVuY29kZSh0aGlzLnNjcmlwdD8uZW5jb2RlKCkgfHwgW10pKSlcclxuICAgIHJldHVybiBwcm90b2J1ZlxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wc0NvdW50KCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY291bnRPcHModGhpcy5zY3JpcHQ/LmVuY29kZSgpIHx8IFtdKVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jb3VudE9wcyhpdGVtczogYW55W10pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCA+IDAgPyBpdGVtcy5tYXAoaXRlbSA9PiBBcnJheS5pc0FycmF5KGl0ZW0pID8gdGhpcy5fY291bnRPcHMoaXRlbSkgOiAxKS5yZWR1Y2UoKHN1bSwgYSkgPT4gc3VtICsgYSkgOiAwXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgbmFtZXNwYWNlIGZpbHRlcnMge1xyXG4gIGV4cG9ydCBjb25zdCBPcGNvZGVzID0gRmlsdGVyc1xyXG4gIGV4cG9ydCBjb25zdCBDbGFzcyA9IFJhZG9uRmlsdGVyXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIE1vZGUoKSB7IHJldHVybiBuZXcgUmFkb25GaWx0ZXIoRmlsdGVycy5Nb2RlKTsgfVxyXG4gIGV4cG9ydCBmdW5jdGlvbiBTdGRldihzdGRldjogbnVtYmVyKSB7IHJldHVybiBuZXcgUmFkb25GaWx0ZXIoRmlsdGVycy5TdGFuZGFyZERldmlhdGlvbiwgc3RkZXYpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBuYW1lc3BhY2UgcmVkdWNlcnMge1xyXG4gIGV4cG9ydCBjb25zdCBPcGNvZGVzID0gUmVkdWNlcnNcclxuICBleHBvcnQgY29uc3QgQ2xhc3MgPSBSYWRvblJlZHVjZXJcclxuICBleHBvcnQgZnVuY3Rpb24gTW9kZSguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLk1vZGUsIGZpbHRlcnMpOyB9XHJcbiAgZXhwb3J0IGZ1bmN0aW9uIE1lYW4oLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5NZWFuQXZlcmFnZSwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gTWVkaWFuKC4uLmZpbHRlcnM6IFJhZG9uRmlsdGVyW10pIHsgcmV0dXJuIG5ldyBSYWRvblJlZHVjZXIoUmVkdWNlcnMuTWVkaWFuQXZlcmFnZSwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gU3RkZXYoLi4uZmlsdGVyczogUmFkb25GaWx0ZXJbXSkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5TdGFuZGFyZERldmlhdGlvbiwgZmlsdGVycyk7IH1cclxuICBleHBvcnQgZnVuY3Rpb24gQ29uY2F0SGFzaCguLi5maWx0ZXJzOiBSYWRvbkZpbHRlcltdKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLkNvbmNhdGVuYXRlQW5kSGFzaCwgZmlsdGVycyk7IH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIFByaWNlQWdncmVnYXRlKCkgeyByZXR1cm4gbmV3IFJhZG9uUmVkdWNlcihSZWR1Y2Vycy5NZWFuQXZlcmFnZSwgW2ZpbHRlcnMuU3RkZXYoMS40KV0pOyB9XHJcbiAgZXhwb3J0IGZ1bmN0aW9uIFByaWNlVGFsbHkoKSB7IHJldHVybiBuZXcgUmFkb25SZWR1Y2VyKFJlZHVjZXJzLk1lYW5BdmVyYWdlLCBbZmlsdGVycy5TdGRldigyLjUpXSk7IH1cclxufVxyXG5cclxuaW1wb3J0ICogYXMgY2NkciBmcm9tICcuL2NjZHInXHJcbmV4cG9ydCBuYW1lc3BhY2UgcmV0cmlldmFscyB7XHJcblxyXG4gIGV4cG9ydCBjb25zdCBycGMgPSBjY2RyO1xyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZnJvbVJhZG9uQXNzZXRzKGFzc2V0czogT2JqZWN0KTogUmVjb3JkPHN0cmluZywgUmFkb25SZXRyaWV2YWw+IHtcclxuICAgIHJldHVybiBuZXcgUHJveHkoYXNzZXRzLCBwcm94eUhhbmRsZXIoUmFkb25SZXRyaWV2YWwpKVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gTWV0aG9kcyB7XHJcbiAgICBOb25lID0gMHgwLFxyXG4gICAgSHR0cEdldCA9IDB4MDEsXHJcbiAgICBIdHRwSGVhZCA9IDB4MDQsXHJcbiAgICBIdHRwUG9zdCA9IDB4MDMsXHJcbiAgICBSTkcgPSAweDAyLFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIFdpdG5ldCByYW5kb21uZXNzIGRhdGEgc291cmNlIG9iamVjdC5cclxuICAgKiBAcGFyYW0gc2NyaXB0IChPcHRpb25hbCkgUmFkb24gU2NyaXB0IHRvIGFwcGx5IHRvIHRoZSByYW5kb20gc2VlZCBwcm9wb3NlZCBieSBldmVyeSBzaW5nbGUgd2l0bmVzcywgXHJcbiAgICogYmVmb3JlIGFnZ3JlZ2F0aW9uLlxyXG4gICoqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBSTkcoc2NyaXB0PzogUmFkb25BbnkpIHtcclxuICAgIGNvbnN0IHJldHJpZXZhbCA9IG5ldyBSYWRvblJldHJpZXZhbCh7IG1ldGhvZDogTWV0aG9kcy5STkcsIHNjcmlwdCB9KTtcclxuICAgIGlmIChyZXRyaWV2YWw/LnNjcmlwdCAmJiByZXRyaWV2YWw/LnNjcmlwdD8uaW5wdXRUeXBlPy5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIlJhZG9uQnl0ZXNcIikge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUk5HIHNjcmlwdHMgcmVxdWlyZSBbUmFkb25CeXRlc10gYXMgaW5wdXQgdHlwZVwiKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldHJpZXZhbFxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL0dFVCBkYXRhIHJldHJpZXZhbCBvYmplY3QuXHJcbiAgICogQHBhcmFtIHNwZWNzIFJhZG9uIFJldHJpZXZhbCBzcGVjcy5cclxuICAqKi9cclxuICBleHBvcnQgZnVuY3Rpb24gSHR0cEdldChzcGVjczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgVVJMLlxyXG4gICAgICovXHJcbiAgICB1cmw/OiBzdHJpbmcsXHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb25TY3JpcHQgZm9yIHByb2Nlc3NpbmcgcmV0dXJuZWQgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHNjcmlwdD86IFJhZG9uQW55LFxyXG4gICAgLyoqXHJcbiAgICAgKiBOYW1lcyBvZiBpbmRleGVkIHBhcmFtZXRlcnMgKG9wdGlvbmFsLCBpZiBhbnkpLlxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XHJcbiAgfSkge1xyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgbWV0aG9kOiBNZXRob2RzLkh0dHBHZXQsIFxyXG4gICAgICAgIHVybDogc3BlY3M/LnVybCxcclxuICAgICAgICBoZWFkZXJzOiBzcGVjcz8uaGVhZGVycyxcclxuICAgICAgICBzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcbiAgICAgICAgYXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuICAgICAgfSxcclxuICAgICAgc3BlY3M/LnNhbXBsZXMsXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL0hFQUQgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEh0dHBIZWFkKHNwZWNzOiB7XHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBVUkxcclxuICAgICAqL1xyXG4gICAgdXJsPzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgaGVhZGVyc1xyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XHJcbiAgfSkge1xyXG4gICAgcmV0dXJuIG5ldyBSYWRvblJldHJpZXZhbCh7XHJcbiAgICAgICAgbWV0aG9kOiBNZXRob2RzLkh0dHBIZWFkLFxyXG4gICAgICAgIHVybDogc3BlY3M/LnVybCxcclxuICAgICAgICBoZWFkZXJzOiBzcGVjcz8uaGVhZGVycyxcclxuICAgICAgICBzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcbiAgICAgICAgYXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuICAgICAgfSxcclxuICAgICAgc3BlY3M/LnNhbXBsZXMsXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBIVFRQL1BPU1QgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEh0dHBQb3N0KHNwZWNzOiB7XHJcbiAgICAvKipcclxuICAgICAqIEhUVFAgcmVxdWVzdCBVUkxcclxuICAgICAqL1xyXG4gICAgdXJsPzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgYm9keVxyXG4gICAgICovXHJcbiAgICBib2R5Pzogc3RyaW5nLFxyXG4gICAgLyoqXHJcbiAgICAgKiBIVFRQIHJlcXVlc3QgaGVhZGVyc1xyXG4gICAgICovXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IE1ldGhvZHMuSHR0cFBvc3QsXHJcbiAgICAgICAgdXJsOiBzcGVjcz8udXJsLFxyXG4gICAgICAgIGhlYWRlcnM6IHNwZWNzPy5oZWFkZXJzLFxyXG4gICAgICAgIGJvZHk6IHNwZWNzPy5ib2R5LFxyXG4gICAgICAgIHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuICAgICAgICBhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG4gICAgICB9LFxyXG4gICAgICBzcGVjcz8uc2FtcGxlcyxcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIEdyYXBoUUwtcXVlcnkgZGF0YSBzb3VyY2Ugb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEdyYXBoUUxRdWVyeShzcGVjczoge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHcmFwaFFMIFVSTCBlbmRwb2ludFxyXG4gICAgICovXHJcbiAgICB1cmw/OiBzdHJpbmcsXHJcbiAgICAvKipcclxuICAgICAqIEdyYXBoUUwgcXVlcnlcclxuICAgICAqL1xyXG4gICAgcXVlcnk6IHN0cmluZyxcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IE1ldGhvZHMuSHR0cFBvc3QsXHJcbiAgICAgICAgdXJsOiBzcGVjcy51cmwsXHJcbiAgICAgICAgYm9keTogYHtcXFwicXVlcnlcXFwiOlxcXCIke2dyYXBoUWxDb21wcmVzcyhzcGVjcy5xdWVyeSkucmVwbGFjZUFsbCgnXCInLCAnXFxcXFwiJyl9XFxcIn1gLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIiB9LFxyXG4gICAgICAgIHNjcmlwdDogc3BlY3M/LnNjcmlwdCxcclxuICAgICAgICBhcmdzS2V5czogc3BlY3M/LmFyZ3NLZXlzLFxyXG4gICAgICB9LFxyXG4gICAgICBzcGVjcz8uc2FtcGxlc1xyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgSlNPTi1SUEMgZGF0YSByZXRyaWV2YWwgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBzcGVjcyBSYWRvbiBSZXRyaWV2YWwgc3BlY3MuXHJcbiAgKiovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIEpzb25SUEMoc3BlY3MgOiB7XHJcbiAgICAvKipcclxuICAgICAqIEpTT04tUlBDIG1ldGhvZCBhbmQgcGFyYW1ldGVycy5cclxuICAgICAqL1xyXG4gICAgcnBjOiB7IG1ldGhvZDogc3RyaW5nLCBwYXJhbXM/OiBhbnkgfSxcclxuICAgIC8qKlxyXG4gICAgICogUmFkb24gc2NyaXB0IGZvciBwcm9jZXNzaW5nIHJldHVybmVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzY3JpcHQ/OiBSYWRvbkFueSxcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgaW5kZXhlZCBwYXJhbWV0ZXJzIChvcHRpb25hbCwgaWYgYW55KVxyXG4gICAgICovXHJcbiAgICBhcmdzS2V5cz86IHN0cmluZ1tdLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgb2YgcHJlLXNldCBwYXJhbWV0ZXJzIChvbiBwYXJhbWV0ZXJpemVkIHJldHJpZXZhbHMsIG9ubHkpLlxyXG4gICAgICovXHJcbiAgICBzYW1wbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUmFkb25SZXRyaWV2YWwoXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IHJldHJpZXZhbHMuTWV0aG9kcy5IdHRwUG9zdCxcclxuICAgICAgICB1cmw6IFwiXFxcXDBcXFxcXCIsXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxyXG4gICAgICAgICAgICBtZXRob2Q6IHNwZWNzLnJwYy5tZXRob2QsXHJcbiAgICAgICAgICAgIHBhcmFtczogc3BlY3MucnBjPy5wYXJhbXMsXHJcbiAgICAgICAgICAgIGlkOiAxLFxyXG4gICAgICAgIH0pLnJlcGxhY2VBbGwoJ1xcXFxcXFxcJywgJ1xcXFwnKSxcclxuICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04XCIgfSxcclxuICAgICAgICBzY3JpcHQ6IHNwZWNzPy5zY3JpcHQsXHJcbiAgICAgICAgYXJnc0tleXM6IHNwZWNzPy5hcmdzS2V5cyxcclxuICAgICAgfSxcclxuICAgICAgc3BlY3M/LnNhbXBsZXNcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBuYW1lc3BhY2UgdHlwZXMge1xyXG4gIGV4cG9ydCBjb25zdCBSYWRvbkFycmF5ID0gX1JhZG9uQXJyYXk7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uQm9vbGVhbiA9IF9SYWRvbkJvb2xlYW47XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uQnl0ZXMgPSBfUmFkb25CeXRlcztcclxuICBleHBvcnQgY29uc3QgUmFkb25GbG9hdCA9IF9SYWRvbkZsb2F0O1xyXG4gIGV4cG9ydCBjb25zdCBSYWRvbkludGVnZXIgPSBfUmFkb25JbnRlZ2VyO1xyXG4gIGV4cG9ydCBjb25zdCBSYWRvbk1hcCA9IF9SYWRvbk1hcDtcclxuICBleHBvcnQgY29uc3QgUmFkb25TY3JpcHQgPSBfUmFkb25TY3JpcHQ7XHJcbiAgZXhwb3J0IGNvbnN0IFJhZG9uU3RyaW5nID0gX1JhZG9uU3RyaW5nO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm94eUhhbmRsZXI8VD4odDogeyBuZXcoc3BlY3M6IGFueSk6IFQ7IH0pIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgbGV0IGZvdW5kID0gdGFyZ2V0W3Byb3BdID8/IGZpbmRLZXlJbk9iamVjdCh0YXJnZXQsIHByb3ApXHJcbiAgICAgICAgICAgIC8vIGlmICghZm91bmQpIHtcclxuICAgICAgICAgICAgLy8gICAgIHRocm93IEV2YWxFcnJvcihgWycke3Byb3B9J10gd2FzIG5vdCBmb3VuZCBpbiBkaWN0aW9uYXJ5YClcclxuICAgICAgICAgICAgLy8gfSBlbHNlIFxyXG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgIShmb3VuZCBpbnN0YW5jZW9mIHQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYFsnJHtwcm9wfSddIHdhcyBmb3VuZCB3aXRoIHR5cGUgJHtmb3VuZD8uY29uc3RydWN0b3I/Lm5hbWV9IGluc3RlYWQgb2YgJHt0Lm5hbWV9IWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZvdW5kXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kS2V5SW5PYmplY3QoZGljdDogYW55LCB0YWc6IHN0cmluZykge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGljdCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZGljdFtrZXldID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSB0YWcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkaWN0W2tleV1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZDogYW55ID0gZmluZEtleUluT2JqZWN0KGRpY3Rba2V5XSwgdGFnKVxyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIl19
|