@witnet/solidity 3.0.4 → 3.0.5
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 +2 -2
- package/build/contracts/Bech32.json +1 -1
- package/build/contracts/Clonable.json +1 -1
- package/build/contracts/Context.json +1 -1
- package/build/contracts/Create3.json +1 -1
- package/build/contracts/ERC165.json +1 -1
- package/build/contracts/Escrowable.json +1 -1
- package/build/contracts/IChainlinkAggregatorV3.json +1 -1
- package/build/contracts/IERC165.json +1 -1
- package/build/contracts/IERC20.json +1 -1
- package/build/contracts/IERC2362.json +1 -1
- package/build/contracts/IPythChainlinkAggregatorV3.json +1 -1
- package/build/contracts/IWitAppliance.json +1 -1
- package/build/contracts/IWitOracle.json +1 -1
- package/build/contracts/IWitOracleAppliance.json +1 -1
- package/build/contracts/IWitOracleConsumer.json +1 -1
- package/build/contracts/IWitOracleConsumerLegacy.json +1 -1
- package/build/contracts/IWitOracleLegacy.json +1 -1
- package/build/contracts/IWitOracleQueriable.json +1 -1
- package/build/contracts/IWitOracleQueriableConsumer.json +1 -1
- package/build/contracts/IWitOracleQueriableEvents.json +1 -1
- package/build/contracts/IWitOracleQueriableExperimental.json +1 -1
- package/build/contracts/IWitOracleQueriableTrustableReporter.json +1 -1
- package/build/contracts/IWitOracleQueriableTrustlessReporter.json +1 -1
- package/build/contracts/IWitOracleRadonRegistry.json +1 -1
- package/build/contracts/IWitOracleRadonRegistryEvents.json +1 -1
- package/build/contracts/IWitOracleRadonRegistryLegacy.json +1 -1
- package/build/contracts/IWitOracleRadonRequestFactory.json +1 -1
- package/build/contracts/IWitOracleRadonRequestModal.json +1 -1
- package/build/contracts/IWitOracleRadonRequestTemplate.json +1 -1
- package/build/contracts/IWitOracleRequest.json +1 -1
- package/build/contracts/IWitOracleRequestFactory.json +1 -1
- package/build/contracts/IWitOracleRequestFactoryEvents.json +1 -1
- package/build/contracts/IWitOracleRequestTemplate.json +1 -1
- package/build/contracts/IWitOracleTrustableAdmin.json +1 -1
- package/build/contracts/IWitOracleTrustless.json +1 -1
- package/build/contracts/IWitPriceFeeds.json +1 -1
- package/build/contracts/IWitPriceFeedsAdmin.json +1 -1
- package/build/contracts/IWitPriceFeedsConsumer.json +1 -1
- package/build/contracts/IWitPriceFeedsEvents.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacy.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacyAdmin.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacySolver.json +1 -1
- package/build/contracts/IWitPriceFeedsLegacySolverFactory.json +1 -1
- package/build/contracts/IWitPriceFeedsTypes.json +1 -1
- package/build/contracts/IWitPyth.json +1 -1
- package/build/contracts/IWitPythChainlinkAggregator.json +1 -1
- package/build/contracts/IWitPythErrors.json +1 -1
- package/build/contracts/IWitPythEvents.json +1 -1
- package/build/contracts/IWitPythReporter.json +1 -1
- package/build/contracts/IWitRandomness.json +1 -1
- package/build/contracts/IWitRandomnessAdmin.json +1 -1
- package/build/contracts/IWitRandomnessAdminV2.json +1 -1
- package/build/contracts/IWitRandomnessConsumer.json +1 -1
- package/build/contracts/IWitRandomnessEvents.json +1 -1
- package/build/contracts/IWitRandomnessLegacy.json +1 -1
- package/build/contracts/IWitRandomnessTypes.json +1 -1
- package/build/contracts/Initializable.json +1 -1
- package/build/contracts/OVM_GasPriceOracle.json +1 -1
- package/build/contracts/Ownable.json +1 -1
- package/build/contracts/Ownable2Step.json +1 -1
- package/build/contracts/Payable.json +1 -1
- package/build/contracts/Proxiable.json +1 -1
- package/build/contracts/ReentrancyGuard.json +1 -1
- package/build/contracts/Secp256k1.json +1 -1
- package/build/contracts/Slices.json +1 -1
- package/build/contracts/TestBech32.json +1 -1
- package/build/contracts/TestSecp256k1.json +1 -1
- package/build/contracts/Upgradeable.json +1 -1
- package/build/contracts/UsingWitOracle.json +1 -1
- package/build/contracts/UsingWitPriceFeeds.json +1 -1
- package/build/contracts/UsingWitRandomness.json +1 -1
- package/build/contracts/WitOracle.json +2 -13
- package/build/contracts/WitOracleBasePushOnly.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyTrustable.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyTrustless.json +1 -1
- package/build/contracts/WitOracleBasePushOnlyUpgradable.json +1 -1
- package/build/contracts/WitOracleBaseQueriable.json +1 -1
- package/build/contracts/WitOracleBaseQueriableTrustable.json +1 -1
- package/build/contracts/WitOracleBaseQueriableTrustless.json +1 -1
- package/build/contracts/WitOracleBaseQueriableUpgradable.json +1 -1
- package/build/contracts/WitOracleDataLib.json +2 -254
- package/build/contracts/WitOraclePushOnly.json +1 -1
- package/build/contracts/WitOracleRadonEncodingLib.json +2 -13
- package/build/contracts/WitOracleRadonRegistry.json +2 -13
- package/build/contracts/WitOracleRadonRegistryBase.json +1 -1
- package/build/contracts/WitOracleRadonRegistryBaseUpgradable.json +1 -1
- package/build/contracts/WitOracleRadonRegistryData.json +1 -1
- package/build/contracts/WitOracleRadonRegistryDefaultV21.json +1 -1
- package/build/contracts/WitOracleRadonRegistryUpgradableDefault.json +2 -17
- package/build/contracts/WitOracleRadonRegistryUpgradableNoSha256.json +1 -1
- package/build/contracts/WitOracleRadonRegistryUpgradableZkSync.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactory.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryBase.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryBaseUpgradable.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryModals.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryModalsDefault.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryTemplates.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryTemplatesDefault.json +2 -13
- package/build/contracts/WitOracleRadonRequestFactoryUpgradableConfluxCore.json +1 -1
- package/build/contracts/WitOracleRadonRequestFactoryUpgradableDefault.json +2 -13
- package/build/contracts/WitOracleResultStatusLib.json +2 -14
- package/build/contracts/WitOracleTrustableDefault.json +2 -259
- package/build/contracts/WitOracleTrustableExperimental.json +1 -1
- package/build/contracts/WitOracleTrustableObscuro.json +1 -1
- package/build/contracts/WitOracleTrustableOvm2.json +1 -1
- package/build/contracts/WitOracleTrustablePushOnly.json +1 -1
- package/build/contracts/WitOracleTrustableReef.json +1 -1
- package/build/contracts/WitOracleTrustableZkSync.json +1 -1
- package/build/contracts/WitOracleTrustlessDataLib.json +1 -1
- package/build/contracts/WitOracleTrustlessDefaultV22.json +1 -1
- package/build/contracts/WitOracleTrustlessUpgradableDefault.json +1 -1
- package/build/contracts/WitPriceFeeds.json +2 -13
- package/build/contracts/WitPriceFeedsDataLib.json +2 -14
- package/build/contracts/WitPriceFeedsLegacy.json +2 -8
- package/build/contracts/WitPriceFeedsLegacyDataLib.json +2 -84
- package/build/contracts/WitPriceFeedsLegacyUpgradable.json +1 -1
- package/build/contracts/WitPriceFeedsLegacyUpgradableBypass.json +2 -80
- package/build/contracts/WitPriceFeedsSolverBase.json +1 -1
- package/build/contracts/WitPriceFeedsV3.json +1 -1
- package/build/contracts/WitPriceFeedsV3Upgradable.json +2 -17
- package/build/contracts/WitPythChainlinkAggregator.json +1 -1
- package/build/contracts/WitRandomness.json +2 -13
- package/build/contracts/WitRandomnessLegacy.json +1 -1
- package/build/contracts/WitRandomnessV3.json +2 -13
- package/build/contracts/WitRngConsumer.json +1 -1
- package/build/contracts/Witnet.json +1 -1
- package/build/contracts/WitnetBuffer.json +1 -1
- package/build/contracts/WitnetCBOR.json +1 -1
- package/build/contracts/WitnetDeployer.json +2 -13
- package/build/contracts/WitnetDeployerConfluxCore.json +1 -1
- package/build/contracts/WitnetDeployerDeferred.json +1 -1
- package/build/contracts/WitnetDeployerMeter.json +1 -1
- package/build/contracts/WitnetProxy.json +2 -9
- package/build/contracts/WitnetUpgradableBase.json +1 -1
- package/{migrations → dist/migrations}/addresses.json +1 -25
- package/{migrations → dist/migrations}/constructorArgs.json +1 -6
- package/dist/migrations/settings/artifacts.d.ts +95 -0
- package/dist/migrations/settings/artifacts.d.ts.map +1 -0
- package/dist/migrations/settings/artifacts.js +80 -0
- package/dist/migrations/settings/networks.d.ts +593 -0
- package/dist/migrations/settings/networks.d.ts.map +1 -0
- package/dist/migrations/settings/networks.js +593 -0
- package/dist/src/bin/helpers.cjs +350 -0
- package/dist/src/bin/helpers.d.cts +76 -0
- package/dist/src/bin/helpers.d.cts.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +33 -0
- package/dist/src/lib/types.d.ts +99 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +18 -0
- package/dist/src/lib/utils.d.ts +22 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +267 -0
- package/dist/src/lib/wrappers/ContractWrapper.d.ts +47 -0
- package/dist/src/lib/wrappers/ContractWrapper.d.ts.map +1 -0
- package/dist/src/lib/wrappers/ContractWrapper.js +81 -0
- package/dist/src/lib/wrappers/WitAppliance.d.ts +7 -0
- package/dist/src/lib/wrappers/WitAppliance.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitAppliance.js +17 -0
- package/dist/src/lib/wrappers/WitArtifact.d.ts +6 -0
- package/dist/src/lib/wrappers/WitArtifact.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitArtifact.js +16 -0
- package/dist/src/lib/wrappers/WitOracle.d.ts +105 -0
- package/dist/src/lib/wrappers/WitOracle.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracle.js +217 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.d.ts +16 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleConsumer.js +30 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts +102 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleRadonRegistry.js +140 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts +81 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.js +257 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.d.ts +91 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitPriceFeeds.js +356 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts +14 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitPriceFeedsLegacy.js +64 -0
- package/dist/src/lib/wrappers/WitRandomness.d.ts +55 -0
- package/dist/src/lib/wrappers/WitRandomness.d.ts.map +1 -0
- package/dist/src/lib/wrappers/WitRandomness.js +165 -0
- package/dist/src/lib/wrappers.d.ts +8 -0
- package/dist/src/lib/wrappers.d.ts.map +1 -0
- package/dist/src/lib/wrappers.js +8 -0
- package/package.json +78 -54
- package/scripts/clean.cjs +21 -0
- package/scripts/eth-create2.cjs +38 -0
- package/scripts/eth-create3.cjs +45 -0
- package/scripts/postinstall.cjs +9 -0
- package/scripts/prepare.cjs +27 -0
- package/scripts/vanity2gen.cjs +121 -0
- package/scripts/vanity3gen.cjs +84 -0
- package/scripts/verify-proxies.cjs +50 -0
- package/scripts/verify-truffle.cjs +69 -0
- package/scripts/verify.js +95 -0
- package/scripts/wof-acls.js +17 -0
- package/src/bin/bots/bridge.cjs +0 -0
- package/src/bin/bots/randomizer.cjs +290 -0
- package/src/bin/bots/reporter.cjs +0 -0
- package/src/bin/cli/accounts.cjs +47 -0
- package/src/bin/cli/assets.cjs +466 -0
- package/src/bin/cli/framework.cjs +100 -0
- package/src/bin/cli/gateway.cjs +26 -0
- package/src/bin/cli/networks.cjs +63 -0
- package/src/bin/cli/priceFeeds.cjs +170 -0
- package/src/bin/cli/queries.cjs +217 -0
- package/src/bin/cli/randomness.cjs +367 -0
- package/src/bin/cli/reports.cjs +272 -0
- package/src/bin/cli/wizard.cjs +352 -0
- package/src/bin/helpers.cjs +388 -0
- package/src/bin/index.cjs +407 -0
- package/settings/artifacts.js +0 -71
- package/settings/index.js +0 -49
- package/settings/networks.js +0 -593
- package/settings/solidity.js +0 -11
- package/settings/specs.js +0 -102
- package/src/index.js +0 -96
- package/src/utils.js +0 -305
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { utils, Witnet } from "@witnet/sdk";
|
|
2
|
+
import { abiEncodeRadonAsset } from "../utils.js";
|
|
3
|
+
import { WitArtifact } from "./WitArtifact.js";
|
|
4
|
+
/**
|
|
5
|
+
* Wrapper class for the Wit/Oracle Radon Registry core contract as deployed in some supported EVM network.
|
|
6
|
+
* It allows formal verification of Radon Requests and Witnet-compliant data sources into such network,
|
|
7
|
+
* as to be securely referred on both Wit/Oracle queries pulled from within smart contracts,
|
|
8
|
+
* or Wit/Oracle query results pushed into smart contracts from offchain workflows.
|
|
9
|
+
*/
|
|
10
|
+
export class WitOracleRadonRegistry extends WitArtifact {
|
|
11
|
+
constructor(signer, network) {
|
|
12
|
+
super(signer, network, "WitOracleRadonRegistry");
|
|
13
|
+
}
|
|
14
|
+
/// ===========================================================================================================
|
|
15
|
+
/// --- IWitOracleRadonRegistry -------------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Determines the unique hash that would identify the given Radon Retrieval, if it was
|
|
18
|
+
* formally verified into the connected EVM network.
|
|
19
|
+
* @param retrieval Instance of a Radon Retrieval object.
|
|
20
|
+
*/
|
|
21
|
+
async determineRadonRetrievalHash(retrieval) {
|
|
22
|
+
return this.contract
|
|
23
|
+
.getFunction("verifyRadonRetrieval(uint8,string,string,string[2][],bytes)")
|
|
24
|
+
.staticCall(...abiEncodeRadonAsset(retrieval))
|
|
25
|
+
.then((hash) => {
|
|
26
|
+
return hash.slice(2);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns information related to some previously verified Radon Request, on the connected EVM network.
|
|
31
|
+
* @param radHash The RAD hash that uniquely identifies the Radon Request.
|
|
32
|
+
*/
|
|
33
|
+
async lookupRadonRequest(radHash) {
|
|
34
|
+
return this.contract
|
|
35
|
+
.getFunction("lookupRadonRequestBytecode(bytes32)")
|
|
36
|
+
.staticCall(`0x${radHash}`)
|
|
37
|
+
.then((bytecode) => Witnet.Radon.RadonRequest.fromBytecode(bytecode));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns the bytecode of some previously verified Radon Request, on the connected EVM network.
|
|
41
|
+
* @param radHash The RAD hash that uniquely identifies the Radon Request.
|
|
42
|
+
*/
|
|
43
|
+
async lookupRadonRequestBytecode(radHash) {
|
|
44
|
+
return this.contract
|
|
45
|
+
.getFunction("lookupRadonRequestBytecode(bytes32)")
|
|
46
|
+
.staticCall(`${radHash.startsWith("0x") ? radHash : `0x${radHash}`}`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns information about some previously verified Radon Retrieval on the connected EVM network.
|
|
50
|
+
* This information includes retrieval the method, URL, body, headers and the Radon script in charge
|
|
51
|
+
* to transform data before delivery, on the connected EVM network.
|
|
52
|
+
* @param radHash The RAD hash that uniquely identifies the Radon Request.
|
|
53
|
+
*/
|
|
54
|
+
async lookupRadonRetrieval(hash) {
|
|
55
|
+
return this.contract
|
|
56
|
+
.getFunction("lookupRadonRetrieval(bytes32)")
|
|
57
|
+
.staticCall(`0x${hash}`)
|
|
58
|
+
.then((result) => {
|
|
59
|
+
return new Witnet.Radon.RadonRetrieval({
|
|
60
|
+
method: result[1],
|
|
61
|
+
url: result[3],
|
|
62
|
+
body: result[4],
|
|
63
|
+
headers: Object.fromEntries(result[5]),
|
|
64
|
+
script: utils.parseRadonScript(result[6]),
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Formally verify the given Radon Request object into the connected EVM network.
|
|
70
|
+
* It also verifies all the Radon Retrieval scripts (i.e. data source) the Request
|
|
71
|
+
* relies on, if not yet done before.
|
|
72
|
+
*
|
|
73
|
+
* Verifying Radon assets modifies the EVM storage and therefore requires
|
|
74
|
+
* spending gas in proportion to the number and complexity of the data sources,
|
|
75
|
+
* and whether these had been previously verified before or not.
|
|
76
|
+
*
|
|
77
|
+
* If the given Radon Request happened to be already verified, no gas would be actually consumed.
|
|
78
|
+
*
|
|
79
|
+
* @param request Instance of a Radon Request object.
|
|
80
|
+
* @param options Async EVM transaction handlers.
|
|
81
|
+
* @returns The RAD hash of the Radon Request, as verified on the connected EVM network.
|
|
82
|
+
*/
|
|
83
|
+
async verifyRadonRequest(request, options) {
|
|
84
|
+
const radHash = request.radHash;
|
|
85
|
+
await this.lookupRadonRequest(radHash).catch(async () => {
|
|
86
|
+
const hashes = [];
|
|
87
|
+
for (const index in request.sources) {
|
|
88
|
+
const retrieval = request.sources[index];
|
|
89
|
+
hashes.push(`0x${await this.verifyRadonRetrieval(retrieval, options)}`);
|
|
90
|
+
}
|
|
91
|
+
const aggregate = abiEncodeRadonAsset(request.sourcesReducer);
|
|
92
|
+
const tally = abiEncodeRadonAsset(request.witnessReducer);
|
|
93
|
+
if (options?.onVerifyRadonRequest) {
|
|
94
|
+
options.onVerifyRadonRequest(radHash);
|
|
95
|
+
}
|
|
96
|
+
await this.contract
|
|
97
|
+
.getFunction("verifyRadonRequest(bytes32[],(uint8,(uint8,bytes)[]),(uint8,(uint8,bytes)[]))")
|
|
98
|
+
.send(hashes, aggregate, tally)
|
|
99
|
+
.then(async (tx) => {
|
|
100
|
+
const receipt = await tx.wait(options?.confirmations || 1);
|
|
101
|
+
if (options?.onVerifyRadonRequestReceipt) {
|
|
102
|
+
options.onVerifyRadonRequestReceipt(receipt);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
return radHash;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Formally verify the given Radon Retrieval script (i.e. data source), into the connected EVM network.
|
|
110
|
+
*
|
|
111
|
+
* Verifying Radon assets modifies the EVM storage and therefore requires
|
|
112
|
+
* spending gas in proportion to the size of the data source parameters (e.g. URL, body, headers, or Radon script).
|
|
113
|
+
*
|
|
114
|
+
* If the given Radon Retrieval object happened to be already verified, no EVM gas would be actually consumed.
|
|
115
|
+
*
|
|
116
|
+
* @param request Instance of a Radon Retrieval object.
|
|
117
|
+
* @param options Async EVM transaction handlers.
|
|
118
|
+
* @returns The unique hash of the Radon Retrieval object, as verified on the connected EVM network.
|
|
119
|
+
*/
|
|
120
|
+
async verifyRadonRetrieval(retrieval, options) {
|
|
121
|
+
return this.determineRadonRetrievalHash(retrieval).then(async (hash) => {
|
|
122
|
+
await this.lookupRadonRetrieval(hash).catch(async () => {
|
|
123
|
+
if (options?.onVerifyRadonRetrieval) {
|
|
124
|
+
options.onVerifyRadonRetrieval(hash);
|
|
125
|
+
}
|
|
126
|
+
await this.contract
|
|
127
|
+
.getFunction("verifyRadonRetrieval(uint8,string,string,string[2][],bytes)")
|
|
128
|
+
.send(...abiEncodeRadonAsset(retrieval))
|
|
129
|
+
.then(async (tx) => {
|
|
130
|
+
const receipt = await tx.wait(options?.confirmations || 1);
|
|
131
|
+
if (options?.onVerifyRadonRetrievalReceipt) {
|
|
132
|
+
options.onVerifyRadonRetrievalReceipt(receipt);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
return hash;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2l0T3JhY2xlUmFkb25SZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd3JhcHBlcnMvV2l0T3JhY2xlUmFkb25SZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFdBQVc7SUFDdEQsWUFBWSxNQUFxQixFQUFFLE9BQWU7UUFDakQsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsK0dBQStHO0lBQy9HLCtHQUErRztJQUUvRzs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLDJCQUEyQixDQUN2QyxTQUFzQztRQUV0QyxPQUFPLElBQUksQ0FBQyxRQUFRO2FBQ2xCLFdBQVcsQ0FDWCw2REFBNkQsQ0FDN0Q7YUFDQSxVQUFVLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM3QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNyQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQzlCLE9BQWU7UUFFZixPQUFPLElBQUksQ0FBQyxRQUFRO2FBQ2xCLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQzthQUNsRCxVQUFVLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQzthQUMxQixJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FB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QTtJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FDaEMsU0FBc0MsRUFDdEMsT0FnQkM7UUFFRCxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3RFLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDdEQsSUFBSSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUNyQyxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLFFBQVE7cUJBQ2pCLFdBQVcsQ0FDWCw2REFBNkQsQ0FDN0Q7cUJBQ0EsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ3ZDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0JBQ2xCLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFBO29CQUMxRCxJQUFJLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxDQUFDO3dCQUM1QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQy9DLENBQUM7Z0JBQ0YsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU8sSUFBSSxDQUFBO1FBQ1osQ0FBQyxDQUFDLENBQUE7SUFDSCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlscywgV2l0bmV0IH0gZnJvbSBcIkB3aXRuZXQvc2RrXCJcbmltcG9ydCB0eXBlIHsgQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQsIEpzb25ScGNTaWduZXIsIFJlc3VsdCB9IGZyb20gXCJldGhlcnNcIlxuaW1wb3J0IHsgYWJpRW5jb2RlUmFkb25Bc3NldCB9IGZyb20gXCIuLi91dGlscy5qc1wiXG5pbXBvcnQgeyBXaXRBcnRpZmFjdCB9IGZyb20gXCIuL1dpdEFydGlmYWN0LmpzXCJcblxuLyoqXG4gKiBXcmFwcGVyIGNsYXNzIGZvciB0aGUgV2l0L09yYWNsZSBSYWRvbiBSZWdpc3RyeSBjb3JlIGNvbnRyYWN0IGFzIGRlcGxveWVkIGluIHNvbWUgc3VwcG9ydGVkIEVWTSBuZXR3b3JrLlxuICogSXQgYWxsb3dzIGZvcm1hbCB2ZXJpZmljYXRpb24gb2YgUmFkb24gUmVxdWVzdHMgYW5kIFdpdG5ldC1jb21wbGlhbnQgZGF0YSBzb3VyY2VzIGludG8gc3VjaCBuZXR3b3JrLFxuICogYXMgdG8gYmUgc2VjdXJlbHkgcmVmZXJyZWQgb24gYm90aCBXaXQvT3JhY2xlIHF1ZXJpZXMgcHVsbGVkIGZyb20gd2l0aGluIHNtYXJ0IGNvbnRyYWN0cyxcbiAqIG9yIFdpdC9PcmFjbGUgcXVlcnkgcmVzdWx0cyBwdXNoZWQgaW50byBzbWFydCBjb250cmFjdHMgZnJvbSBvZmZjaGFpbiB3b3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5IGV4dGVuZHMgV2l0QXJ0aWZhY3Qge1xuXHRjb25zdHJ1Y3RvcihzaWduZXI6IEpzb25ScGNTaWduZXIsIG5ldHdvcms6IHN0cmluZykge1xuXHRcdHN1cGVyKHNpZ25lciwgbmV0d29yaywgXCJXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5XCIpXG5cdH1cblxuXHQvLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8vIC0tLSBJV2l0T3JhY2xlUmFkb25SZWdpc3RyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgdGhlIHVuaXF1ZSBoYXNoIHRoYXQgd291bGQgaWRlbnRpZnkgdGhlIGdpdmVuIFJhZG9uIFJldHJpZXZhbCwgaWYgaXQgd2FzXG5cdCAqIGZvcm1hbGx5IHZlcmlmaWVkIGludG8gdGhlIGNvbm5lY3RlZCBFVk0gbmV0d29yay5cblx0ICogQHBhcmFtIHJldHJpZXZhbCBJbnN0YW5jZSBvZiBhIFJhZG9uIFJldHJpZXZhbCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgZGV0ZXJtaW5lUmFkb25SZXRyaWV2YWxIYXNoKFxuXHRcdHJldHJpZXZhbDogV2l0bmV0LlJhZG9uLlJhZG9uUmV0cmlldmFsLFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcdFwidmVyaWZ5UmFkb25SZXRyaWV2YWwodWludDgsc3RyaW5nLHN0cmluZyxzdHJpbmdbMl1bXSxieXRlcylcIixcblx0XHRcdClcblx0XHRcdC5zdGF0aWNDYWxsKC4uLmFiaUVuY29kZVJhZG9uQXNzZXQocmV0cmlldmFsKSlcblx0XHRcdC50aGVuKChoYXNoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBoYXNoLnNsaWNlKDIpXG5cdFx0XHR9KVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzb21lIHByZXZpb3VzbHkgdmVyaWZpZWQgUmFkb24gUmVxdWVzdCwgb24gdGhlIGNvbm5lY3RlZCBFVk0gbmV0d29yay5cblx0ICogQHBhcmFtIHJhZEhhc2ggVGhlIFJBRCBoYXNoIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgUmFkb24gUmVxdWVzdC5cblx0ICovXG5cdHB1YmxpYyBhc3luYyBsb29rdXBSYWRvblJlcXVlc3QoXG5cdFx0cmFkSGFzaDogc3RyaW5nLFxuXHQpOiBQcm9taXNlPFdpdG5ldC5SYWRvbi5SYWRvblJlcXVlc3Q+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwibG9va3VwUmFkb25SZXF1ZXN0Qnl0ZWNvZGUoYnl0ZXMzMilcIilcblx0XHRcdC5zdGF0aWNDYWxsKGAweCR7cmFkSGFzaH1gKVxuXHRcdFx0LnRoZW4oKGJ5dGVjb2RlKSA9PiBXaXRuZXQuUmFkb24uUmFkb25SZXF1ZXN0LmZyb21CeXRlY29kZShieXRlY29kZSkpXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgYnl0ZWNvZGUgb2Ygc29tZSBwcmV2aW91c2x5IHZlcmlmaWVkIFJhZG9uIFJlcXVlc3QsIG9uIHRoZSBjb25uZWN0ZWQgRVZNIG5ldHdvcmsuXG5cdCAqIEBwYXJhbSByYWRIYXNoIFRoZSBSQUQgaGFzaCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIFJhZG9uIFJlcXVlc3QuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgbG9va3VwUmFkb25SZXF1ZXN0Qnl0ZWNvZGUoXG5cdFx0cmFkSGFzaDogc3RyaW5nLFxuXHQpOiBQcm9taXNlPFdpdG5ldC5IZXhTdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwibG9va3VwUmFkb25SZXF1ZXN0Qnl0ZWNvZGUoYnl0ZXMzMilcIilcblx0XHRcdC5zdGF0aWNDYWxsKGAke3JhZEhhc2guc3RhcnRzV2l0aChcIjB4XCIpID8gcmFkSGFzaCA6IGAweCR7cmFkSGFzaH1gfWApXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBzb21lIHByZXZpb3VzbHkgdmVyaWZpZWQgUmFkb24gUmV0cmlldmFsIG9uIHRoZSBjb25uZWN0ZWQgRVZNIG5ldHdvcmsuXG5cdCAqIFRoaXMgaW5mb3JtYXRpb24gaW5jbHVkZXMgcmV0cmlldmFsIHRoZSBtZXRob2QsIFVSTCwgYm9keSwgaGVhZGVycyBhbmQgdGhlIFJhZG9uIHNjcmlwdCBpbiBjaGFyZ2Vcblx0ICogdG8gdHJhbnNmb3JtIGRhdGEgYmVmb3JlIGRlbGl2ZXJ5LCBvbiB0aGUgY29ubmVjdGVkIEVWTSBuZXR3b3JrLlxuXHQgKiBAcGFyYW0gcmFkSGFzaCBUaGUgUkFEIGhhc2ggdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBSYWRvbiBSZXF1ZXN0LlxuXHQgKi9cblx0cHVibGljIGFzeW5jIGxvb2t1cFJhZG9uUmV0cmlldmFsKFxuXHRcdGhhc2g6IHN0cmluZyxcblx0KTogUHJvbWlzZTxXaXRuZXQuUmFkb24uUmFkb25SZXRyaWV2YWw+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwibG9va3VwUmFkb25SZXRyaWV2YWwoYnl0ZXMzMilcIilcblx0XHRcdC5zdGF0aWNDYWxsKGAweCR7aGFzaH1gKVxuXHRcdFx0LnRoZW4oKHJlc3VsdDogUmVzdWx0KSA9PiB7XG5cdFx0XHRcdHJldHVybiBuZXcgV2l0bmV0LlJhZG9uLlJhZG9uUmV0cmlldmFsKHtcblx0XHRcdFx0XHRtZXRob2Q6IHJlc3VsdFsxXSxcblx0XHRcdFx0XHR1cmw6IHJlc3VsdFszXSxcblx0XHRcdFx0XHRib2R5OiByZXN1bHRbNF0sXG5cdFx0XHRcdFx0aGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKHJlc3VsdFs1XSksXG5cdFx0XHRcdFx0c2NyaXB0OiB1dGlscy5wYXJzZVJhZG9uU2NyaXB0KHJlc3VsdFs2XSksXG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHR9XG5cblx0LyoqXG5cdCAqIEZvcm1hbGx5IHZlcmlmeSB0aGUgZ2l2ZW4gUmFkb24gUmVxdWVzdCBvYmplY3QgaW50byB0aGUgY29ubmVjdGVkIEVWTSBuZXR3b3JrLlxuXHQgKiBJdCBhbHNvIHZlcmlmaWVzIGFsbCB0aGUgUmFkb24gUmV0cmlldmFsIHNjcmlwdHMgKGkuZS4gZGF0YSBzb3VyY2UpIHRoZSBSZXF1ZXN0XG5cdCAqIHJlbGllcyBvbiwgaWYgbm90IHlldCBkb25lIGJlZm9yZS5cblx0ICpcblx0ICogVmVyaWZ5aW5nIFJhZG9uIGFzc2V0cyBtb2RpZmllcyB0aGUgRVZNIHN0b3JhZ2UgYW5kIHRoZXJlZm9yZSByZXF1aXJlc1xuXHQgKiBzcGVuZGluZyBnYXMgaW4gcHJvcG9ydGlvbiB0byB0aGUgbnVtYmVyIGFuZCBjb21wbGV4aXR5IG9mIHRoZSBkYXRhIHNvdXJjZXMsXG5cdCAqIGFuZCB3aGV0aGVyIHRoZXNlIGhhZCBiZWVuIHByZXZpb3VzbHkgdmVyaWZpZWQgYmVmb3JlIG9yIG5vdC5cblx0ICpcblx0ICogSWYgdGhlIGdpdmVuIFJhZG9uIFJlcXVlc3QgaGFwcGVuZWQgdG8gYmUgYWxyZWFkeSB2ZXJpZmllZCwgbm8gZ2FzIHdvdWxkIGJlIGFjdHVhbGx5IGNvbnN1bWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVxdWVzdCBJbnN0YW5jZSBvZiBhIFJhZG9uIFJlcXVlc3Qgb2JqZWN0LlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBBc3luYyBFVk0gdHJhbnNhY3Rpb24gaGFuZGxlcnMuXG5cdCAqIEByZXR1cm5zIFRoZSBSQUQgaGFzaCBvZiB0aGUgUmFkb24gUmVxdWVzdCwgYXMgdmVyaWZpZWQgb24gdGhlIGNvbm5lY3RlZCBFVk0gbmV0d29yay5cblx0ICovXG5cdHB1YmxpYyBhc3luYyB2ZXJpZnlSYWRvblJlcXVlc3QoXG5cdFx0cmVxdWVzdDogV2l0bmV0LlJhZG9uLlJhZG9uUmVxdWVzdCxcblx0XHRvcHRpb25zPzoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBOdW1iZXIgb2YgYmxvY2sgY29uZmlybWF0aW9ucyB0byB3YWl0IGZvciBhZnRlciB2ZXJpZnlpbmcgdHJhbnNhY3Rpb24gZ2V0cyBtaW5lZCAoZGVmYXVsdHMgdG8gMSkuXG5cdFx0XHQgKi9cblx0XHRcdGNvbmZpcm1hdGlvbnM/OiBudW1iZXJcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2FsbGJhY2sgaGFuZGxlciBjYWxsZWQganVzdCBpbiBjYXNlIGEgYHZlcmlmeVJhZG9uUmVxdWVzdGAgdHJhbnNhY3Rpb24gaXMgdWx0aW1hdGVseSByZXF1aXJlZC5cblx0XHRcdCAqL1xuXHRcdFx0b25WZXJpZnlSYWRvblJlcXVlc3Q6IChyYWRIYXNoOiBzdHJpbmcpID0+IGFueVxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsYmFjayBoYW5kbGVyIGNhbGxlZCBvbmNlIHRoZSBgdmVyaWZ5UmFkb25SZXF1ZXN0YCB0cmFuc2FjdGlvbiBnZXRzIGNvbmZpcm1lZC5cblx0XHRcdCAqIEBwYXJhbSByZWNlaXB0IFRoZSBgdmVyaWZ5UmFkb25SZXF1ZXN0YCB0cmFuc2FjdGlvbiByZWNlaXB0LlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQ/OiAoXG5cdFx0XHRcdHJlY2VpcHQ6IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCxcblx0XHRcdCkgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIGZvciBldmVyeSBpbnZvbHZlZCBgdmVyaWZ5UmFkb25SZXRyaWV2YWxgIHRyYW5zYWN0aW9uLlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsPzogKGhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIGFmdGVyIGV2ZXJ5IGludm9sdmVkIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gZ2V0cyBjb25maXJtZWQuXG5cdFx0XHQgKiBAcGFyYW0gcmVjZWlwdCBUaGUgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiByZWNlaXB0LlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsUmVjZWlwdD86IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IHJhZEhhc2ggPSByZXF1ZXN0LnJhZEhhc2hcblx0XHRhd2FpdCB0aGlzLmxvb2t1cFJhZG9uUmVxdWVzdChyYWRIYXNoKS5jYXRjaChhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBoYXNoZXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXHRcdFx0Zm9yIChjb25zdCBpbmRleCBpbiByZXF1ZXN0LnNvdXJjZXMpIHtcblx0XHRcdFx0Y29uc3QgcmV0cmlldmFsID0gcmVxdWVzdC5zb3VyY2VzW2luZGV4XVxuXHRcdFx0XHRoYXNoZXMucHVzaChgMHgke2F3YWl0IHRoaXMudmVyaWZ5UmFkb25SZXRyaWV2YWwocmV0cmlldmFsLCBvcHRpb25zKX1gKVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYWdncmVnYXRlID0gYWJpRW5jb2RlUmFkb25Bc3NldChyZXF1ZXN0LnNvdXJjZXNSZWR1Y2VyKVxuXHRcdFx0Y29uc3QgdGFsbHkgPSBhYmlFbmNvZGVSYWRvbkFzc2V0KHJlcXVlc3Qud2l0bmVzc1JlZHVjZXIpXG5cdFx0XHRpZiAob3B0aW9ucz8ub25WZXJpZnlSYWRvblJlcXVlc3QpIHtcblx0XHRcdFx0b3B0aW9ucy5vblZlcmlmeVJhZG9uUmVxdWVzdChyYWRIYXNoKVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5jb250cmFjdFxuXHRcdFx0XHQuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcdFx0XCJ2ZXJpZnlSYWRvblJlcXVlc3QoYnl0ZXMzMltdLCh1aW50OCwodWludDgsYnl0ZXMpW10pLCh1aW50OCwodWludDgsYnl0ZXMpW10pKVwiLFxuXHRcdFx0XHQpXG5cdFx0XHRcdC5zZW5kKGhhc2hlcywgYWdncmVnYXRlLCB0YWxseSlcblx0XHRcdFx0LnRoZW4oYXN5bmMgKHR4KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcmVjZWlwdCA9IGF3YWl0IHR4LndhaXQob3B0aW9ucz8uY29uZmlybWF0aW9ucyB8fCAxKVxuXHRcdFx0XHRcdGlmIChvcHRpb25zPy5vblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvbnMub25WZXJpZnlSYWRvblJlcXVlc3RSZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdH0pXG5cdFx0cmV0dXJuIHJhZEhhc2hcblx0fVxuXG5cdC8qKlxuXHQgKiBGb3JtYWxseSB2ZXJpZnkgdGhlIGdpdmVuIFJhZG9uIFJldHJpZXZhbCBzY3JpcHQgKGkuZS4gZGF0YSBzb3VyY2UpLCBpbnRvIHRoZSBjb25uZWN0ZWQgRVZNIG5ldHdvcmsuXG5cdCAqXG5cdCAqIFZlcmlmeWluZyBSYWRvbiBhc3NldHMgbW9kaWZpZXMgdGhlIEVWTSBzdG9yYWdlIGFuZCB0aGVyZWZvcmUgcmVxdWlyZXNcblx0ICogc3BlbmRpbmcgZ2FzIGluIHByb3BvcnRpb24gdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgc291cmNlIHBhcmFtZXRlcnMgKGUuZy4gVVJMLCBib2R5LCBoZWFkZXJzLCBvciBSYWRvbiBzY3JpcHQpLlxuXHQgKlxuXHQgKiBJZiB0aGUgZ2l2ZW4gUmFkb24gUmV0cmlldmFsIG9iamVjdCBoYXBwZW5lZCB0byBiZSBhbHJlYWR5IHZlcmlmaWVkLCBubyBFVk0gZ2FzIHdvdWxkIGJlIGFjdHVhbGx5IGNvbnN1bWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVxdWVzdCBJbnN0YW5jZSBvZiBhIFJhZG9uIFJldHJpZXZhbCBvYmplY3QuXG5cdCAqIEBwYXJhbSBvcHRpb25zIEFzeW5jIEVWTSB0cmFuc2FjdGlvbiBoYW5kbGVycy5cblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBoYXNoIG9mIHRoZSBSYWRvbiBSZXRyaWV2YWwgb2JqZWN0LCBhcyB2ZXJpZmllZCBvbiB0aGUgY29ubmVjdGVkIEVWTSBuZXR3b3JrLlxuXHQgKi9cblx0cHVibGljIGFzeW5jIHZlcmlmeVJhZG9uUmV0cmlldmFsKFxuXHRcdHJldHJpZXZhbDogV2l0bmV0LlJhZG9uLlJhZG9uUmV0cmlldmFsLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIE51bWJlciBvZiBibG9jayBjb25maXJtYXRpb25zIHRvIHdhaXQgZm9yIGFmdGVyIHZlcmlmeWluZyB0cmFuc2FjdGlvbiBnZXRzIG1pbmVkIChkZWZhdWx0cyB0byAxKS5cblx0XHRcdCAqL1xuXHRcdFx0Y29uZmlybWF0aW9ucz86IG51bWJlclxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsYmFjayBoYW5kbGVyIGNhbGxlZCBqdXN0IGluIGNhc2UgYSBgdmVyaWZ5UmFkb25SZXF1ZXN0YCB0cmFuc2FjdGlvbiBpcyB1bHRpbWF0ZWx5IHJlcXVpcmVkLlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsPzogKGhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIG9uY2UgdGhlIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gZ2V0cyBjb25maXJtZWQuXG5cdFx0XHQgKiBAcGFyYW0gcmVjZWlwdCBUaGUgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiByZWNlaXB0LlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsUmVjZWlwdD86IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLmRldGVybWluZVJhZG9uUmV0cmlldmFsSGFzaChyZXRyaWV2YWwpLnRoZW4oYXN5bmMgKGhhc2gpID0+IHtcblx0XHRcdGF3YWl0IHRoaXMubG9va3VwUmFkb25SZXRyaWV2YWwoaGFzaCkuY2F0Y2goYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25WZXJpZnlSYWRvblJldHJpZXZhbCkge1xuXHRcdFx0XHRcdG9wdGlvbnMub25WZXJpZnlSYWRvblJldHJpZXZhbChoYXNoKVxuXHRcdFx0XHR9XG5cdFx0XHRcdGF3YWl0IHRoaXMuY29udHJhY3Rcblx0XHRcdFx0XHQuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcdFx0XHRcInZlcmlmeVJhZG9uUmV0cmlldmFsKHVpbnQ4LHN0cmluZyxzdHJpbmcsc3RyaW5nWzJdW10sYnl0ZXMpXCIsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5zZW5kKC4uLmFiaUVuY29kZVJhZG9uQXNzZXQocmV0cmlldmFsKSlcblx0XHRcdFx0XHQudGhlbihhc3luYyAodHgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlY2VpcHQgPSBhd2FpdCB0eC53YWl0KG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMSlcblx0XHRcdFx0XHRcdGlmIChvcHRpb25zPy5vblZlcmlmeVJhZG9uUmV0cmlldmFsUmVjZWlwdCkge1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uVmVyaWZ5UmFkb25SZXRyaWV2YWxSZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdH0pXG5cdFx0XHRyZXR1cm4gaGFzaFxuXHRcdH0pXG5cdH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Witnet } from "@witnet/sdk";
|
|
2
|
+
import type { ContractTransactionReceipt } from "ethers";
|
|
3
|
+
import type { WitOracleResultDataTypes } from "../types.js";
|
|
4
|
+
import { WitAppliance } from "./WitAppliance.js";
|
|
5
|
+
import type { WitOracle } from "./WitOracle.js";
|
|
6
|
+
import type { WitOracleRadonRegistry } from "./WitOracleRadonRegistry.js";
|
|
7
|
+
export declare class WitOracleRadonRequestFactory extends WitAppliance {
|
|
8
|
+
readonly registry: WitOracleRadonRegistry;
|
|
9
|
+
protected constructor(witOracle: WitOracle, registry: WitOracleRadonRegistry, at?: string);
|
|
10
|
+
static deployed(witOracle: WitOracle, registry: WitOracleRadonRegistry): Promise<WitOracleRadonRequestFactory>;
|
|
11
|
+
deployRadonRequestTemplate(template: Witnet.Radon.RadonTemplate, options?: {
|
|
12
|
+
confirmations?: number;
|
|
13
|
+
onDeployRadonRequestTemplate?: (address: string) => any;
|
|
14
|
+
onDeployRadonRequestTemplateReceipt?: (receipt: ContractTransactionReceipt | null) => any;
|
|
15
|
+
/**
|
|
16
|
+
* Callback handler called just in case a `verifyRadonRetrieval` transaction is ultimately required.
|
|
17
|
+
*/
|
|
18
|
+
onVerifyRadonRetrieval?: (hash: string) => any;
|
|
19
|
+
/**
|
|
20
|
+
* Callback handler called once the `verifyRadonRetrieval` transaction gets confirmed.
|
|
21
|
+
* @param receipt The `verifyRadonRetrieval` transaction receipt.
|
|
22
|
+
* @param hash The unique hash of the Radon Retrieval, as verified on the connected network.
|
|
23
|
+
*/
|
|
24
|
+
onVerifyRadonRetrievalReceipt?: (receipt: ContractTransactionReceipt | null) => any;
|
|
25
|
+
}): Promise<WitOracleRadonRequestTemplate>;
|
|
26
|
+
deployRadonRequestModal(modal: Witnet.Radon.RadonModal, options?: {
|
|
27
|
+
confirmations?: number;
|
|
28
|
+
onDeployRadonRequestModal?: (address: string) => any;
|
|
29
|
+
onDeployRadonRequestModalReceipt?: (receipt: ContractTransactionReceipt | null) => any;
|
|
30
|
+
/**
|
|
31
|
+
* Callback handler called just in case a `verifyRadonRetrieval` transaction is ultimately required.
|
|
32
|
+
*/
|
|
33
|
+
onVerifyRadonRetrieval?: (hash: string) => any;
|
|
34
|
+
/**
|
|
35
|
+
* Callback handler called once the `verifyRadonRetrieval` transaction gets confirmed.
|
|
36
|
+
* @param receipt The `verifyRadonRetrieval` transaction receipt.
|
|
37
|
+
* @param hash The unique hash of the Radon Retrieval, as verified on the connected network.
|
|
38
|
+
*/
|
|
39
|
+
onVerifyRadonRetrievalReceipt?: (receipt: ContractTransactionReceipt | null) => any;
|
|
40
|
+
}): Promise<WitOracleRadonRequestModal>;
|
|
41
|
+
verifyRadonRequest(request: Witnet.Radon.RadonRequest, _options?: {
|
|
42
|
+
confirmations?: number;
|
|
43
|
+
onVerifyRadonRequest?: (address: string) => any;
|
|
44
|
+
onVerifyRadonRequestReceipt?: (receipt: ContractTransactionReceipt | null) => any;
|
|
45
|
+
/**
|
|
46
|
+
* Callback handler called just in case a `verifyRadonRetrieval` transaction is ultimately required.
|
|
47
|
+
*/
|
|
48
|
+
onVerifyRadonRetrieval?: (hash: string) => any;
|
|
49
|
+
/**
|
|
50
|
+
* Callback handler called once the `verifyRadonRetrieval` transaction gets confirmed.
|
|
51
|
+
* @param receipt The `verifyRadonRetrieval` transaction receipt.
|
|
52
|
+
* @param hash The unique hash of the Radon Retrieval, as verified on the connected network.
|
|
53
|
+
*/
|
|
54
|
+
onVerifyRadonRetrievalReceipt?: (receipt: ContractTransactionReceipt | null) => any;
|
|
55
|
+
}): Promise<Witnet.Hash>;
|
|
56
|
+
}
|
|
57
|
+
export declare class WitOracleRadonRequestModal extends WitAppliance {
|
|
58
|
+
protected constructor(witOracle: WitOracle, at: string);
|
|
59
|
+
static at(witOracle: WitOracle, target: string): Promise<WitOracleRadonRequestModal>;
|
|
60
|
+
getDataResultType(): Promise<WitOracleResultDataTypes>;
|
|
61
|
+
getDataSourcesArgsCount(): Promise<number>;
|
|
62
|
+
getRadonModalRetrieval(): Promise<Witnet.Radon.RadonRetrieval>;
|
|
63
|
+
verifyRadonRequest(dataProviders: string[], commonRetrievalArgs?: string[], options?: {
|
|
64
|
+
confirmations?: number;
|
|
65
|
+
onVerifyRadonRequest: (radHash: string) => any;
|
|
66
|
+
onVerifyRadonRequestReceipt: (receipt: ContractTransactionReceipt | null) => any;
|
|
67
|
+
}): Promise<Witnet.Hash>;
|
|
68
|
+
}
|
|
69
|
+
export declare class WitOracleRadonRequestTemplate extends WitAppliance {
|
|
70
|
+
protected constructor(witOracle: WitOracle, at: string);
|
|
71
|
+
static at(witOracle: WitOracle, target: string): Promise<WitOracleRadonRequestTemplate>;
|
|
72
|
+
getDataResultType(): Promise<WitOracleResultDataTypes>;
|
|
73
|
+
getDataSources(): Promise<Array<Witnet.Radon.RadonRetrieval>>;
|
|
74
|
+
getDataSourcesArgsCount(): Promise<Array<number>>;
|
|
75
|
+
verifyRadonRequest(args: string | string[] | Array<string[]>, options?: {
|
|
76
|
+
confirmations?: number;
|
|
77
|
+
onVerifyRadonRequest: (radHash: string) => any;
|
|
78
|
+
onVerifyRadonRequestReceipt: (receipt: ContractTransactionReceipt | null) => any;
|
|
79
|
+
}): Promise<Witnet.HexString>;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=WitOracleRadonRequestFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WitOracleRadonRequestFactory.d.ts","sourceRoot":"","sources":["../../../../src/lib/wrappers/WitOracleRadonRequestFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { Witnet } from "@witnet/sdk";
|
|
2
|
+
import { abiEncodeRadonAsset, parseRadonScript } from "../utils.js";
|
|
3
|
+
import { WitAppliance } from "./WitAppliance.js";
|
|
4
|
+
export class WitOracleRadonRequestFactory extends WitAppliance {
|
|
5
|
+
registry;
|
|
6
|
+
constructor(witOracle, registry, at) {
|
|
7
|
+
super(witOracle, "WitOracleRadonRequestFactory", at);
|
|
8
|
+
this.registry = registry;
|
|
9
|
+
}
|
|
10
|
+
static async deployed(witOracle, registry) {
|
|
11
|
+
const deployer = new WitOracleRadonRequestFactory(witOracle, registry);
|
|
12
|
+
const witOracleRegistryAddress = await witOracle.contract.registry.staticCall();
|
|
13
|
+
if (registry.address !== witOracleRegistryAddress) {
|
|
14
|
+
throw new Error(`${WitOracleRadonRequestFactory.constructor.name} at ${deployer.address}: uncompliant WitOracleRadonRegistry at ${registry.address})`);
|
|
15
|
+
}
|
|
16
|
+
return deployer;
|
|
17
|
+
}
|
|
18
|
+
async deployRadonRequestTemplate(template, options) {
|
|
19
|
+
const hashes = [];
|
|
20
|
+
for (const index in template.sources) {
|
|
21
|
+
const retrieval = template.sources[index];
|
|
22
|
+
const hash = `0x${await this.registry.determineRadonRetrievalHash(retrieval)}`;
|
|
23
|
+
await this.registry.verifyRadonRetrieval(retrieval, options);
|
|
24
|
+
hashes.push(hash);
|
|
25
|
+
}
|
|
26
|
+
const aggregator = abiEncodeRadonAsset(template.sourcesReducer);
|
|
27
|
+
const tally = abiEncodeRadonAsset(template.witnessReducer);
|
|
28
|
+
const target = await this.contract
|
|
29
|
+
.getFunction("buildRadonRequestTemplate(bytes32[],(uint8,(uint8,bytes)[]),(uint8,(uint8,bytes)[]))")
|
|
30
|
+
.staticCall(hashes, aggregator, tally);
|
|
31
|
+
if (options?.onDeployRadonRequestTemplate)
|
|
32
|
+
options.onDeployRadonRequestTemplate(target);
|
|
33
|
+
await this.contract
|
|
34
|
+
.getFunction("buildRadonRequestTemplate(bytes32[],(uint8,(uint8,bytes)[]),(uint8,(uint8,bytes)[]))")
|
|
35
|
+
.send(hashes, aggregator, tally)
|
|
36
|
+
.then(async (tx) => {
|
|
37
|
+
const receipt = await tx.wait(options?.confirmations || 1);
|
|
38
|
+
if (options?.onDeployRadonRequestTemplateReceipt) {
|
|
39
|
+
options.onDeployRadonRequestTemplateReceipt(receipt);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
return await WitOracleRadonRequestTemplate.at(this.witOracle, target);
|
|
43
|
+
}
|
|
44
|
+
async deployRadonRequestModal(modal, options) {
|
|
45
|
+
const retrieval = [
|
|
46
|
+
modal.sources[0].method,
|
|
47
|
+
modal.sources[0].body || "",
|
|
48
|
+
modal.sources[0]?.headers ? Object.entries(modal.sources[0].headers) : [],
|
|
49
|
+
modal.sources[0].script?.toBytecode() || "0x",
|
|
50
|
+
];
|
|
51
|
+
const tally = abiEncodeRadonAsset(modal.witnessReducer);
|
|
52
|
+
const target = await this.contract.buildRadonRequestModal //getFunction("buildRadonRequestModal((uint8,string,string[2][],bytes),(uint8,(uint8,bytes)[]))")
|
|
53
|
+
.staticCall(retrieval, tally);
|
|
54
|
+
if (options?.onDeployRadonRequestModal)
|
|
55
|
+
options.onDeployRadonRequestModal(target);
|
|
56
|
+
await this.contract.buildRadonRequestModal
|
|
57
|
+
// .getFunction("buildRadonRequestModal((uint8,string,string[2][],bytes),(uint8,(uint8,bytes)[]))")
|
|
58
|
+
.send(retrieval, tally)
|
|
59
|
+
.then(async (tx) => {
|
|
60
|
+
const receipt = await tx.wait(options?.confirmations || 1);
|
|
61
|
+
if (options?.onDeployRadonRequestModalReceipt) {
|
|
62
|
+
options.onDeployRadonRequestModalReceipt(receipt);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return await WitOracleRadonRequestModal.at(this.witOracle, target);
|
|
66
|
+
}
|
|
67
|
+
async verifyRadonRequest(request, _options) {
|
|
68
|
+
// TODO:
|
|
69
|
+
//
|
|
70
|
+
return request.radHash;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class WitOracleRadonRequestModal extends WitAppliance {
|
|
74
|
+
constructor(witOracle, at) {
|
|
75
|
+
super(witOracle, "WitOracleRadonRequestModal", at);
|
|
76
|
+
}
|
|
77
|
+
static async at(witOracle, target) {
|
|
78
|
+
const template = new WitOracleRadonRequestModal(witOracle, target);
|
|
79
|
+
const templateWitOracleAddr = await template.contract.witOracle.staticCall();
|
|
80
|
+
if (templateWitOracleAddr !== witOracle.address) {
|
|
81
|
+
throw new Error(`${WitOracleRadonRequestModal.constructor.name} at ${target}: mismatching Wit/Oracle address (${templateWitOracleAddr})`);
|
|
82
|
+
}
|
|
83
|
+
return template;
|
|
84
|
+
}
|
|
85
|
+
async getDataResultType() {
|
|
86
|
+
return this.contract
|
|
87
|
+
.getFunction("getDataResultType()")
|
|
88
|
+
.staticCall()
|
|
89
|
+
.then((result) => {
|
|
90
|
+
switch (Number(result)) {
|
|
91
|
+
case 1:
|
|
92
|
+
return "array";
|
|
93
|
+
case 2:
|
|
94
|
+
return "boolean";
|
|
95
|
+
case 3:
|
|
96
|
+
return "bytes";
|
|
97
|
+
case 4:
|
|
98
|
+
return "integer";
|
|
99
|
+
case 5:
|
|
100
|
+
return "float";
|
|
101
|
+
case 6:
|
|
102
|
+
return "map";
|
|
103
|
+
case 7:
|
|
104
|
+
return "string";
|
|
105
|
+
default:
|
|
106
|
+
return "any";
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async getDataSourcesArgsCount() {
|
|
111
|
+
return this.contract
|
|
112
|
+
.getFunction("getDataSourcesArgsCount()")
|
|
113
|
+
.staticCall()
|
|
114
|
+
.then((argsCount) => Number(argsCount));
|
|
115
|
+
}
|
|
116
|
+
async getRadonModalRetrieval() {
|
|
117
|
+
return this.contract
|
|
118
|
+
.getFunction("getRadonModalRetrieval()")
|
|
119
|
+
.staticCall()
|
|
120
|
+
.then((result) => {
|
|
121
|
+
return new Witnet.Radon.RadonRetrieval({
|
|
122
|
+
method: result[1],
|
|
123
|
+
url: result[3],
|
|
124
|
+
body: result[4],
|
|
125
|
+
headers: Object.fromEntries(result[5]),
|
|
126
|
+
script: parseRadonScript(result[6]),
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async verifyRadonRequest(dataProviders, commonRetrievalArgs, options) {
|
|
131
|
+
const argsCount = await this.getDataSourcesArgsCount();
|
|
132
|
+
if (argsCount !== 1 + (commonRetrievalArgs?.length || 0)) {
|
|
133
|
+
throw TypeError(`${this.constructor.name}@${this.address}: unmatching args count != ${argsCount - 1}.`);
|
|
134
|
+
}
|
|
135
|
+
const method = this.contract.getFunction("verifyRadonRequest(string[],string[])");
|
|
136
|
+
const radHash = (await method.staticCall(commonRetrievalArgs || [], dataProviders)).slice(2);
|
|
137
|
+
try {
|
|
138
|
+
await (await this.witOracle.getWitOracleRadonRegistry()).lookupRadonRequestBytecode(radHash);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
if (options?.onVerifyRadonRequest)
|
|
142
|
+
options.onVerifyRadonRequest(radHash);
|
|
143
|
+
await method
|
|
144
|
+
.send(commonRetrievalArgs || [], dataProviders)
|
|
145
|
+
.then((tx) => tx.wait(options?.confirmations || 1))
|
|
146
|
+
.then((receipt) => {
|
|
147
|
+
if (options?.onVerifyRadonRequestReceipt) {
|
|
148
|
+
options.onVerifyRadonRequestReceipt(receipt);
|
|
149
|
+
}
|
|
150
|
+
return radHash;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return radHash;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
export class WitOracleRadonRequestTemplate extends WitAppliance {
|
|
157
|
+
constructor(witOracle, at) {
|
|
158
|
+
super(witOracle, "WitOracleRadonRequestTemplate", at);
|
|
159
|
+
}
|
|
160
|
+
static async at(witOracle, target) {
|
|
161
|
+
const template = new WitOracleRadonRequestTemplate(witOracle, target);
|
|
162
|
+
const templateWitOracleAddr = await template.contract.witOracle.staticCall();
|
|
163
|
+
if (templateWitOracleAddr !== witOracle.address) {
|
|
164
|
+
throw new Error(`${WitOracleRadonRequestTemplate.constructor.name} at ${target}: mismatching Wit/Oracle address (${templateWitOracleAddr})`);
|
|
165
|
+
}
|
|
166
|
+
return template;
|
|
167
|
+
}
|
|
168
|
+
async getDataResultType() {
|
|
169
|
+
return this.contract
|
|
170
|
+
.getFunction("getDataResultType()")
|
|
171
|
+
.staticCall()
|
|
172
|
+
.then((result) => {
|
|
173
|
+
switch (Number(result)) {
|
|
174
|
+
case 1:
|
|
175
|
+
return "array";
|
|
176
|
+
case 2:
|
|
177
|
+
return "boolean";
|
|
178
|
+
case 3:
|
|
179
|
+
return "bytes";
|
|
180
|
+
case 4:
|
|
181
|
+
return "integer";
|
|
182
|
+
case 5:
|
|
183
|
+
return "float";
|
|
184
|
+
case 6:
|
|
185
|
+
return "map";
|
|
186
|
+
case 7:
|
|
187
|
+
return "string";
|
|
188
|
+
default:
|
|
189
|
+
return "any";
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async getDataSources() {
|
|
194
|
+
return this.contract
|
|
195
|
+
.getFunction("getDataSources()")
|
|
196
|
+
.staticCall()
|
|
197
|
+
.then((results) => {
|
|
198
|
+
return results.map((result) => new Witnet.Radon.RadonRetrieval({
|
|
199
|
+
method: result[1],
|
|
200
|
+
url: result[3],
|
|
201
|
+
body: result[4],
|
|
202
|
+
headers: Object.fromEntries(result[5]),
|
|
203
|
+
script: parseRadonScript(result[6]),
|
|
204
|
+
}));
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
async getDataSourcesArgsCount() {
|
|
208
|
+
return this.contract
|
|
209
|
+
.getFunction("getDataSourcesArgsCount()")
|
|
210
|
+
.staticCall()
|
|
211
|
+
.then((dims) => dims.map((dim) => Number(dim)));
|
|
212
|
+
}
|
|
213
|
+
async verifyRadonRequest(args, options) {
|
|
214
|
+
const argsCount = await this.getDataSourcesArgsCount();
|
|
215
|
+
let encodedArgs = [];
|
|
216
|
+
if (typeof args === "string") {
|
|
217
|
+
if (argsCount.length === 1 && argsCount[0] === 1) {
|
|
218
|
+
encodedArgs = [[args]];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (Array.isArray(args)) {
|
|
222
|
+
if (Array.isArray(args[0])) {
|
|
223
|
+
if (argsCount.length === args.length &&
|
|
224
|
+
!args.find((subargs, index) => subargs.length !== argsCount[index])) {
|
|
225
|
+
encodedArgs = args;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else if (args.length === argsCount[0] &&
|
|
229
|
+
!args.find((arg) => typeof arg !== "string")) {
|
|
230
|
+
encodedArgs = [args];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (encodedArgs.length === 0) {
|
|
234
|
+
throw TypeError(`${this.constructor.name}@${this.address}: unmatching args count != [${argsCount}, ].`);
|
|
235
|
+
}
|
|
236
|
+
const method = this.contract.getFunction("verifyRadonRequest(string[][])");
|
|
237
|
+
const radHash = (await method.staticCall(encodedArgs)).slice(2);
|
|
238
|
+
try {
|
|
239
|
+
await (await this.witOracle.getWitOracleRadonRegistry()).lookupRadonRequestBytecode(radHash);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
if (options?.onVerifyRadonRequest)
|
|
243
|
+
options.onVerifyRadonRequest(radHash);
|
|
244
|
+
await method
|
|
245
|
+
.send(encodedArgs)
|
|
246
|
+
.then((tx) => tx.wait(options?.confirmations || 1))
|
|
247
|
+
.then((receipt) => {
|
|
248
|
+
if (options?.onVerifyRadonRequestReceipt) {
|
|
249
|
+
options.onVerifyRadonRequestReceipt(receipt);
|
|
250
|
+
}
|
|
251
|
+
return radHash;
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return radHash;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd3JhcHBlcnMvV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBR3BDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFJaEQsTUFBTSxPQUFPLDRCQUE2QixTQUFRLFlBQVk7SUFDN0MsUUFBUSxDQUF3QjtJQUVoRCxZQUNDLFNBQW9CLEVBQ3BCLFFBQWdDLEVBQ2hDLEVBQVc7UUFFWCxLQUFLLENBQUMsU0FBUyxFQUFFLDhCQUE4QixFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDcEIsU0FBb0IsRUFDcEIsUUFBZ0M7UUFFaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDdEUsTUFBTSx3QkFBd0IsR0FDN0IsTUFBTSxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUMvQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssd0JBQXdCLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUNkLEdBQUcsNEJBQTRCLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxRQUFRLENBQUMsT0FBTywyQ0FBMkMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUNySSxDQUFBO1FBQ0YsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFBO0lBQ2hCLENBQUM7SUFFTSxLQUFL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RUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDbEQsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksT0FBTyxFQUFFLDJCQUEyQixFQUFFLENBQUM7b0JBQzFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDN0MsQ0FBQztnQkFDRCxPQUFPLE9BQU8sQ0FBQTtZQUNmLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFBO0lBQ2YsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2l0bmV0IH0gZnJvbSBcIkB3aXRuZXQvc2RrXCJcbmltcG9ydCB0eXBlIHsgQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQsIFJlc3VsdCB9IGZyb20gXCJldGhlcnNcIlxuaW1wb3J0IHR5cGUgeyBXaXRPcmFjbGVSZXN1bHREYXRhVHlwZXMgfSBmcm9tIFwiLi4vdHlwZXMuanNcIlxuaW1wb3J0IHsgYWJpRW5jb2RlUmFkb25Bc3NldCwgcGFyc2VSYWRvblNjcmlwdCB9IGZyb20gXCIuLi91dGlscy5qc1wiXG5pbXBvcnQgeyBXaXRBcHBsaWFuY2UgfSBmcm9tIFwiLi9XaXRBcHBsaWFuY2UuanNcIlxuaW1wb3J0IHR5cGUgeyBXaXRPcmFjbGUgfSBmcm9tIFwiLi9XaXRPcmFjbGUuanNcIlxuaW1wb3J0IHR5cGUgeyBXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5IH0gZnJvbSBcIi4vV2l0T3JhY2xlUmFkb25SZWdpc3RyeS5qc1wiXG5cbmV4cG9ydCBjbGFzcyBXaXRPcmFjbGVSYWRvblJlcXVlc3RGYWN0b3J5IGV4dGVuZHMgV2l0QXBwbGlhbmNlIHtcblx0cHVibGljIHJlYWRvbmx5IHJlZ2lzdHJ5OiBXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuXHRcdHdpdE9yYWNsZTogV2l0T3JhY2xlLFxuXHRcdHJlZ2lzdHJ5OiBXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5LFxuXHRcdGF0Pzogc3RyaW5nLFxuXHQpIHtcblx0XHRzdXBlcih3aXRPcmFjbGUsIFwiV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeVwiLCBhdClcblx0XHR0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnlcblx0fVxuXG5cdHN0YXRpYyBhc3luYyBkZXBsb3llZChcblx0XHR3aXRPcmFjbGU6IFdpdE9yYWNsZSxcblx0XHRyZWdpc3RyeTogV2l0T3JhY2xlUmFkb25SZWdpc3RyeSxcblx0KTogUHJvbWlzZTxXaXRPcmFjbGVSYWRvblJlcXVlc3RGYWN0b3J5PiB7XG5cdFx0Y29uc3QgZGVwbG95ZXIgPSBuZXcgV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeSh3aXRPcmFjbGUsIHJlZ2lzdHJ5KVxuXHRcdGNvbnN0IHdpdE9yYWNsZVJlZ2lzdHJ5QWRkcmVzcyA9XG5cdFx0XHRhd2FpdCB3aXRPcmFjbGUuY29udHJhY3QucmVnaXN0cnkuc3RhdGljQ2FsbCgpXG5cdFx0aWYgKHJlZ2lzdHJ5LmFkZHJlc3MgIT09IHdpdE9yYWNsZVJlZ2lzdHJ5QWRkcmVzcykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgJHtXaXRPcmFjbGVSYWRvblJlcXVlc3RGYWN0b3J5LmNvbnN0cnVjdG9yLm5hbWV9IGF0ICR7ZGVwbG95ZXIuYWRkcmVzc306IHVuY29tcGxpYW50IFdpdE9yYWNsZVJhZG9uUmVnaXN0cnkgYXQgJHtyZWdpc3RyeS5hZGRyZXNzfSlgLFxuXHRcdFx0KVxuXHRcdH1cblx0XHRyZXR1cm4gZGVwbG95ZXJcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkZXBsb3lSYWRvblJlcXVlc3RUZW1wbGF0ZShcblx0XHR0ZW1wbGF0ZTogV2l0bmV0LlJhZG9uLlJhZG9uVGVtcGxhdGUsXG5cdFx0b3B0aW9ucz86IHtcblx0XHRcdGNvbmZpcm1hdGlvbnM/OiBudW1iZXJcblx0XHRcdG9uRGVwbG95UmFkb25SZXF1ZXN0VGVtcGxhdGU/OiAoYWRkcmVzczogc3RyaW5nKSA9PiBhbnlcblx0XHRcdG9uRGVwbG95UmFkb25SZXF1ZXN0VGVtcGxhdGVSZWNlaXB0PzogKFxuXHRcdFx0XHRyZWNlaXB0OiBDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwsXG5cdFx0XHQpID0+IGFueVxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsYmFjayBoYW5kbGVyIGNhbGxlZCBqdXN0IGluIGNhc2UgYSBgdmVyaWZ5UmFkb25SZXRyaWV2YWxgIHRyYW5zYWN0aW9uIGlzIHVsdGltYXRlbHkgcmVxdWlyZWQuXG5cdFx0XHQgKi9cblx0XHRcdG9uVmVyaWZ5UmFkb25SZXRyaWV2YWw/OiAoaGFzaDogc3RyaW5nKSA9PiBhbnlcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2FsbGJhY2sgaGFuZGxlciBjYWxsZWQgb25jZSB0aGUgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiBnZXRzIGNvbmZpcm1lZC5cblx0XHRcdCAqIEBwYXJhbSByZWNlaXB0IFRoZSBgdmVyaWZ5UmFkb25SZXRyaWV2YWxgIHRyYW5zYWN0aW9uIHJlY2VpcHQuXG5cdFx0XHQgKiBAcGFyYW0gaGFzaCBUaGUgdW5pcXVlIGhhc2ggb2YgdGhlIFJhZG9uIFJldHJpZXZhbCwgYXMgdmVyaWZpZWQgb24gdGhlIGNvbm5lY3RlZCBuZXR3b3JrLlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsUmVjZWlwdD86IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPFdpdE9yYWNsZVJhZG9uUmVxdWVzdFRlbXBsYXRlPiB7XG5cdFx0Y29uc3QgaGFzaGVzOiBBcnJheTxzdHJpbmc+ID0gW11cblx0XHRmb3IgKGNvbnN0IGluZGV4IGluIHRlbXBsYXRlLnNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHJldHJpZXZhbCA9IHRlbXBsYXRlLnNvdXJjZXNbaW5kZXhdXG5cdFx0XHRjb25zdCBoYXNoID0gYDB4JHthd2FpdCB0aGlzLnJlZ2lzdHJ5LmRldGVybWluZVJhZG9uUmV0cmlldmFsSGFzaChyZXRyaWV2YWwpfWBcblx0XHRcdGF3YWl0IHRoaXMucmVnaXN0cnkudmVyaWZ5UmFkb25SZXRyaWV2YWwocmV0cmlldmFsLCBvcHRpb25zKVxuXHRcdFx0aGFzaGVzLnB1c2goaGFzaClcblx0XHR9XG5cblx0XHRjb25zdCBhZ2dyZWdhdG9yID0gYWJpRW5jb2RlUmFkb25Bc3NldCh0ZW1wbGF0ZS5zb3VyY2VzUmVkdWNlcilcblx0XHRjb25zdCB0YWxseSA9IGFiaUVuY29kZVJhZG9uQXNzZXQodGVtcGxhdGUud2l0bmVzc1JlZHVjZXIpXG5cdFx0Y29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFxuXHRcdFx0XHRcImJ1aWxkUmFkb25SZXF1ZXN0VGVtcGxhdGUoYnl0ZXMzMltdLCh1aW50OCwodWludDgsYnl0ZXMpW10pLCh1aW50OCwodWludDgsYnl0ZXMpW10pKVwiLFxuXHRcdFx0KVxuXHRcdFx0LnN0YXRpY0NhbGwoaGFzaGVzLCBhZ2dyZWdhdG9yLCB0YWxseSlcblxuXHRcdGlmIChvcHRpb25zPy5vbkRlcGxveVJhZG9uUmVxdWVzdFRlbXBsYXRlKVxuXHRcdFx0b3B0aW9ucy5vbkRlcGxveVJhZG9uUmVxdWVzdFRlbXBsYXRlKHRhcmdldClcblx0XHRhd2FpdCB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcdFwiYnVpbGRSYWRvblJlcXVlc3RUZW1wbGF0ZShieXRlczMyW10sKHVpbnQ4LCh1aW50OCxieXRlcylbXSksKHVpbnQ4LCh1aW50OCxieXRlcylbXSkpXCIsXG5cdFx0XHQpXG5cdFx0XHQuc2VuZChoYXNoZXMsIGFnZ3JlZ2F0b3IsIHRhbGx5KVxuXHRcdFx0LnRoZW4oYXN5bmMgKHR4KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJlY2VpcHQgPSBhd2FpdCB0eC53YWl0KG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMSlcblx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uRGVwbG95UmFkb25SZXF1ZXN0VGVtcGxhdGVSZWNlaXB0KSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vbkRlcGxveVJhZG9uUmVxdWVzdFRlbXBsYXRlUmVjZWlwdChyZWNlaXB0KVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXG5cdFx0cmV0dXJuIGF3YWl0IFdpdE9yYWNsZVJhZG9uUmVxdWVzdFRlbXBsYXRlLmF0KHRoaXMud2l0T3JhY2xlLCB0YXJnZXQpXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGVwbG95UmFkb25SZXF1ZXN0TW9kYWwoXG5cdFx0bW9kYWw6IFdpdG5ldC5SYWRvbi5SYWRvbk1vZGFsLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRjb25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRvbkRlcGxveVJhZG9uUmVxdWVzdE1vZGFsPzogKGFkZHJlc3M6IHN0cmluZykgPT4gYW55XG5cdFx0XHRvbkRlcGxveVJhZG9uUmVxdWVzdE1vZGFsUmVjZWlwdD86IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2FsbGJhY2sgaGFuZGxlciBjYWxsZWQganVzdCBpbiBjYXNlIGEgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiBpcyB1bHRpbWF0ZWx5IHJlcXVpcmVkLlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsPzogKGhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIG9uY2UgdGhlIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gZ2V0cyBjb25maXJtZWQuXG5cdFx0XHQgKiBAcGFyYW0gcmVjZWlwdCBUaGUgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiByZWNlaXB0LlxuXHRcdFx0ICogQHBhcmFtIGhhc2ggVGhlIHVuaXF1ZSBoYXNoIG9mIHRoZSBSYWRvbiBSZXRyaWV2YWwsIGFzIHZlcmlmaWVkIG9uIHRoZSBjb25uZWN0ZWQgbmV0d29yay5cblx0XHRcdCAqL1xuXHRcdFx0b25WZXJpZnlSYWRvblJldHJpZXZhbFJlY2VpcHQ/OiAoXG5cdFx0XHRcdHJlY2VpcHQ6IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCxcblx0XHRcdCkgPT4gYW55XG5cdFx0fSxcblx0KTogUHJvbWlzZTxXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbD4ge1xuXHRcdGNvbnN0IHJldHJpZXZhbCA9IFtcblx0XHRcdG1vZGFsLnNvdXJjZXNbMF0ubWV0aG9kLFxuXHRcdFx0bW9kYWwuc291cmNlc1swXS5ib2R5IHx8IFwiXCIsXG5cdFx0XHRtb2RhbC5zb3VyY2VzWzBdPy5oZWFkZXJzID8gT2JqZWN0LmVudHJpZXMobW9kYWwuc291cmNlc1swXS5oZWFkZXJzKSA6IFtdLFxuXHRcdFx0bW9kYWwuc291cmNlc1swXS5zY3JpcHQ/LnRvQnl0ZWNvZGUoKSB8fCBcIjB4XCIsXG5cdFx0XVxuXHRcdGNvbnN0IHRhbGx5ID0gYWJpRW5jb2RlUmFkb25Bc3NldChtb2RhbC53aXRuZXNzUmVkdWNlcilcblx0XHRjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNvbnRyYWN0LmJ1aWxkUmFkb25SZXF1ZXN0TW9kYWwgLy9nZXRGdW5jdGlvbihcImJ1aWxkUmFkb25SZXF1ZXN0TW9kYWwoKHVpbnQ4LHN0cmluZyxzdHJpbmdbMl1bXSxieXRlcyksKHVpbnQ4LCh1aW50OCxieXRlcylbXSkpXCIpXG5cdFx0XHQuc3RhdGljQ2FsbChyZXRyaWV2YWwsIHRhbGx5KVxuXG5cdFx0aWYgKG9wdGlvbnM/Lm9uRGVwbG95UmFkb25SZXF1ZXN0TW9kYWwpXG5cdFx0XHRvcHRpb25zLm9uRGVwbG95UmFkb25SZXF1ZXN0TW9kYWwodGFyZ2V0KVxuXHRcdGF3YWl0IHRoaXMuY29udHJhY3QuYnVpbGRSYWRvblJlcXVlc3RNb2RhbFxuXHRcdFx0Ly8gLmdldEZ1bmN0aW9uKFwiYnVpbGRSYWRvblJlcXVlc3RNb2RhbCgodWludDgsc3RyaW5nLHN0cmluZ1syXVtdLGJ5dGVzKSwodWludDgsKHVpbnQ4LGJ5dGVzKVtdKSlcIilcblx0XHRcdC5zZW5kKHJldHJpZXZhbCwgdGFsbHkpXG5cdFx0XHQudGhlbihhc3luYyAodHgpID0+IHtcblx0XHRcdFx0Y29uc3QgcmVjZWlwdCA9IGF3YWl0IHR4LndhaXQob3B0aW9ucz8uY29uZmlybWF0aW9ucyB8fCAxKVxuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25EZXBsb3lSYWRvblJlcXVlc3RNb2RhbFJlY2VpcHQpIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uRGVwbG95UmFkb25SZXF1ZXN0TW9kYWxSZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cblx0XHRyZXR1cm4gYXdhaXQgV2l0T3JhY2xlUmFkb25SZXF1ZXN0TW9kYWwuYXQodGhpcy53aXRPcmFjbGUsIHRhcmdldClcblx0fVxuXG5cdHB1YmxpYyBhc3luYyB2ZXJpZnlSYWRvblJlcXVlc3QoXG5cdFx0cmVxdWVzdDogV2l0bmV0LlJhZG9uLlJhZG9uUmVxdWVzdCxcblx0XHRfb3B0aW9ucz86IHtcblx0XHRcdGNvbmZpcm1hdGlvbnM/OiBudW1iZXJcblx0XHRcdG9uVmVyaWZ5UmFkb25SZXF1ZXN0PzogKGFkZHJlc3M6IHN0cmluZykgPT4gYW55XG5cdFx0XHRvblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQ/OiAoXG5cdFx0XHRcdHJlY2VpcHQ6IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCxcblx0XHRcdCkgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIGp1c3QgaW4gY2FzZSBhIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gaXMgdWx0aW1hdGVseSByZXF1aXJlZC5cblx0XHRcdCAqL1xuXHRcdFx0b25WZXJpZnlSYWRvblJldHJpZXZhbD86IChoYXNoOiBzdHJpbmcpID0+IGFueVxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsYmFjayBoYW5kbGVyIGNhbGxlZCBvbmNlIHRoZSBgdmVyaWZ5UmFkb25SZXRyaWV2YWxgIHRyYW5zYWN0aW9uIGdldHMgY29uZmlybWVkLlxuXHRcdFx0ICogQHBhcmFtIHJlY2VpcHQgVGhlIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gcmVjZWlwdC5cblx0XHRcdCAqIEBwYXJhbSBoYXNoIFRoZSB1bmlxdWUgaGFzaCBvZiB0aGUgUmFkb24gUmV0cmlldmFsLCBhcyB2ZXJpZmllZCBvbiB0aGUgY29ubmVjdGVkIG5ldHdvcmsuXG5cdFx0XHQgKi9cblx0XHRcdG9uVmVyaWZ5UmFkb25SZXRyaWV2YWxSZWNlaXB0PzogKFxuXHRcdFx0XHRyZWNlaXB0OiBDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwsXG5cdFx0XHQpID0+IGFueVxuXHRcdH0sXG5cdCk6IFByb21pc2U8V2l0bmV0Lkhhc2g+IHtcblx0XHQvLyBUT0RPOlxuXHRcdC8vXG5cdFx0cmV0dXJuIHJlcXVlc3QucmFkSGFzaFxuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbCBleHRlbmRzIFdpdEFwcGxpYW5jZSB7XG5cdHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih3aXRPcmFjbGU6IFdpdE9yYWNsZSwgYXQ6IHN0cmluZykge1xuXHRcdHN1cGVyKHdpdE9yYWNsZSwgXCJXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbFwiLCBhdClcblx0fVxuXG5cdHN0YXRpYyBhc3luYyBhdChcblx0XHR3aXRPcmFjbGU6IFdpdE9yYWNsZSxcblx0XHR0YXJnZXQ6IHN0cmluZyxcblx0KTogUHJvbWlzZTxXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbD4ge1xuXHRcdGNvbnN0IHRlbXBsYXRlID0gbmV3IFdpdE9yYWNsZVJhZG9uUmVxdWVzdE1vZGFsKHdpdE9yYWNsZSwgdGFyZ2V0KVxuXHRcdGNvbnN0IHRlbXBsYXRlV2l0T3JhY2xlQWRkciA9IGF3YWl0IHRlbXBsYXRlLmNvbnRyYWN0LndpdE9yYWNsZS5zdGF0aWNDYWxsKClcblx0XHRpZiAodGVtcGxhdGVXaXRPcmFjbGVBZGRyICE9PSB3aXRPcmFjbGUuYWRkcmVzcykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgJHtXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbC5jb25zdHJ1Y3Rvci5uYW1lfSBhdCAke3RhcmdldH06IG1pc21hdGNoaW5nIFdpdC9PcmFjbGUgYWRkcmVzcyAoJHt0ZW1wbGF0ZVdpdE9yYWNsZUFkZHJ9KWAsXG5cdFx0XHQpXG5cdFx0fVxuXHRcdHJldHVybiB0ZW1wbGF0ZVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldERhdGFSZXN1bHRUeXBlKCk6IFByb21pc2U8V2l0T3JhY2xlUmVzdWx0RGF0YVR5cGVzPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3Rcblx0XHRcdC5nZXRGdW5jdGlvbihcImdldERhdGFSZXN1bHRUeXBlKClcIilcblx0XHRcdC5zdGF0aWNDYWxsKClcblx0XHRcdC50aGVuKChyZXN1bHQ6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRzd2l0Y2ggKE51bWJlcihyZXN1bHQpKSB7XG5cdFx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiYXJyYXlcIlxuXHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdHJldHVybiBcImJvb2xlYW5cIlxuXHRcdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRcdHJldHVybiBcImJ5dGVzXCJcblx0XHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJpbnRlZ2VyXCJcblx0XHRcdFx0XHRjYXNlIDU6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJmbG9hdFwiXG5cdFx0XHRcdFx0Y2FzZSA2OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwibWFwXCJcblx0XHRcdFx0XHRjYXNlIDc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJhbnlcIlxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldERhdGFTb3VyY2VzQXJnc0NvdW50KCk6IFByb21pc2U8bnVtYmVyPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3Rcblx0XHRcdC5nZXRGdW5jdGlvbihcImdldERhdGFTb3VyY2VzQXJnc0NvdW50KClcIilcblx0XHRcdC5zdGF0aWNDYWxsKClcblx0XHRcdC50aGVuKChhcmdzQ291bnQ6IGJpZ2ludCkgPT4gTnVtYmVyKGFyZ3NDb3VudCkpXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZ2V0UmFkb25Nb2RhbFJldHJpZXZhbCgpOiBQcm9taXNlPFdpdG5ldC5SYWRvbi5SYWRvblJldHJpZXZhbD4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXCJnZXRSYWRvbk1vZGFsUmV0cmlldmFsKClcIilcblx0XHRcdC5zdGF0aWNDYWxsKClcblx0XHRcdC50aGVuKChyZXN1bHQ6IFJlc3VsdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFdpdG5ldC5SYWRvbi5SYWRvblJldHJpZXZhbCh7XG5cdFx0XHRcdFx0bWV0aG9kOiByZXN1bHRbMV0sXG5cdFx0XHRcdFx0dXJsOiByZXN1bHRbM10sXG5cdFx0XHRcdFx0Ym9keTogcmVzdWx0WzRdLFxuXHRcdFx0XHRcdGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRbNV0pLFxuXHRcdFx0XHRcdHNjcmlwdDogcGFyc2VSYWRvblNjcmlwdChyZXN1bHRbNl0pLFxuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyB2ZXJpZnlSYWRvblJlcXVlc3QoXG5cdFx0ZGF0YVByb3ZpZGVyczogc3RyaW5nW10sXG5cdFx0Y29tbW9uUmV0cmlldmFsQXJncz86IHN0cmluZ1tdLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRjb25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRvblZlcmlmeVJhZG9uUmVxdWVzdDogKHJhZEhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHRvblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQ6IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPFdpdG5ldC5IYXNoPiB7XG5cdFx0Y29uc3QgYXJnc0NvdW50ID0gYXdhaXQgdGhpcy5nZXREYXRhU291cmNlc0FyZ3NDb3VudCgpXG5cdFx0aWYgKGFyZ3NDb3VudCAhPT0gMSArIChjb21tb25SZXRyaWV2YWxBcmdzPy5sZW5ndGggfHwgMCkpIHtcblx0XHRcdHRocm93IFR5cGVFcnJvcihcblx0XHRcdFx0YCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfUAke3RoaXMuYWRkcmVzc306IHVubWF0Y2hpbmcgYXJncyBjb3VudCAhPSAke2FyZ3NDb3VudCAtIDF9LmAsXG5cdFx0XHQpXG5cdFx0fVxuXHRcdGNvbnN0IG1ldGhvZCA9IHRoaXMuY29udHJhY3QuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcInZlcmlmeVJhZG9uUmVxdWVzdChzdHJpbmdbXSxzdHJpbmdbXSlcIixcblx0XHQpXG5cdFx0Y29uc3QgcmFkSGFzaCA9IChcblx0XHRcdGF3YWl0IG1ldGhvZC5zdGF0aWNDYWxsKGNvbW1vblJldHJpZXZhbEFyZ3MgfHwgW10sIGRhdGFQcm92aWRlcnMpXG5cdFx0KS5zbGljZSgyKVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCAoXG5cdFx0XHRcdGF3YWl0IHRoaXMud2l0T3JhY2xlLmdldFdpdE9yYWNsZVJhZG9uUmVnaXN0cnkoKVxuXHRcdFx0KS5sb29rdXBSYWRvblJlcXVlc3RCeXRlY29kZShyYWRIYXNoKVxuXHRcdH0gY2F0Y2gge1xuXHRcdFx0aWYgKG9wdGlvbnM/Lm9uVmVyaWZ5UmFkb25SZXF1ZXN0KSBvcHRpb25zLm9uVmVyaWZ5UmFkb25SZXF1ZXN0KHJhZEhhc2gpXG5cdFx0XHRhd2FpdCBtZXRob2Rcblx0XHRcdFx0LnNlbmQoY29tbW9uUmV0cmlldmFsQXJncyB8fCBbXSwgZGF0YVByb3ZpZGVycylcblx0XHRcdFx0LnRoZW4oKHR4KSA9PiB0eC53YWl0KG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMSkpXG5cdFx0XHRcdC50aGVuKChyZWNlaXB0KSA9PiB7XG5cdFx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uVmVyaWZ5UmFkb25SZXF1ZXN0UmVjZWlwdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9ucy5vblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQocmVjZWlwdClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHJhZEhhc2hcblx0XHRcdFx0fSlcblx0XHR9XG5cdFx0cmV0dXJuIHJhZEhhc2hcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgV2l0T3JhY2xlUmFkb25SZXF1ZXN0VGVtcGxhdGUgZXh0ZW5kcyBXaXRBcHBsaWFuY2Uge1xuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3Iod2l0T3JhY2xlOiBXaXRPcmFjbGUsIGF0OiBzdHJpbmcpIHtcblx0XHRzdXBlcih3aXRPcmFjbGUsIFwiV2l0T3JhY2xlUmFkb25SZXF1ZXN0VGVtcGxhdGVcIiwgYXQpXG5cdH1cblxuXHRzdGF0aWMgYXN5bmMgYXQoXG5cdFx0d2l0T3JhY2xlOiBXaXRPcmFjbGUsXG5cdFx0dGFyZ2V0OiBzdHJpbmcsXG5cdCk6IFByb21pc2U8V2l0T3JhY2xlUmFkb25SZXF1ZXN0VGVtcGxhdGU+IHtcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IG5ldyBXaXRPcmFjbGVSYWRvblJlcXVlc3RUZW1wbGF0ZSh3aXRPcmFjbGUsIHRhcmdldClcblx0XHRjb25zdCB0ZW1wbGF0ZVdpdE9yYWNsZUFkZHIgPSBhd2FpdCB0ZW1wbGF0ZS5jb250cmFjdC53aXRPcmFjbGUuc3RhdGljQ2FsbCgpXG5cdFx0aWYgKHRlbXBsYXRlV2l0T3JhY2xlQWRkciAhPT0gd2l0T3JhY2xlLmFkZHJlc3MpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YCR7V2l0T3JhY2xlUmFkb25SZXF1ZXN0VGVtcGxhdGUuY29uc3RydWN0b3IubmFtZX0gYXQgJHt0YXJnZXR9OiBtaXNtYXRjaGluZyBXaXQvT3JhY2xlIGFkZHJlc3MgKCR7dGVtcGxhdGVXaXRPcmFjbGVBZGRyfSlgLFxuXHRcdFx0KVxuXHRcdH1cblx0XHRyZXR1cm4gdGVtcGxhdGVcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXREYXRhUmVzdWx0VHlwZSgpOiBQcm9taXNlPFdpdE9yYWNsZVJlc3VsdERhdGFUeXBlcz4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXCJnZXREYXRhUmVzdWx0VHlwZSgpXCIpXG5cdFx0XHQuc3RhdGljQ2FsbCgpXG5cdFx0XHQudGhlbigocmVzdWx0OiBudW1iZXIpID0+IHtcblx0XHRcdFx0c3dpdGNoIChOdW1iZXIocmVzdWx0KSkge1xuXHRcdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0XHRcdHJldHVybiBcImFycmF5XCJcblx0XHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJib29sZWFuXCJcblx0XHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJieXRlc1wiXG5cdFx0XHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiaW50ZWdlclwiXG5cdFx0XHRcdFx0Y2FzZSA1OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiZmxvYXRcIlxuXHRcdFx0XHRcdGNhc2UgNjpcblx0XHRcdFx0XHRcdHJldHVybiBcIm1hcFwiXG5cdFx0XHRcdFx0Y2FzZSA3OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwic3RyaW5nXCJcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiYW55XCJcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXREYXRhU291cmNlcygpOiBQcm9taXNlPEFycmF5PFdpdG5ldC5SYWRvbi5SYWRvblJldHJpZXZhbD4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwiZ2V0RGF0YVNvdXJjZXMoKVwiKVxuXHRcdFx0LnN0YXRpY0NhbGwoKVxuXHRcdFx0LnRoZW4oKHJlc3VsdHM6IEFycmF5PFJlc3VsdD4pID0+IHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHMubWFwKFxuXHRcdFx0XHRcdChyZXN1bHQpID0+XG5cdFx0XHRcdFx0XHRuZXcgV2l0bmV0LlJhZG9uLlJhZG9uUmV0cmlldmFsKHtcblx0XHRcdFx0XHRcdFx0bWV0aG9kOiByZXN1bHRbMV0sXG5cdFx0XHRcdFx0XHRcdHVybDogcmVzdWx0WzNdLFxuXHRcdFx0XHRcdFx0XHRib2R5OiByZXN1bHRbNF0sXG5cdFx0XHRcdFx0XHRcdGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRbNV0pLFxuXHRcdFx0XHRcdFx0XHRzY3JpcHQ6IHBhcnNlUmFkb25TY3JpcHQocmVzdWx0WzZdKSxcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHQpXG5cdFx0XHR9KVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldERhdGFTb3VyY2VzQXJnc0NvdW50KCk6IFByb21pc2U8QXJyYXk8bnVtYmVyPj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXCJnZXREYXRhU291cmNlc0FyZ3NDb3VudCgpXCIpXG5cdFx0XHQuc3RhdGljQ2FsbCgpXG5cdFx0XHQudGhlbigoZGltczogQXJyYXk8YmlnaW50PikgPT4gZGltcy5tYXAoKGRpbSkgPT4gTnVtYmVyKGRpbSkpKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIHZlcmlmeVJhZG9uUmVxdWVzdChcblx0XHRhcmdzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IEFycmF5PHN0cmluZ1tdPixcblx0XHRvcHRpb25zPzoge1xuXHRcdFx0Y29uZmlybWF0aW9ucz86IG51bWJlclxuXHRcdFx0b25WZXJpZnlSYWRvblJlcXVlc3Q6IChyYWRIYXNoOiBzdHJpbmcpID0+IGFueVxuXHRcdFx0b25WZXJpZnlSYWRvblJlcXVlc3RSZWNlaXB0OiAoXG5cdFx0XHRcdHJlY2VpcHQ6IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCxcblx0XHRcdCkgPT4gYW55XG5cdFx0fSxcblx0KTogUHJvbWlzZTxXaXRuZXQuSGV4U3RyaW5nPiB7XG5cdFx0Y29uc3QgYXJnc0NvdW50ID0gYXdhaXQgdGhpcy5nZXREYXRhU291cmNlc0FyZ3NDb3VudCgpXG5cdFx0bGV0IGVuY29kZWRBcmdzOiBBcnJheTxzdHJpbmdbXT4gPSBbXVxuXHRcdGlmICh0eXBlb2YgYXJncyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKGFyZ3NDb3VudC5sZW5ndGggPT09IDEgJiYgYXJnc0NvdW50WzBdID09PSAxKSB7XG5cdFx0XHRcdGVuY29kZWRBcmdzID0gW1thcmdzIGFzIHN0cmluZ11dXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0YXJnc0NvdW50Lmxlbmd0aCA9PT0gYXJncy5sZW5ndGggJiZcblx0XHRcdFx0XHQhYXJncy5maW5kKChzdWJhcmdzLCBpbmRleCkgPT4gc3ViYXJncy5sZW5ndGggIT09IGFyZ3NDb3VudFtpbmRleF0pXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGVuY29kZWRBcmdzID0gYXJncyBhcyBBcnJheTxzdHJpbmdbXT5cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0YXJncy5sZW5ndGggPT09IGFyZ3NDb3VudFswXSAmJlxuXHRcdFx0XHQhYXJncy5maW5kKChhcmcpID0+IHR5cGVvZiBhcmcgIT09IFwic3RyaW5nXCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0ZW5jb2RlZEFyZ3MgPSBbYXJncyBhcyBzdHJpbmdbXV1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGVuY29kZWRBcmdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFxuXHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9QCR7dGhpcy5hZGRyZXNzfTogdW5tYXRjaGluZyBhcmdzIGNvdW50ICE9IFske2FyZ3NDb3VudH0sIF0uYCxcblx0XHRcdClcblx0XHR9XG5cdFx0Y29uc3QgbWV0aG9kID0gdGhpcy5jb250cmFjdC5nZXRGdW5jdGlvbihcInZlcmlmeVJhZG9uUmVxdWVzdChzdHJpbmdbXVtdKVwiKVxuXHRcdGNvbnN0IHJhZEhhc2ggPSAoYXdhaXQgbWV0aG9kLnN0YXRpY0NhbGwoZW5jb2RlZEFyZ3MpKS5zbGljZSgyKVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCAoXG5cdFx0XHRcdGF3YWl0IHRoaXMud2l0T3JhY2xlLmdldFdpdE9yYWNsZVJhZG9uUmVnaXN0cnkoKVxuXHRcdFx0KS5sb29rdXBSYWRvblJlcXVlc3RCeXRlY29kZShyYWRIYXNoKVxuXHRcdH0gY2F0Y2gge1xuXHRcdFx0aWYgKG9wdGlvbnM/Lm9uVmVyaWZ5UmFkb25SZXF1ZXN0KSBvcHRpb25zLm9uVmVyaWZ5UmFkb25SZXF1ZXN0KHJhZEhhc2gpXG5cdFx0XHRhd2FpdCBtZXRob2Rcblx0XHRcdFx0LnNlbmQoZW5jb2RlZEFyZ3MpXG5cdFx0XHRcdC50aGVuKCh0eCkgPT4gdHgud2FpdChvcHRpb25zPy5jb25maXJtYXRpb25zIHx8IDEpKVxuXHRcdFx0XHQudGhlbigocmVjZWlwdCkgPT4ge1xuXHRcdFx0XHRcdGlmIChvcHRpb25zPy5vblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvbnMub25WZXJpZnlSYWRvblJlcXVlc3RSZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiByYWRIYXNoXG5cdFx0XHRcdH0pXG5cdFx0fVxuXHRcdHJldHVybiByYWRIYXNoXG5cdH1cbn1cbiJdfQ==
|