@witnet/sdk 1.1.3 → 1.2.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/.env_witnet +13 -1
- package/dist/package.json +31 -24
- package/dist/src/bin/helpers.d.ts +59 -49
- package/dist/src/bin/helpers.d.ts.map +1 -1
- package/dist/src/bin/helpers.js +228 -229
- package/dist/src/index.d.ts +3 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -47
- package/dist/src/lib/crypto/account.d.ts +3 -3
- package/dist/src/lib/crypto/account.d.ts.map +1 -1
- package/dist/src/lib/crypto/account.js +31 -25
- package/dist/src/lib/crypto/coinbase.d.ts +4 -4
- package/dist/src/lib/crypto/coinbase.d.ts.map +1 -1
- package/dist/src/lib/crypto/coinbase.js +8 -13
- package/dist/src/lib/crypto/index.d.ts +7 -7
- package/dist/src/lib/crypto/index.d.ts.map +1 -1
- package/dist/src/lib/crypto/index.js +7 -30
- package/dist/src/lib/crypto/interfaces.d.ts +5 -5
- package/dist/src/lib/crypto/interfaces.d.ts.map +1 -1
- package/dist/src/lib/crypto/interfaces.js +2 -3
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +5 -5
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/DataRequestPayload.js +107 -95
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts +3 -4
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/StakePayload.js +81 -71
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +4 -5
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/UnstakePayload.js +36 -43
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +3 -4
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +46 -48
- package/dist/src/lib/crypto/payloads.d.ts +5 -5
- package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads.js +44 -45
- package/dist/src/lib/crypto/signer.d.ts +3 -3
- package/dist/src/lib/crypto/signer.d.ts.map +1 -1
- package/dist/src/lib/crypto/signer.js +45 -88
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +6 -6
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters/DataRequests.js +6 -10
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +5 -5
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters/StakeDeposits.js +7 -11
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +6 -7
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +9 -13
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +5 -5
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters/ValueTransfers.js +6 -10
- package/dist/src/lib/crypto/transmitters.d.ts +6 -6
- package/dist/src/lib/crypto/transmitters.d.ts.map +1 -1
- package/dist/src/lib/crypto/transmitters.js +88 -76
- package/dist/src/lib/crypto/types.d.ts +1 -2
- package/dist/src/lib/crypto/types.d.ts.map +1 -1
- package/dist/src/lib/crypto/types.js +71 -67
- package/dist/src/lib/crypto/utils.d.ts +5 -5
- package/dist/src/lib/crypto/utils.d.ts.map +1 -1
- package/dist/src/lib/crypto/utils.js +48 -66
- package/dist/src/lib/crypto/wallet.d.ts +3 -3
- package/dist/src/lib/crypto/wallet.d.ts.map +1 -1
- package/dist/src/lib/crypto/wallet.js +72 -89
- package/dist/src/lib/index.d.ts +5 -4
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +6 -44
- package/dist/src/lib/radon/ccdr/eth.d.ts +1 -1
- package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -1
- package/dist/src/lib/radon/ccdr/eth.js +95 -83
- package/dist/src/lib/radon/ccdr/index.d.ts +2 -2
- package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -1
- package/dist/src/lib/radon/ccdr/index.js +3 -39
- package/dist/src/lib/radon/ccdr/wit.d.ts +2 -2
- package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -1
- package/dist/src/lib/radon/ccdr/wit.js +17 -19
- package/dist/src/lib/radon/filters.d.ts.map +1 -1
- package/dist/src/lib/radon/filters.js +23 -19
- package/dist/src/lib/radon/index.d.ts +10 -11
- package/dist/src/lib/radon/index.d.ts.map +1 -1
- package/dist/src/lib/radon/index.js +205 -187
- package/dist/src/lib/radon/reducers.d.ts +2 -2
- package/dist/src/lib/radon/reducers.d.ts.map +1 -1
- package/dist/src/lib/radon/reducers.js +48 -34
- package/dist/src/lib/radon/types.d.ts +2 -2
- package/dist/src/lib/radon/types.d.ts.map +1 -1
- package/dist/src/lib/radon/types.js +80 -110
- package/dist/src/lib/radon/utils.d.ts +3 -3
- package/dist/src/lib/radon/utils.d.ts.map +1 -1
- package/dist/src/lib/radon/utils.js +49 -52
- package/dist/src/lib/rest/kermit.d.ts +20 -0
- package/dist/src/lib/rest/kermit.d.ts.map +1 -0
- package/dist/src/lib/rest/kermit.js +68 -0
- package/dist/src/lib/rest/types.d.ts +5 -0
- package/dist/src/lib/rest/types.d.ts.map +1 -0
- package/dist/src/lib/rest/types.js +2 -0
- package/dist/src/lib/rpc/index.d.ts +2 -2
- package/dist/src/lib/rpc/index.d.ts.map +1 -1
- package/dist/src/lib/rpc/index.js +3 -19
- package/dist/src/lib/rpc/nodes.d.ts +13 -13
- package/dist/src/lib/rpc/nodes.d.ts.map +1 -1
- package/dist/src/lib/rpc/nodes.js +69 -98
- package/dist/src/lib/rpc/provider.d.ts +4 -4
- package/dist/src/lib/rpc/provider.d.ts.map +1 -1
- package/dist/src/lib/rpc/provider.js +111 -125
- package/dist/src/lib/rpc/types.d.ts +2 -2
- package/dist/src/lib/rpc/types.d.ts.map +1 -1
- package/dist/src/lib/rpc/types.js +13 -16
- package/dist/src/lib/types.d.ts +5 -4
- package/dist/src/lib/types.d.ts.map +1 -1
- package/dist/src/lib/types.js +3 -9
- package/dist/src/lib/utils.d.ts +5 -5
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +40 -99
- package/dist/witnet/assets/index.cjs +6 -0
- package/dist/witnet/assets/index.d.cts +29 -0
- package/dist/witnet/assets/index.d.cts.map +1 -0
- package/dist/witnet/assets/modals/index.cjs +9 -0
- package/dist/witnet/assets/modals/index.d.cts +16 -0
- package/dist/witnet/assets/modals/index.d.cts.map +1 -0
- package/dist/witnet/assets/modals/web3/eth.cjs +23 -0
- package/dist/witnet/assets/modals/web3/eth.d.cts +4 -0
- package/dist/witnet/assets/modals/web3/eth.d.cts.map +1 -0
- package/dist/witnet/assets/modals/web3/ipfs.cjs +18 -0
- package/dist/witnet/assets/modals/web3/ipfs.d.cts +3 -0
- package/dist/witnet/assets/modals/web3/ipfs.d.cts.map +1 -0
- package/dist/witnet/assets/modals/web3/wit.cjs +24 -0
- package/dist/witnet/assets/modals/web3/wit.d.cts +3 -0
- package/dist/witnet/assets/modals/web3/wit.d.cts.map +1 -0
- package/dist/witnet/assets/requests.cjs +43 -0
- package/dist/witnet/assets/requests.d.cts +10 -0
- package/dist/witnet/assets/requests.d.cts.map +1 -0
- package/package.json +31 -24
- package/src/bin/bots/watcher.cjs +354 -0
- package/src/bin/cli/history.cjs +31 -0
- package/src/bin/cli/inspect.js +545 -471
- package/src/bin/cli/network.js +658 -557
- package/src/bin/cli/nodes.js +392 -332
- package/src/bin/cli/radon.js +1071 -844
- package/src/bin/cli/wallet.js +1317 -1074
- package/src/bin/helpers.js +969 -868
- package/src/bin/index.js +329 -0
- package/witnet/assets/_index.cjs +5 -0
- package/witnet/assets/_requests.cjs +25 -0
- package/witnet/assets/_sources.cjs +36 -0
- package/witnet/assets/_templates.cjs +36 -0
- package/witnet/assets/index.cjs +4 -0
- package/witnet/assets/modals/index.cjs +7 -0
- package/witnet/assets/modals/web3/eth.cjs +27 -0
- package/witnet/assets/modals/web3/ipfs.cjs +22 -0
- package/witnet/assets/modals/web3/wit.cjs +28 -0
- package/witnet/assets/requests.cjs +49 -0
- package/witnet/witnet copy.proto +457 -0
- package/witnet/witnet.proto +456 -0
- package/witnet/witnet_toolkit-1.6.7-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-1.7.1-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.0-rc.7-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.2-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.21-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.7-x86_64-pc-windows-msvc.exe +0 -0
- package/witnet/witnet_toolkit-2.0.8-x86_64-pc-windows-msvc.exe +0 -0
- package/dist/witnet/assets/index.d.ts +0 -29
- package/dist/witnet/assets/index.d.ts.map +0 -1
- package/dist/witnet/assets/index.js +0 -6
- package/dist/witnet/assets/modals/index.d.ts +0 -16
- package/dist/witnet/assets/modals/index.d.ts.map +0 -1
- package/dist/witnet/assets/modals/index.js +0 -11
- package/dist/witnet/assets/modals/web3/eth.d.ts +0 -5
- package/dist/witnet/assets/modals/web3/eth.d.ts.map +0 -1
- package/dist/witnet/assets/modals/web3/eth.js +0 -26
- package/dist/witnet/assets/modals/web3/ipfs.d.ts +0 -4
- package/dist/witnet/assets/modals/web3/ipfs.d.ts.map +0 -1
- package/dist/witnet/assets/modals/web3/ipfs.js +0 -18
- package/dist/witnet/assets/modals/web3/wit.d.ts +0 -4
- package/dist/witnet/assets/modals/web3/wit.d.ts.map +0 -1
- package/dist/witnet/assets/modals/web3/wit.js +0 -17
- package/dist/witnet/assets/requests.d.ts +0 -11
- package/dist/witnet/assets/requests.d.ts.map +0 -1
- package/dist/witnet/assets/requests.js +0 -43
- package/src/bin/cli/history.js +0 -31
- package/src/bin/postinstall.js +0 -9
- package/src/bin/toolkit.js +0 -290
- package/witnet/assets/_index.js +0 -8
- package/witnet/assets/_requests.js +0 -25
- package/witnet/assets/_sources.js +0 -36
- package/witnet/assets/_templates.js +0 -36
- package/witnet/assets/index.js +0 -4
- package/witnet/assets/modals/index.js +0 -9
- package/witnet/assets/modals/web3/eth.js +0 -29
- package/witnet/assets/modals/web3/ipfs.js +0 -22
- package/witnet/assets/modals/web3/wit.js +0 -21
- package/witnet/assets/requests.js +0 -49
- /package/witnet/assets/modals/web3/{btc.js → btc.cjs} +0 -0
- /package/witnet/assets/modals/web3/{sol.js → sol.cjs} +0 -0
|
@@ -1,48 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.JsonRpcProvider = exports.JsonRpcProviderError = void 0;
|
|
37
|
-
const axios_1 = __importStar(require("axios"));
|
|
38
|
-
const jsonBig = require('json-bigint');
|
|
39
|
-
const protobufjs_1 = require("protobufjs");
|
|
40
|
-
const protoRoot = protobufjs_1.Root.fromJSON(require("../../../witnet/witnet.proto.json"));
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { AxiosHeaders, default as axios } from "axios";
|
|
3
|
+
import jsonBig from "json-bigint";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
import protobuf from "protobufjs";
|
|
6
|
+
const { Root: ProtoRoot } = protobuf;
|
|
7
|
+
const protoRoot = ProtoRoot.fromJSON(require("../../../witnet/witnet.proto.json"));
|
|
41
8
|
const protoBuf = protoRoot.lookupType("ConsensusConstants");
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class JsonRpcProviderError extends Error {
|
|
9
|
+
import { PublicKey, } from "../crypto/types.js";
|
|
10
|
+
import * as utils from "../utils.js";
|
|
11
|
+
import { Methods, } from "./types.js";
|
|
12
|
+
export class JsonRpcProviderError extends Error {
|
|
13
|
+
error;
|
|
14
|
+
method;
|
|
15
|
+
params;
|
|
46
16
|
constructor(method, params, error) {
|
|
47
17
|
super(`${method}(${JSON.stringify(params)}): ${JSON.stringify(error)})`);
|
|
48
18
|
delete error?.stack;
|
|
@@ -51,8 +21,11 @@ class JsonRpcProviderError extends Error {
|
|
|
51
21
|
this.params = params;
|
|
52
22
|
}
|
|
53
23
|
}
|
|
54
|
-
|
|
55
|
-
|
|
24
|
+
export class JsonRpcProvider {
|
|
25
|
+
endpoints;
|
|
26
|
+
static receipts = {};
|
|
27
|
+
_constants;
|
|
28
|
+
_headers;
|
|
56
29
|
/**
|
|
57
30
|
* Create and initialize a JsonRpcProvider object connected to the default Wit/RPC endpoint.
|
|
58
31
|
* Defaults to https://rpc-01.witnet.io if no WITNET_SDK_PROVIDER_URL envar is settled
|
|
@@ -72,9 +45,9 @@ class JsonRpcProvider {
|
|
|
72
45
|
constructor(url) {
|
|
73
46
|
this.endpoints = [];
|
|
74
47
|
if (url !== undefined) {
|
|
75
|
-
const urls = url.replaceAll(
|
|
76
|
-
urls.forEach(url => {
|
|
77
|
-
const [schema
|
|
48
|
+
const urls = url.replaceAll(",", ";").split(";");
|
|
49
|
+
urls.forEach((url) => {
|
|
50
|
+
const [schema] = utils.parseURL(url);
|
|
78
51
|
if (!schema.startsWith("http://") && !schema.startsWith("https://")) {
|
|
79
52
|
throw Error(`Witnet.JsonRpcProvider: unsupported URL schema ${schema}`);
|
|
80
53
|
}
|
|
@@ -84,13 +57,15 @@ class JsonRpcProvider {
|
|
|
84
57
|
else {
|
|
85
58
|
this.endpoints.push(process.env.WITNET_SDK_PROVIDER_URL || "https://rpc-01.witnet.io");
|
|
86
59
|
}
|
|
87
|
-
this._headers = new
|
|
88
|
-
"Content-Type": "application/json"
|
|
60
|
+
this._headers = new AxiosHeaders({
|
|
61
|
+
"Content-Type": "application/json",
|
|
89
62
|
});
|
|
90
63
|
}
|
|
91
64
|
get network() {
|
|
92
65
|
if (this._constants) {
|
|
93
|
-
return this._constants.bootstrapping_committee[0].startsWith(
|
|
66
|
+
return this._constants.bootstrapping_committee[0].startsWith("wit")
|
|
67
|
+
? "mainnet"
|
|
68
|
+
: "testnet";
|
|
94
69
|
}
|
|
95
70
|
else {
|
|
96
71
|
return undefined;
|
|
@@ -100,15 +75,20 @@ class JsonRpcProvider {
|
|
|
100
75
|
if (this._constants) {
|
|
101
76
|
const obj = {};
|
|
102
77
|
obj.activityPeriod = this._constants.activity_period;
|
|
103
|
-
obj.bootstrapHash = {
|
|
78
|
+
obj.bootstrapHash = {
|
|
79
|
+
SHA256: Array.from(utils.fromHexString(this._constants.bootstrap_hash)),
|
|
80
|
+
};
|
|
104
81
|
obj.bootstrappingCommittee = this._constants.bootstrapping_committee;
|
|
105
82
|
obj.checkpointZeroTimestamp = this._constants.checkpoint_zero_timestamp;
|
|
106
83
|
obj.checkpointsPeriod = this._constants.checkpoints_period;
|
|
107
84
|
obj.collateralAge = this._constants.collateral_age;
|
|
108
85
|
obj.collateralMinimum = this._constants.collateral_minimum;
|
|
109
|
-
obj.epochsWithMinimumDifficulty =
|
|
86
|
+
obj.epochsWithMinimumDifficulty =
|
|
87
|
+
this._constants.epochs_with_minimum_difficulty;
|
|
110
88
|
obj.extraRounds = this._constants.extra_rounds;
|
|
111
|
-
obj.genesisHash = {
|
|
89
|
+
obj.genesisHash = {
|
|
90
|
+
SHA256: Array.from(utils.fromHexString(this._constants.genesis_hash)),
|
|
91
|
+
};
|
|
112
92
|
obj.halvingPeriod = this._constants.halving_period;
|
|
113
93
|
obj.initialBlockReward = this._constants.initial_block_reward;
|
|
114
94
|
obj.maxDrWeight = this._constants.max_dr_weight;
|
|
@@ -117,20 +97,22 @@ class JsonRpcProvider {
|
|
|
117
97
|
obj.minimumDifficulty = this._constants.minimum_difficulty;
|
|
118
98
|
obj.miningBackupFactor = this._constants.mining_backup_factor;
|
|
119
99
|
obj.miningReplicationFactor = this._constants.mining_replication_factor;
|
|
120
|
-
obj.reputationExpireAlphaDiff =
|
|
100
|
+
obj.reputationExpireAlphaDiff =
|
|
101
|
+
this._constants.reputation_expire_alpha_diff;
|
|
121
102
|
obj.reputationIssuance = this._constants.reputation_issuance;
|
|
122
103
|
obj.reputationIssuanceStop = this._constants.reputation_issuance_stop;
|
|
123
|
-
obj.reputationPenalizationFactor =
|
|
124
|
-
|
|
125
|
-
obj.
|
|
104
|
+
obj.reputationPenalizationFactor =
|
|
105
|
+
this._constants.reputation_penalization_factor;
|
|
106
|
+
obj.superblockCommitteeDecreasingPeriod =
|
|
107
|
+
this._constants.superblock_committee_decreasing_period;
|
|
108
|
+
obj.superblockCommitteeDecreasingStep =
|
|
109
|
+
this._constants.superblock_committee_decreasing_step;
|
|
126
110
|
obj.superblockPeriod = this._constants.superblock_period;
|
|
127
|
-
obj.superblockSigningCommitteeSize =
|
|
128
|
-
|
|
111
|
+
obj.superblockSigningCommitteeSize =
|
|
112
|
+
this._constants.superblock_signing_committee_size;
|
|
129
113
|
const message = protoBuf.fromObject(obj);
|
|
130
|
-
// console.log(message)
|
|
131
114
|
const buffer = protoBuf.encode(message).finish();
|
|
132
115
|
const hash = utils.toHexString(utils.sha256(buffer));
|
|
133
|
-
// console.log(hash)
|
|
134
116
|
const hex = hash.substring(0, 4);
|
|
135
117
|
return parseInt(hex, 16);
|
|
136
118
|
}
|
|
@@ -141,16 +123,17 @@ class JsonRpcProvider {
|
|
|
141
123
|
}
|
|
142
124
|
async callApiMethod(method, params) {
|
|
143
125
|
const url = this.nextURL();
|
|
144
|
-
return
|
|
126
|
+
return axios
|
|
145
127
|
.post(url, {
|
|
146
|
-
jsonrpc:
|
|
147
|
-
id:
|
|
128
|
+
jsonrpc: "2.0",
|
|
129
|
+
id: Date.now(),
|
|
148
130
|
method,
|
|
149
131
|
params,
|
|
150
132
|
}, {
|
|
151
133
|
headers: this._headers,
|
|
152
|
-
transformResponse:
|
|
153
|
-
})
|
|
134
|
+
transformResponse: (response) => jsonBig().parse(response),
|
|
135
|
+
})
|
|
136
|
+
.then((response) => {
|
|
154
137
|
if (response?.error || response?.data?.error) {
|
|
155
138
|
throw new JsonRpcProviderError(method, params, response?.error || response?.data?.error);
|
|
156
139
|
}
|
|
@@ -162,17 +145,18 @@ class JsonRpcProvider {
|
|
|
162
145
|
/**
|
|
163
146
|
* Get the list of block hashes within given range, as known by the provider.
|
|
164
147
|
* @param {number} since - First epoch for which to return block hashes. If negative, return block hashes from the last n epochs.
|
|
165
|
-
|
|
148
|
+
* @param {number} limit - Number of block hashes to return. If negative, return the last n block hashes from this epoch range.
|
|
166
149
|
*/
|
|
167
150
|
async blocks(since = -1, limit = 1) {
|
|
168
|
-
return this.callApiMethod(
|
|
151
|
+
return this.callApiMethod(Methods.GetBlockChain, [
|
|
152
|
+
since,
|
|
153
|
+
limit,
|
|
154
|
+
]);
|
|
169
155
|
}
|
|
170
156
|
/// Get consensus constants used by the node
|
|
171
157
|
async constants() {
|
|
172
158
|
if (!this._constants) {
|
|
173
|
-
return this
|
|
174
|
-
.callApiMethod(types_2.Methods.GetConsensusConstants)
|
|
175
|
-
.then((constants) => {
|
|
159
|
+
return this.callApiMethod(Methods.GetConsensusConstants).then((constants) => {
|
|
176
160
|
this._constants = constants;
|
|
177
161
|
return constants;
|
|
178
162
|
});
|
|
@@ -183,12 +167,11 @@ class JsonRpcProvider {
|
|
|
183
167
|
}
|
|
184
168
|
/// Get limited list of currently top holders, as known by the provider.
|
|
185
169
|
async holders(minBalance = 0, maxBalance) {
|
|
186
|
-
return this
|
|
187
|
-
.callApiMethod(types_2.Methods.GetBalance2, {
|
|
170
|
+
return this.callApiMethod(Methods.GetBalance2, {
|
|
188
171
|
all: {
|
|
189
172
|
minBalance,
|
|
190
|
-
...maxBalance ? { maxBalance } : {}
|
|
191
|
-
}
|
|
173
|
+
...(maxBalance ? { maxBalance } : {}),
|
|
174
|
+
},
|
|
192
175
|
}).then((balances) => {
|
|
193
176
|
const reverseCompare = (a, b) => {
|
|
194
177
|
const a_tot = a.locked + a.unlocked + a.staked;
|
|
@@ -200,36 +183,34 @@ class JsonRpcProvider {
|
|
|
200
183
|
else
|
|
201
184
|
return 0;
|
|
202
185
|
};
|
|
203
|
-
return Object.fromEntries(Object.entries(balances)
|
|
204
|
-
.sort((a, b) => reverseCompare(a[1], b[1])));
|
|
186
|
+
return Object.fromEntries(Object.entries(balances).sort((a, b) => reverseCompare(a[1], b[1])));
|
|
205
187
|
});
|
|
206
188
|
}
|
|
207
189
|
/// Get list of known peers
|
|
208
190
|
async knownPeers() {
|
|
209
|
-
return this.callApiMethod(
|
|
191
|
+
return this.callApiMethod(Methods.KnownPeers);
|
|
210
192
|
}
|
|
211
193
|
/// Get all the pending transactions
|
|
212
194
|
async mempool() {
|
|
213
|
-
return this.callApiMethod(
|
|
195
|
+
return this.callApiMethod(Methods.GetMempool);
|
|
214
196
|
}
|
|
215
197
|
/// Get priority and time-to-block estimations for different priority tiers.
|
|
216
198
|
async priorities() {
|
|
217
|
-
return this.callApiMethod(
|
|
199
|
+
return this.callApiMethod(Methods.Priority);
|
|
218
200
|
}
|
|
219
201
|
/// Get information about protocol versions and which version is currently being enforced.
|
|
220
202
|
async protocolInfo() {
|
|
221
|
-
return this.callApiMethod(
|
|
203
|
+
return this.callApiMethod(Methods.Protocol);
|
|
222
204
|
}
|
|
223
205
|
/// Get a full list of staking powers ordered by rank
|
|
224
206
|
async powers(query) {
|
|
225
|
-
return this.callApiMethod(
|
|
207
|
+
return this.callApiMethod(Methods.QueryStakingPowers, query);
|
|
226
208
|
}
|
|
227
209
|
/// Get a full list of current stake entries Query the amount of nanowits staked by an address.
|
|
228
210
|
async stakes(query) {
|
|
229
|
-
return this
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
if (err?.error?.message && err.error.message.indexOf("not registered") > -1) {
|
|
211
|
+
return this.callApiMethod(Methods.QueryStakes, query).catch((err) => {
|
|
212
|
+
if (err?.error?.message &&
|
|
213
|
+
err.error.message.indexOf("not registered") > -1) {
|
|
233
214
|
return [];
|
|
234
215
|
}
|
|
235
216
|
else {
|
|
@@ -239,31 +220,32 @@ class JsonRpcProvider {
|
|
|
239
220
|
}
|
|
240
221
|
/// Get node status
|
|
241
222
|
async syncStatus() {
|
|
242
|
-
return this.callApiMethod(
|
|
223
|
+
return this.callApiMethod(Methods.SyncStatus);
|
|
243
224
|
}
|
|
244
225
|
async wips() {
|
|
245
|
-
return this.callApiMethod(
|
|
226
|
+
return this.callApiMethod(Methods.SignalingInfo);
|
|
246
227
|
}
|
|
247
228
|
async witnesses(_since) {
|
|
248
229
|
// todo: witnesses estimation should instead be computed in proportion to
|
|
249
230
|
// ratio of validators that have honestly witnessed data requests
|
|
250
231
|
// vs validators that have honestly witnessed data requests and
|
|
251
|
-
// never revealed "i passed" out of majority,
|
|
232
|
+
// never revealed "i passed" out of majority,
|
|
252
233
|
// within the specified range of epochs.
|
|
253
234
|
let census = 0;
|
|
254
|
-
return this
|
|
255
|
-
.
|
|
256
|
-
.then(records => {
|
|
235
|
+
return this.stakes({ params: { distinct: true } }) // todo: implement `count` flag on IJsonRpcProvider.stakes()
|
|
236
|
+
.then((records) => {
|
|
257
237
|
census = records.length;
|
|
258
238
|
return this.blocks(-16, 16); // todo: blocks() should return epoch, hash and validator pkh for each block
|
|
259
239
|
})
|
|
260
|
-
.then(records => {
|
|
261
|
-
return Promise.all(records.map(record => this.getBlock(record[1])));
|
|
240
|
+
.then((records) => {
|
|
241
|
+
return Promise.all(records.map((record) => this.getBlock(record[1])));
|
|
262
242
|
})
|
|
263
|
-
.then(blocks => {
|
|
243
|
+
.then((blocks) => {
|
|
264
244
|
const validators = [];
|
|
265
|
-
blocks.map(block => {
|
|
266
|
-
const pkh =
|
|
245
|
+
blocks.map((block) => {
|
|
246
|
+
const pkh = PublicKey.fromProtobuf(block.block_sig.public_key)
|
|
247
|
+
.hash()
|
|
248
|
+
.toBech32(this.network);
|
|
267
249
|
if (!validators.includes(pkh))
|
|
268
250
|
validators.push(pkh);
|
|
269
251
|
});
|
|
@@ -273,9 +255,7 @@ class JsonRpcProvider {
|
|
|
273
255
|
/// ---------------------------------------------------------------------------------------------------------------
|
|
274
256
|
/// Get balance
|
|
275
257
|
async getBalance(pkh) {
|
|
276
|
-
return this
|
|
277
|
-
.callApiMethod(types_2.Methods.GetBalance2, { pkh })
|
|
278
|
-
.then((balance) => ({
|
|
258
|
+
return this.callApiMethod(Methods.GetBalance2, { pkh }).then((balance) => ({
|
|
279
259
|
locked: BigInt(balance.locked),
|
|
280
260
|
staked: BigInt(balance.staked),
|
|
281
261
|
unlocked: BigInt(balance.unlocked),
|
|
@@ -287,21 +267,28 @@ class JsonRpcProvider {
|
|
|
287
267
|
* @param {boolean} showTransactionHash - Whether to include an extra field containing array of transaction hashes.
|
|
288
268
|
*/
|
|
289
269
|
async getBlock(blockHash, showTransactionHash = false) {
|
|
290
|
-
return this.callApiMethod(
|
|
270
|
+
return this.callApiMethod(Methods.GetBlock, [
|
|
271
|
+
blockHash,
|
|
272
|
+
showTransactionHash,
|
|
273
|
+
]);
|
|
291
274
|
}
|
|
292
275
|
async getDataRequest(drTxHash, mode, force = false) {
|
|
293
|
-
return this.callApiMethod(
|
|
276
|
+
return this.callApiMethod(Methods.GetDataRequest, {
|
|
294
277
|
hash: drTxHash,
|
|
295
278
|
mode: mode || "full",
|
|
296
|
-
force
|
|
279
|
+
force,
|
|
297
280
|
});
|
|
298
281
|
}
|
|
299
282
|
/// Get the blocks that pertain to the superblock index
|
|
300
283
|
async getSuperblock(epoch) {
|
|
301
|
-
return this.callApiMethod(
|
|
284
|
+
return this.callApiMethod(Methods.GetSuperblock, {
|
|
285
|
+
block_epoch: epoch,
|
|
286
|
+
});
|
|
302
287
|
}
|
|
303
288
|
async getTransaction(txHash) {
|
|
304
|
-
return this.callApiMethod(
|
|
289
|
+
return this.callApiMethod(Methods.GetTransaction, [
|
|
290
|
+
txHash,
|
|
291
|
+
]);
|
|
305
292
|
}
|
|
306
293
|
async getTransactionReceipt(txHash) {
|
|
307
294
|
// todo: fetch/update receipt from provider, if not cached
|
|
@@ -312,39 +299,38 @@ class JsonRpcProvider {
|
|
|
312
299
|
if (filter) {
|
|
313
300
|
filter.minValue = filter?.minValue?.toString() ?? "0";
|
|
314
301
|
}
|
|
315
|
-
return this
|
|
316
|
-
|
|
317
|
-
|
|
302
|
+
return this.callApiMethod(Methods.GetUtxoInfo, [
|
|
303
|
+
pkh,
|
|
304
|
+
...(filter ? [filter] : []),
|
|
305
|
+
]).then((result) => result.utxos.map((utxo) => ({
|
|
318
306
|
...utxo,
|
|
319
|
-
value: BigInt(utxo.value)
|
|
307
|
+
value: BigInt(utxo.value),
|
|
320
308
|
})));
|
|
321
309
|
}
|
|
322
310
|
async getValueTransfer(txHash, mode, force = false) {
|
|
323
|
-
return this.callApiMethod(
|
|
311
|
+
return this.callApiMethod(Methods.GetValueTransfer, {
|
|
324
312
|
hash: txHash,
|
|
325
313
|
mode: mode,
|
|
326
|
-
force
|
|
314
|
+
force,
|
|
327
315
|
});
|
|
328
316
|
}
|
|
329
317
|
async searchDataRequests(radHash, options) {
|
|
330
|
-
return this
|
|
331
|
-
.callApiMethod(types_2.Methods.SearchDataRequests, {
|
|
318
|
+
return this.callApiMethod(Methods.SearchDataRequests, {
|
|
332
319
|
radHash,
|
|
333
|
-
limit: options?.limit,
|
|
334
|
-
offset: options?.offset,
|
|
335
|
-
reverse: options?.reverse
|
|
336
|
-
})
|
|
337
|
-
|
|
320
|
+
limit: options?.limit || 1,
|
|
321
|
+
offset: options?.offset || 0,
|
|
322
|
+
reverse: !(options?.reverse === false),
|
|
323
|
+
}).then(async (entries) => Promise.all(entries.map((entry) => {
|
|
324
|
+
return this.getDataRequest(entry[1], options?.mode || "ethereal", true);
|
|
325
|
+
})));
|
|
338
326
|
}
|
|
339
327
|
/// ---------------------------------------------------------------------------------------------------------------
|
|
340
328
|
async sendRawTransaction(transaction) {
|
|
341
|
-
return this.callApiMethod(
|
|
329
|
+
return this.callApiMethod(Methods.Inventory, { transaction });
|
|
342
330
|
}
|
|
343
331
|
/// Get supply info
|
|
344
332
|
async supplyInfo() {
|
|
345
|
-
return this.callApiMethod(
|
|
333
|
+
return this.callApiMethod(Methods.GetSupplyInfo);
|
|
346
334
|
}
|
|
347
335
|
}
|
|
348
|
-
exports.JsonRpcProvider = JsonRpcProvider;
|
|
349
|
-
JsonRpcProvider.receipts = {};
|
|
350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JwYy9wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBc0Q7QUFDdEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3ZDLDJDQUE4QztBQUM5QyxNQUFNLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFBO0FBQ2xGLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtBQUUzRCwyQ0FBb0Y7QUFFcEYsZ0RBQWlDO0FBRWpDLG1DQU9nQjtBQXNDaEIsTUFBYSxvQkFBcUIsU0FBUSxLQUFLO0lBSTNDLFlBQVksTUFBYyxFQUFFLE1BQWEsRUFBRSxLQUFXO1FBQ2xELEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3hFLE9BQU8sS0FBSyxFQUFFLEtBQUssQ0FBQTtRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtJQUN4QixDQUFDO0NBQ0o7QUFYRCxvREFXQztBQUVELE1BQWEsZUFBZTtJQVN4Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBWTtRQUM3QixPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksMEJBQTBCLENBQUMsQ0FBQTtJQUM1RyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBVztRQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN6QyxPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVELFlBQVksR0FBWTtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtRQUNuQixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDZixNQUFNLENBQUMsTUFBTSxFQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQ2xFLE1BQU0sS0FBSyxDQUFDLGtEQUFrRCxNQUFNLEVBQUUsQ0FBQyxDQUFBO2dCQUMzRSxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksMEJBQTBCLENBQUMsQ0FBQTtRQUMxRixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLG9CQUFZLENBQUM7WUFDN0IsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFDOUYsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLFNBQVMsQ0FBQTtRQUNwQixDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsU0FBUztRQUNoQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUE7WUFDbkIsR0FBRyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUNyRCxHQUFHLENBQUMsYUFBYSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUMvRixHQUFHLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQTtZQUNwRSxHQUFHLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQTtZQUN2RSxHQUFHLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQTtZQUMxRCxHQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFBO1lBQ2xELEdBQUcsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFBO1lBQzFELEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFBO1lBQ2hGLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUE7WUFDOUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDM0YsR0FBRyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQTtZQUNsRCxHQUFHLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQTtZQUM3RCxHQUFHLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFBO1lBQy9DLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUE7WUFDL0MsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixHQUFHLENBQUM7Z0JBQUUsR0FBRyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUE7WUFDdEcsR0FBRyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUE7WUFDN0QsR0FBRyxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUE7WUFDdkUsR0FBRyxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUE7WUFDNUUsR0FBRyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUE7WUFDNUQsR0FBRyxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUE7WUFDckUsR0FBRyxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUE7WUFDakYsR0FBRyxDQUFDLG1DQUFtQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsc0NBQXNDLENBQUE7WUFDaEcsR0FBRyxDQUFDLGlDQUFpQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsb0NBQW9DLENBQUE7WUFDNUYsR0FBRyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUE7WUFDeEQsR0FBRyxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUNBQWlDLENBQUE7WUFDdEYsbUJBQW1CO1lBQ25CLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDeEMsdUJBQXVCO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUE7WUFDaEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7WUFDcEQsb0JBQW9CO1lBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ2hDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM1QixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUE7SUFDcEIsQ0FBQztJQUVTLE9BQU87UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFUyxLQUFLLENBQUMsYUFBYSxDQUFJLE1BQWMsRUFBRSxNQUF5QjtRQUN0RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDMUIsT0FBTyxlQUFLO2FBQ1AsSUFBSSxDQUNELEdBQUcsRUFDSDtZQUNJLE9BQU8sRUFBRSxLQUFLO1lBQ2QsRUFBRSxFQUFFLENBQUUsSUFBSSxJQUFJLEVBQUU7WUFDaEIsTUFBTTtZQUNOLE1BQU07U0FDVCxFQUNEO1lBQ0ksT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3RCLGlCQUFpQixFQUFFLFVBQVMsUUFBUSxJQUFJLE9BQU8sT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBLENBQUMsQ0FBQztTQUM3RSxDQUVKLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDckIsSUFBSSxRQUFRLEVBQUUsS0FBSyxJQUFJLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLElBQUksUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUU3RixDQUFDOztnQkFBTSxPQUFPLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBVyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUVELG1IQUFtSDtJQUVuSDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQixDQUFDLENBQUMsRUFBRSxRQUFnQixDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBaUIsZUFBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUcsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCw0Q0FBNEM7SUFDckMsS0FBSyxDQUFDLFNBQVM7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUk7aUJBQ04sYUFBYSxDQUFxQixlQUFPLENBQUMscUJBQXFCLENBQUM7aUJBQ2hFLElBQUksQ0FBQyxDQUFDLFNBQTZCLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7Z0JBQzNCLE9BQU8sU0FBUyxDQUFBO1lBQ3BCLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUE7UUFDMUIsQ0FBQztJQUNMLENBQUM7SUFFRCx3RUFBd0U7SUFDakUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQW1CO1FBQ3BELE9BQU8sSUFBSTthQUNOLGFBQWEsQ0FBdUMsZUFBTyxDQUFDLFdBQVcsRUFBRTtZQUN0RSxHQUFHLEVBQUU7Z0JBQ0QsVUFBVTtnQkFDVixHQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUN2QztTQUNKLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUErQyxFQUFFLEVBQUU7WUFDeEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFXLEVBQUUsQ0FBVyxFQUFFLEVBQUU7Z0JBQ2hELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFBO2dCQUM5QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtnQkFDOUMsSUFBSSxLQUFLLEdBQUcsS0FBSztvQkFBRSxPQUFPLENBQUMsQ0FBQztxQkFDdkIsSUFBSSxLQUFLLEdBQUcsS0FBSztvQkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDOztvQkFDN0IsT0FBTyxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFBO1lBQ0QsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUNyQixNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztpQkFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBd0IsRUFBRSxDQUF3QixFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQWEsQ0FBQyxDQUFDLENBQ3hILENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFFRCwyQkFBMkI7SUFDcEIsS0FBSyxDQUFDLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFrQixlQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELG9DQUFvQztJQUM3QixLQUFLLENBQUMsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQVUsZUFBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCw0RUFBNEU7SUFDckUsS0FBSyxDQUFDLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFhLGVBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBRUQsMEZBQTBGO0lBQ25GLEtBQUssQ0FBQyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBZSxlQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDN0QsQ0FBQztJQUVELHFEQUFxRDtJQUM5QyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQTBCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBc0IsZUFBTyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3JGLENBQUM7SUFFRCxnR0FBZ0c7SUFDekYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFtQjtRQUNuQyxPQUFPLElBQUk7YUFDTixhQUFhLENBQW9CLGVBQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDO2FBQzVELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNULElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUUsT0FBTyxFQUFFLENBQUE7WUFDYixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxHQUFHLENBQUE7WUFDYixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDVixDQUFDO0lBRUQsbUJBQW1CO0lBQ1osS0FBSyxDQUFDLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFhLGVBQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQWdCLGVBQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFlO1FBQ2xDLHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLG9EQUFvRDtRQUNwRCw4Q0FBOEM7UUFDOUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQ2QsT0FBTyxJQUFJO2FBQ04sTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFDLENBQUMsQ0FBQyw0REFBNEQ7YUFDbEcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1osTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7WUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBLENBQUMsNEVBQTRFO1FBQzVHLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNaLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkUsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ1gsTUFBTSxVQUFVLEdBQStCLEVBQUUsQ0FBQTtZQUNqRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNmLE1BQU0sR0FBRyxHQUFHLGlCQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDNUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO29CQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUE7WUFDRixPQUFPLElBQUksQ0FBQyxHQUFHLENBQ1gsVUFBVSxDQUFDLE1BQU0sRUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUNuRSxDQUFBO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDVixDQUFDO0lBRUQsbUhBQW1IO0lBQ25ILGVBQWU7SUFDUixLQUFLLENBQUMsVUFBVSxDQUFDLEdBQXdCO1FBQzVDLE9BQU8sSUFBSTthQUNOLGFBQWEsQ0FBVyxlQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7YUFDckQsSUFBSSxDQUFDLENBQUMsT0FBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQixNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDOUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQzlCLFFBQVEsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNyQyxDQUFDLENBQUMsQ0FBQTtJQUNYLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLFFBQVEsQ0FDYixTQUFlLEVBQ2YsbUJBQW1CLEdBQUcsS0FBSztRQUcvQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQVEsZUFBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsRUFBRyxDQUFDLENBQUE7SUFDMUYsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBYyxFQUFFLElBQXlCLEVBQUUsS0FBSyxHQUFHLEtBQUs7UUFDaEYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUEwRCxlQUFPLENBQUMsY0FBYyxFQUFFO1lBQ3ZHLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLElBQUksSUFBSSxNQUFNO1lBQ3BCLEtBQUs7U0FDUixDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsdURBQXVEO0lBQ2hELEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBWTtRQUNuQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQW1CLGVBQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFZO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBb0IsZUFBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFZO1FBQzNDLDBEQUEwRDtRQUMxRCxPQUFPLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVELGFBQWE7SUFDTixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQXdCLEVBQUUsTUFBeUU7UUFDckgsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sSUFBSTthQUNOLGFBQWEsQ0FBVyxlQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDL0UsSUFBSSxDQUFDLENBQUMsTUFBZ0IsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLEdBQUcsSUFBSTtZQUNQLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUM1QixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ1osQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFZLEVBQUUsSUFBYSxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBTSxlQUFPLENBQUMsZ0JBQWdCLEVBQUU7WUFDckQsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUs7U0FDUixDQUFDLENBQUE7SUFDTixDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQixDQUMzQixPQUFhLEVBQ2IsT0FLSDtRQUNHLE9BQU8sSUFBSTthQUNOLGFBQWEsQ0FBZSxlQUFPLENBQUMsa0JBQWtCLEVBQUU7WUFDckQsT0FBTztZQUNQLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSztZQUNyQixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU07WUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPO1NBQzVCLENBQUM7YUFDRCxJQUFJLENBQUMsS0FBSyxFQUFDLE9BQU8sRUFBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDbEcsQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUVELG1IQUFtSDtJQUM1RyxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBZ0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFVLGVBQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRCxtQkFBbUI7SUFDWixLQUFLLENBQUMsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQWEsZUFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7O0FBdFZMLDBDQXVWQztBQW5WaUIsd0JBQVEsR0FBcUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmYXVsdCBhcyBheGlvcywgQXhpb3NIZWFkZXJzIH0gZnJvbSBcImF4aW9zXCJcclxuY29uc3QganNvbkJpZyA9IHJlcXVpcmUoJ2pzb24tYmlnaW50Jyk7XHJcbmltcG9ydCB7IFJvb3QgYXMgUHJvdG9Sb290IH0gZnJvbSBcInByb3RvYnVmanNcIlxyXG5jb25zdCBwcm90b1Jvb3QgPSBQcm90b1Jvb3QuZnJvbUpTT04ocmVxdWlyZShcIi4uLy4uLy4uL3dpdG5ldC93aXRuZXQucHJvdG8uanNvblwiKSkgXHJcbmNvbnN0IHByb3RvQnVmID0gcHJvdG9Sb290Lmxvb2t1cFR5cGUoXCJDb25zZW5zdXNDb25zdGFudHNcIilcclxuXHJcbmltcG9ydCB7IFB1YmxpY0tleSwgUHVibGljS2V5SGFzaFN0cmluZywgVHJhbnNhY3Rpb25SZWNlaXB0IH0gZnJvbSBcIi4uL2NyeXB0by90eXBlc1wiXHJcbmltcG9ydCB7IEVwb2NoLCBIYXNoLCBOZXR3b3JrLCBVdHhvTWV0YWRhdGEgfSBmcm9tIFwiLi4vdHlwZXNcIlxyXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuaW1wb3J0IHtcclxuICAgIEJhbGFuY2UsIEJhbGFuY2UyLCBCbG9jaywgQ29uc2Vuc3VzQ29uc3RhbnRzLCBcclxuICAgIEdldERhdGFSZXF1ZXN0RnVsbFJlcG9ydCwgR2V0RGF0YVJlcXVlc3RFdGhlcmVhbFJlcG9ydCwgR2V0RGF0YVJlcXVlc3RNb2RlLFxyXG4gICAgTWVtcG9vbCwgTWV0aG9kcywgUGVlckFkZHIsIFByaW9yaXRpZXMsIFByb3RvY29sSW5mbywgXHJcbiAgICBRdWVyeVN0YWtlcywgUXVlcnlTdGFraW5nUG93ZXJzLFxyXG4gICAgVHJhbnNhY3Rpb25SZXBvcnQsIFNpZ25hbGluZ0luZm8sIFN0YWtlRW50cnksIFN0YWtpbmdQb3dlciwgXHJcbiAgICBTdXBlcmJsb2NrUmVwb3J0LCBTdXBwbHlJbmZvLCBTeW5jU3RhdHVzLCBVdHhvSW5mbyxcclxufSBmcm9tIFwiLi90eXBlc1wiXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElKc29uUnBjUHJvdmlkZXIge1xyXG4gICAgbmV0d29yaz86IE5ldHdvcms7XHJcbiAgICBuZXR3b3JrSWQ/OiBudW1iZXI7XHJcbiAgICBcclxuICAgIGJsb2NrcyhzaW5jZTogRXBvY2gsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPEFycmF5PFtudW1iZXIsIEhhc2gvKiwgUHVibGljS2V5SGFzaFN0cmluZyovXT4+O1xyXG4gICAgY29uc3RhbnRzKCk6IFByb21pc2U8Q29uc2Vuc3VzQ29uc3RhbnRzPjtcclxuICAgIGhvbGRlcnMobGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPFJlY29yZDxQdWJsaWNLZXlIYXNoU3RyaW5nLCBCYWxhbmNlMj4+IFxyXG4gICAgbWVtcG9vbCgpOiBQcm9taXNlPE1lbXBvb2w+O1xyXG4gICAgcG93ZXJzKHBhcmFtcz86IFF1ZXJ5U3Rha2luZ1Bvd2Vycyk6IFByb21pc2U8QXJyYXk8U3Rha2luZ1Bvd2VyPj47XHJcbiAgICBwcmlvcml0aWVzKCk6IFByb21pc2U8UHJpb3JpdGllcz47XHJcbiAgICBwcm90b2NvbEluZm8oKTogUHJvbWlzZTxQcm90b2NvbEluZm8+O1xyXG4gICAgc3Rha2VzKHBhcmFtczogUXVlcnlTdGFrZXMpOiBQcm9taXNlPEFycmF5PFN0YWtlRW50cnk+PjsgXHJcbiAgICBzdXBwbHlJbmZvKCk6IFByb21pc2U8U3VwcGx5SW5mbz47XHJcbiAgICBzeW5jU3RhdHVzKCk6IFByb21pc2U8YW55PjtcclxuICAgIHdpcHMoKTogUHJvbWlzZTxTaWduYWxpbmdJbmZvPjtcclxuICAgIHdpdG5lc3NlcygpOiBQcm9taXNlPG51bWJlcj47XHJcblxyXG4gICAgZ2V0QmFsYW5jZShwa2g6IFB1YmxpY0tleUhhc2hTdHJpbmcpOiBQcm9taXNlPEJhbGFuY2UyPjtcclxuICAgIGdldEJsb2NrKGJsb2NrSGFzaDogSGFzaCwgc2hvd1RyYW5zYWN0aW9uSGFzaGVzPzogYm9vbGVhbik6IFByb21pc2U8QmxvY2s+O1xyXG4gICAgZ2V0RGF0YVJlcXVlc3QoZHJUeEhhc2g6IEhhc2gsIG1vZGU/OiBHZXREYXRhUmVxdWVzdE1vZGUpOiBQcm9taXNlPEdldERhdGFSZXF1ZXN0RnVsbFJlcG9ydCB8IEdldERhdGFSZXF1ZXN0RXRoZXJlYWxSZXBvcnQ+O1xyXG4gICAgZ2V0U3VwZXJibG9jayhlcG9jaDogRXBvY2gpOiBQcm9taXNlPFN1cGVyYmxvY2tSZXBvcnQ+O1xyXG4gICAgZ2V0VHJhbnNhY3Rpb24odHhIYXNoOiBIYXNoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlcG9ydD47XHJcbiAgICBnZXRUcmFuc2FjdGlvblJlY2VpcHQodHhIYXNoOiBIYXNoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlY2VpcHQ+O1xyXG4gICAgZ2V0VXR4b3MocGtoOiBQdWJsaWNLZXlIYXNoU3RyaW5nLCBmaWx0ZXI/OiB7IG1pblZhbHVlPzogYmlnaW50LCBzaWduZXI/OiBQdWJsaWNLZXlIYXNoU3RyaW5nIH0pOiBQcm9taXNlPEFycmF5PFV0eG9NZXRhZGF0YT4+O1xyXG4gICAgZ2V0VmFsdWVUcmFuc2Zlcih0eEhhc2g6IEhhc2gsIG1vZGU/OiBzdHJpbmcpOiBQcm9taXNlPGFueT47XHJcblxyXG4gICAgc2VhcmNoRGF0YVJlcXVlc3RzKHJhZEhhc2g6IEhhc2gsIG9wdGlvbnM/OiB7IFxyXG4gICAgICAgIGxpbWl0PzogbnVtYmVyLCBcclxuICAgICAgICBvZmZzZXQ/OiBudW1iZXIsIFxyXG4gICAgICAgIG1vZGU/OiBHZXREYXRhUmVxdWVzdE1vZGUsIFxyXG4gICAgICAgIHJldmVyc2U/OiBib29sZWFuIFxyXG4gICAgfSk6IFByb21pc2U8QXJyYXk8R2V0RGF0YVJlcXVlc3RGdWxsUmVwb3J0IHwgR2V0RGF0YVJlcXVlc3RFdGhlcmVhbFJlcG9ydD4+O1xyXG4gICAgICAgIFxyXG4gICAgc2VuZFJhd1RyYW5zYWN0aW9uKHR4OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSnNvblJwY1Byb3ZpZGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICByZWFkb25seSBlcnJvcj86IGFueTtcclxuICAgIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgcGFyYW1zOiBhbnlbXTtcclxuICAgIGNvbnN0cnVjdG9yKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IGFueVtdLCBlcnJvcj86IGFueSkge1xyXG4gICAgICAgIHN1cGVyKGAke21ldGhvZH0oJHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfSk6ICR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfSlgKVxyXG4gICAgICAgIGRlbGV0ZSBlcnJvcj8uc3RhY2tcclxuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3JcclxuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZFxyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBKc29uUnBjUHJvdmlkZXIgaW1wbGVtZW50cyBJSnNvblJwY1Byb3ZpZGVyIHtcclxuICAgIFxyXG4gICAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50czogc3RyaW5nW11cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlY2VpcHRzOiBSZWNvcmQ8SGFzaCwgVHJhbnNhY3Rpb25SZWNlaXB0PiA9IHt9O1xyXG5cclxuICAgIHByb3RlY3RlZCBfY29uc3RhbnRzPzogQ29uc2Vuc3VzQ29uc3RhbnRzXHJcbiAgICBwcm90ZWN0ZWQgX2hlYWRlcnM6IEF4aW9zSGVhZGVycztcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBKc29uUnBjUHJvdmlkZXIgb2JqZWN0IGNvbm5lY3RlZCB0byB0aGUgZGVmYXVsdCBXaXQvUlBDIGVuZHBvaW50LlxyXG4gICAgICogRGVmYXVsdHMgdG8gaHR0cHM6Ly9ycGMtMDEud2l0bmV0LmlvIGlmIG5vIFdJVE5FVF9TREtfUFJPVklERVJfVVJMIGVudmFyIGlzIHNldHRsZWRcclxuICAgICAqIG9uIHRoZSBlbnZpcm9ubWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFzeW5jIGZyb21FbnYodXJsPzogc3RyaW5nKTogUHJvbWlzZTxKc29uUnBjUHJvdmlkZXI+IHtcclxuICAgICAgICByZXR1cm4gSnNvblJwY1Byb3ZpZGVyLmZyb21VUkwodXJsIHx8IHByb2Nlc3MuZW52LldJVE5FVF9TREtfUFJPVklERVJfVVJMIHx8IFwiaHR0cHM6Ly9ycGMtMDEud2l0bmV0LmlvXCIpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgSnNvblJwY1Byb3ZpZGVyIG9iamVjdCBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBXaXQvUlBDIGVuZHBvaW50LlxyXG4gICAgICogQHBhcmFtIHVybCBXaXQvUlBDIGVuZHBvaW50IFVSTC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFzeW5jIGZyb21VUkwodXJsOiBzdHJpbmcpOiBQcm9taXNlPEpzb25ScGNQcm92aWRlcj4ge1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IEpzb25ScGNQcm92aWRlcih1cmwpXHJcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmNvbnN0YW50cygpLnRoZW4oKCkgPT4gcHJvdmlkZXIpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IodXJsPzogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5lbmRwb2ludHMgPSBbXVxyXG4gICAgICAgIGlmICh1cmwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCB1cmxzID0gdXJsLnJlcGxhY2VBbGwoJywnLCAnOycpLnNwbGl0KCc7JylcclxuICAgICAgICAgICAgdXJscy5mb3JFYWNoKHVybCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBbc2NoZW1hLCBdID0gdXRpbHMucGFyc2VVUkwodXJsKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEuc3RhcnRzV2l0aChcImh0dHA6Ly9cIikgJiYgIXNjaGVtYS5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV2l0bmV0Lkpzb25ScGNQcm92aWRlcjogdW5zdXBwb3J0ZWQgVVJMIHNjaGVtYSAke3NjaGVtYX1gKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmVuZHBvaW50cyA9IHVybHNcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmVuZHBvaW50cy5wdXNoKHByb2Nlc3MuZW52LldJVE5FVF9TREtfUFJPVklERVJfVVJMIHx8IFwiaHR0cHM6Ly9ycGMtMDEud2l0bmV0LmlvXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2hlYWRlcnMgPSBuZXcgQXhpb3NIZWFkZXJzKHsgXHJcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBuZXR3b3JrKCk6IE5ldHdvcmsgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb25zdGFudHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0YW50cy5ib290c3RyYXBwaW5nX2NvbW1pdHRlZVswXS5zdGFydHNXaXRoKCd3aXQnKSA/IFwibWFpbm5ldFwiOiBcInRlc3RuZXRcIlxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBuZXR3b3JrSWQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fY29uc3RhbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iajogYW55ID0ge31cclxuICAgICAgICAgICAgb2JqLmFjdGl2aXR5UGVyaW9kID0gdGhpcy5fY29uc3RhbnRzLmFjdGl2aXR5X3BlcmlvZDtcclxuICAgICAgICAgICAgb2JqLmJvb3RzdHJhcEhhc2ggPSB7IFNIQTI1NjogQXJyYXkuZnJvbSh1dGlscy5mcm9tSGV4U3RyaW5nKHRoaXMuX2NvbnN0YW50cy5ib290c3RyYXBfaGFzaCkpIH1cclxuICAgICAgICAgICAgb2JqLmJvb3RzdHJhcHBpbmdDb21taXR0ZWUgPSB0aGlzLl9jb25zdGFudHMuYm9vdHN0cmFwcGluZ19jb21taXR0ZWVcclxuICAgICAgICAgICAgb2JqLmNoZWNrcG9pbnRaZXJvVGltZXN0YW1wID0gdGhpcy5fY29uc3RhbnRzLmNoZWNrcG9pbnRfemVyb190aW1lc3RhbXBcclxuICAgICAgICAgICAgb2JqLmNoZWNrcG9pbnRzUGVyaW9kID0gdGhpcy5fY29uc3RhbnRzLmNoZWNrcG9pbnRzX3BlcmlvZFxyXG4gICAgICAgICAgICBvYmouY29sbGF0ZXJhbEFnZSA9IHRoaXMuX2NvbnN0YW50cy5jb2xsYXRlcmFsX2FnZVxyXG4gICAgICAgICAgICBvYmouY29sbGF0ZXJhbE1pbmltdW0gPSB0aGlzLl9jb25zdGFudHMuY29sbGF0ZXJhbF9taW5pbXVtXHJcbiAgICAgICAgICAgIG9iai5lcG9jaHNXaXRoTWluaW11bURpZmZpY3VsdHkgPSB0aGlzLl9jb25zdGFudHMuZXBvY2hzX3dpdGhfbWluaW11bV9kaWZmaWN1bHR5XHJcbiAgICAgICAgICAgIG9iai5leHRyYVJvdW5kcyA9IHRoaXMuX2NvbnN0YW50cy5leHRyYV9yb3VuZHNcclxuICAgICAgICAgICAgb2JqLmdlbmVzaXNIYXNoID0geyBTSEEyNTY6IEFycmF5LmZyb20odXRpbHMuZnJvbUhleFN0cmluZyh0aGlzLl9jb25zdGFudHMuZ2VuZXNpc19oYXNoKSkgfVxyXG4gICAgICAgICAgICBvYmouaGFsdmluZ1BlcmlvZCA9IHRoaXMuX2NvbnN0YW50cy5oYWx2aW5nX3BlcmlvZFxyXG4gICAgICAgICAgICBvYmouaW5pdGlhbEJsb2NrUmV3YXJkID0gdGhpcy5fY29uc3RhbnRzLmluaXRpYWxfYmxvY2tfcmV3YXJkXHJcbiAgICAgICAgICAgIG9iai5tYXhEcldlaWdodCA9IHRoaXMuX2NvbnN0YW50cy5tYXhfZHJfd2VpZ2h0XHJcbiAgICAgICAgICAgIG9iai5tYXhWdFdlaWdodCA9IHRoaXMuX2NvbnN0YW50cy5tYXhfdnRfd2VpZ2h0XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25zdGFudHMubWluaW11bV9kaWZmaWN1bHR5ID4gMCkgb2JqLm1pbmltdW1EaWZmaWN1bHR5ID0gdGhpcy5fY29uc3RhbnRzLm1pbmltdW1fZGlmZmljdWx0eVxyXG4gICAgICAgICAgICBvYmoubWluaW5nQmFja3VwRmFjdG9yID0gdGhpcy5fY29uc3RhbnRzLm1pbmluZ19iYWNrdXBfZmFjdG9yXHJcbiAgICAgICAgICAgIG9iai5taW5pbmdSZXBsaWNhdGlvbkZhY3RvciA9IHRoaXMuX2NvbnN0YW50cy5taW5pbmdfcmVwbGljYXRpb25fZmFjdG9yXHJcbiAgICAgICAgICAgIG9iai5yZXB1dGF0aW9uRXhwaXJlQWxwaGFEaWZmID0gdGhpcy5fY29uc3RhbnRzLnJlcHV0YXRpb25fZXhwaXJlX2FscGhhX2RpZmZcclxuICAgICAgICAgICAgb2JqLnJlcHV0YXRpb25Jc3N1YW5jZSA9IHRoaXMuX2NvbnN0YW50cy5yZXB1dGF0aW9uX2lzc3VhbmNlXHJcbiAgICAgICAgICAgIG9iai5yZXB1dGF0aW9uSXNzdWFuY2VTdG9wID0gdGhpcy5fY29uc3RhbnRzLnJlcHV0YXRpb25faXNzdWFuY2Vfc3RvcFxyXG4gICAgICAgICAgICBvYmoucmVwdXRhdGlvblBlbmFsaXphdGlvbkZhY3RvciA9IHRoaXMuX2NvbnN0YW50cy5yZXB1dGF0aW9uX3BlbmFsaXphdGlvbl9mYWN0b3JcclxuICAgICAgICAgICAgb2JqLnN1cGVyYmxvY2tDb21taXR0ZWVEZWNyZWFzaW5nUGVyaW9kID0gdGhpcy5fY29uc3RhbnRzLnN1cGVyYmxvY2tfY29tbWl0dGVlX2RlY3JlYXNpbmdfcGVyaW9kXHJcbiAgICAgICAgICAgIG9iai5zdXBlcmJsb2NrQ29tbWl0dGVlRGVjcmVhc2luZ1N0ZXAgPSB0aGlzLl9jb25zdGFudHMuc3VwZXJibG9ja19jb21taXR0ZWVfZGVjcmVhc2luZ19zdGVwXHJcbiAgICAgICAgICAgIG9iai5zdXBlcmJsb2NrUGVyaW9kID0gdGhpcy5fY29uc3RhbnRzLnN1cGVyYmxvY2tfcGVyaW9kXHJcbiAgICAgICAgICAgIG9iai5zdXBlcmJsb2NrU2lnbmluZ0NvbW1pdHRlZVNpemUgPSB0aGlzLl9jb25zdGFudHMuc3VwZXJibG9ja19zaWduaW5nX2NvbW1pdHRlZV9zaXplXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG9iailcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHByb3RvQnVmLmZyb21PYmplY3Qob2JqKVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhtZXNzYWdlKVxyXG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBwcm90b0J1Zi5lbmNvZGUobWVzc2FnZSkuZmluaXNoKClcclxuICAgICAgICAgICAgY29uc3QgaGFzaCA9IHV0aWxzLnRvSGV4U3RyaW5nKHV0aWxzLnNoYTI1NihidWZmZXIpKSBcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaGFzaClcclxuICAgICAgICAgICAgY29uc3QgaGV4ID0gaGFzaC5zdWJzdHJpbmcoMCwgNClcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGhleCwgMTYpXHJcbiAgICAgICAgfSBcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBuZXh0VVJMKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kcG9pbnRzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuZW5kcG9pbnRzLmxlbmd0aCldXHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBhc3luYyBjYWxsQXBpTWV0aG9kPFQ+KG1ldGhvZDogc3RyaW5nLCBwYXJhbXM/OiBBcnJheTxhbnk+IHwgYW55ICk6IFByb21pc2U8RXJyb3IgfCBhbnk+IHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLm5leHRVUkwoKVxyXG4gICAgICAgIHJldHVybiBheGlvc1xyXG4gICAgICAgICAgICAucG9zdChcclxuICAgICAgICAgICAgICAgIHVybCxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcclxuICAgICAgICAgICAgICAgICAgICBpZDogKyBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuX2hlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7IHJldHVybiBqc29uQmlnKCkucGFyc2UocmVzcG9uc2UpIH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2U/LmVycm9yIHx8IHJlc3BvbnNlPy5kYXRhPy5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc29uUnBjUHJvdmlkZXJFcnJvcihtZXRob2QsIHBhcmFtcywgcmVzcG9uc2U/LmVycm9yIHx8IHJlc3BvbnNlPy5kYXRhPy5lcnJvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHJldHVybiByZXNwb25zZT8uZGF0YT8ucmVzdWx0IGFzIFQ7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBibG9jayBoYXNoZXMgd2l0aGluIGdpdmVuIHJhbmdlLCBhcyBrbm93biBieSB0aGUgcHJvdmlkZXIuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2luY2UgLSBGaXJzdCBlcG9jaCBmb3Igd2hpY2ggdG8gcmV0dXJuIGJsb2NrIGhhc2hlcy4gSWYgbmVnYXRpdmUsIHJldHVybiBibG9jayBoYXNoZXMgZnJvbSB0aGUgbGFzdCBuIGVwb2Nocy5cclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBOdW1iZXIgb2YgYmxvY2sgaGFzaGVzIHRvIHJldHVybi4gSWYgbmVnYXRpdmUsIHJldHVybiB0aGUgbGFzdCBuIGJsb2NrIGhhc2hlcyBmcm9tIHRoaXMgZXBvY2ggcmFuZ2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBibG9ja3Moc2luY2U6IG51bWJlciA9IC0xLCBsaW1pdDogbnVtYmVyID0gMSwpOiBQcm9taXNlPEFycmF5PFtudW1iZXIsIEhhc2hdPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8W051bWJlciwgSGFzaF0+KE1ldGhvZHMuR2V0QmxvY2tDaGFpbiwgW3NpbmNlLCBsaW1pdCwgXSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyBHZXQgY29uc2Vuc3VzIGNvbnN0YW50cyB1c2VkIGJ5IHRoZSBub2RlXHJcbiAgICBwdWJsaWMgYXN5bmMgY29uc3RhbnRzKCk6IFByb21pc2U8Q29uc2Vuc3VzQ29uc3RhbnRzPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb25zdGFudHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgICAgICAgICAgICAgIC5jYWxsQXBpTWV0aG9kPENvbnNlbnN1c0NvbnN0YW50cz4oTWV0aG9kcy5HZXRDb25zZW5zdXNDb25zdGFudHMpXHJcbiAgICAgICAgICAgICAgICAudGhlbigoY29uc3RhbnRzOiBDb25zZW5zdXNDb25zdGFudHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdGFudHMgPSBjb25zdGFudHNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RhbnRzXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb25zdGFudHNcclxuICAgICAgICB9ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8vLyBHZXQgbGltaXRlZCBsaXN0IG9mIGN1cnJlbnRseSB0b3AgaG9sZGVycywgYXMga25vd24gYnkgdGhlIHByb3ZpZGVyLlxyXG4gICAgcHVibGljIGFzeW5jIGhvbGRlcnMobWluQmFsYW5jZSA9IDAsIG1heEJhbGFuY2U/OiBudW1iZXIpOiBQcm9taXNlPFJlY29yZDxQdWJsaWNLZXlIYXNoU3RyaW5nLCBCYWxhbmNlMj4+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgICAgICAgICAuY2FsbEFwaU1ldGhvZDxSZWNvcmQ8UHVibGljS2V5SGFzaFN0cmluZywgQmFsYW5jZT4+KE1ldGhvZHMuR2V0QmFsYW5jZTIsIHtcclxuICAgICAgICAgICAgICAgIGFsbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbkJhbGFuY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uIG1heEJhbGFuY2UgPyB7IG1heEJhbGFuY2UgfSA6IHt9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLnRoZW4oKGJhbGFuY2VzOiBSZWNvcmQ8UHVibGljS2V5SGFzaFN0cmluZywgQmFsYW5jZTI+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlQ29tcGFyZSA9IChhOiBCYWxhbmNlMiwgYjogQmFsYW5jZTIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhX3RvdCA9IGEubG9ja2VkICsgYS51bmxvY2tlZCArIGEuc3Rha2VkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYl90b3QgPSBiLmxvY2tlZCArIGIudW5sb2NrZWQgKyBiLnN0YWtlZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhX3RvdCA8IGJfdG90KSByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhX3RvdCA+IGJfdG90KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoYmFsYW5jZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChhOiAoc3RyaW5nIHwgQmFsYW5jZTIpW10sIGI6IChzdHJpbmcgfCBCYWxhbmNlMilbXSkgPT4gcmV2ZXJzZUNvbXBhcmUoYVsxXSBhcyBCYWxhbmNlMiwgYlsxXSBhcyBCYWxhbmNlMikpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gR2V0IGxpc3Qgb2Yga25vd24gcGVlcnNcclxuICAgIHB1YmxpYyBhc3luYyBrbm93blBlZXJzKCk6IFByb21pc2U8QXJyYXk8UGVlckFkZHI+PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxBcnJheTxQZWVyQWRkcj4+KE1ldGhvZHMuS25vd25QZWVycyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyBHZXQgYWxsIHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9uc1xyXG4gICAgcHVibGljIGFzeW5jIG1lbXBvb2woKTogUHJvbWlzZTxNZW1wb29sPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxNZW1wb29sPihNZXRob2RzLkdldE1lbXBvb2wpO1xyXG4gICAgfSAgICBcclxuICAgIFxyXG4gICAgLy8vIEdldCBwcmlvcml0eSBhbmQgdGltZS10by1ibG9jayBlc3RpbWF0aW9ucyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHRpZXJzLlxyXG4gICAgcHVibGljIGFzeW5jIHByaW9yaXRpZXMoKTogUHJvbWlzZTxQcmlvcml0aWVzPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxQcmlvcml0aWVzPihNZXRob2RzLlByaW9yaXR5KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHByb3RvY29sIHZlcnNpb25zIGFuZCB3aGljaCB2ZXJzaW9uIGlzIGN1cnJlbnRseSBiZWluZyBlbmZvcmNlZC5cclxuICAgIHB1YmxpYyBhc3luYyBwcm90b2NvbEluZm8oKTogUHJvbWlzZTxQcm90b2NvbEluZm8+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPFByb3RvY29sSW5mbz4oTWV0aG9kcy5Qcm90b2NvbClcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8vIEdldCBhIGZ1bGwgbGlzdCBvZiBzdGFraW5nIHBvd2VycyBvcmRlcmVkIGJ5IHJhbmtcclxuICAgIHB1YmxpYyBhc3luYyBwb3dlcnMocXVlcnk/OiBRdWVyeVN0YWtpbmdQb3dlcnMpOiBQcm9taXNlPEFycmF5PFN0YWtpbmdQb3dlcj4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPEFycmF5PFN0YWtpbmdQb3dlcj4+KE1ldGhvZHMuUXVlcnlTdGFraW5nUG93ZXJzLCBxdWVyeSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8vIEdldCBhIGZ1bGwgbGlzdCBvZiBjdXJyZW50IHN0YWtlIGVudHJpZXMgIFF1ZXJ5IHRoZSBhbW91bnQgb2YgbmFub3dpdHMgc3Rha2VkIGJ5IGFuIGFkZHJlc3MuXHJcbiAgICBwdWJsaWMgYXN5bmMgc3Rha2VzKHF1ZXJ5PzogUXVlcnlTdGFrZXMpOiBQcm9taXNlPEFycmF5PFN0YWtlRW50cnk+PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgICAgICAgICAgLmNhbGxBcGlNZXRob2Q8QXJyYXk8U3Rha2VFbnRyeT4+KE1ldGhvZHMuUXVlcnlTdGFrZXMsIHF1ZXJ5KVxyXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnI/LmVycm9yPy5tZXNzYWdlICYmIGVyci5lcnJvci5tZXNzYWdlLmluZGV4T2YoXCJub3QgcmVnaXN0ZXJlZFwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVyclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gR2V0IG5vZGUgc3RhdHVzXHJcbiAgICBwdWJsaWMgYXN5bmMgc3luY1N0YXR1cygpOiBQcm9taXNlPFN5bmNTdGF0dXM+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPFN5bmNTdGF0dXM+KE1ldGhvZHMuU3luY1N0YXR1cyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBhc3luYyB3aXBzKCk6IFByb21pc2U8U2lnbmFsaW5nSW5mbz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8U2lnbmFsaW5nSW5mbz4oTWV0aG9kcy5TaWduYWxpbmdJbmZvKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyB3aXRuZXNzZXMoX3NpbmNlPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgICAgICAvLyB0b2RvOiB3aXRuZXNzZXMgZXN0aW1hdGlvbiBzaG91bGQgaW5zdGVhZCBiZSBjb21wdXRlZCBpbiBwcm9wb3J0aW9uIHRvXHJcbiAgICAgICAgLy8gICAgICAgcmF0aW8gb2YgdmFsaWRhdG9ycyB0aGF0IGhhdmUgaG9uZXN0bHkgd2l0bmVzc2VkIGRhdGEgcmVxdWVzdHNcclxuICAgICAgICAvLyAgICAgICB2cyB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBob25lc3RseSB3aXRuZXNzZWQgZGF0YSByZXF1ZXN0cyBhbmRcclxuICAgICAgICAvLyAgICAgICBuZXZlciByZXZlYWxlZCBcImkgcGFzc2VkXCIgb3V0IG9mIG1ham9yaXR5LCBcclxuICAgICAgICAvLyAgICAgICB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZSBvZiBlcG9jaHMuXHJcbiAgICAgICAgbGV0IGNlbnN1cyA9IDBcclxuICAgICAgICByZXR1cm4gdGhpcyBcclxuICAgICAgICAgICAgLnN0YWtlcyh7IHBhcmFtczogeyBkaXN0aW5jdDogdHJ1ZSB9fSkgLy8gdG9kbzogaW1wbGVtZW50IGBjb3VudGAgZmxhZyBvbiBJSnNvblJwY1Byb3ZpZGVyLnN0YWtlcygpXHJcbiAgICAgICAgICAgIC50aGVuKHJlY29yZHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2Vuc3VzID0gcmVjb3Jkcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJsb2NrcygtMTYsIDE2KSAvLyB0b2RvOiBibG9ja3MoKSBzaG91bGQgcmV0dXJuIGVwb2NoLCBoYXNoIGFuZCB2YWxpZGF0b3IgcGtoIGZvciBlYWNoIGJsb2NrXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKHJlY29yZHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlY29yZHMubWFwKHJlY29yZCA9PiB0aGlzLmdldEJsb2NrKHJlY29yZFsxXSkpKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihibG9ja3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yczogQXJyYXk8UHVibGljS2V5SGFzaFN0cmluZz4gPSBbXVxyXG4gICAgICAgICAgICAgICAgYmxvY2tzLm1hcChibG9jayA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGtoID0gUHVibGljS2V5LmZyb21Qcm90b2J1ZihibG9jay5ibG9ja19zaWcucHVibGljX2tleSkuaGFzaCgpLnRvQmVjaDMyKHRoaXMubmV0d29yaylcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRvcnMuaW5jbHVkZXMocGtoKSkgdmFsaWRhdG9ycy5wdXNoKHBraCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5uZXR3b3JrID09PSBcInRlc3RuZXRcIiA/IGNlbnN1cyAvIDIgOiBjZW5zdXMgLyA0KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLy8gR2V0IGJhbGFuY2VcclxuICAgIHB1YmxpYyBhc3luYyBnZXRCYWxhbmNlKHBraDogUHVibGljS2V5SGFzaFN0cmluZyk6IFByb21pc2U8QmFsYW5jZTI+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgICAgICAgICAuY2FsbEFwaU1ldGhvZDxCYWxhbmNlMj4oTWV0aG9kcy5HZXRCYWxhbmNlMiwgeyBwa2ggfSlcclxuICAgICAgICAgICAgLnRoZW4oKGJhbGFuY2U6IEJhbGFuY2UyKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbG9ja2VkOiBCaWdJbnQoYmFsYW5jZS5sb2NrZWQpLFxyXG4gICAgICAgICAgICAgICAgc3Rha2VkOiBCaWdJbnQoYmFsYW5jZS5zdGFrZWQpLFxyXG4gICAgICAgICAgICAgICAgdW5sb2NrZWQ6IEJpZ0ludChiYWxhbmNlLnVubG9ja2VkKSxcclxuICAgICAgICAgICAgfSkpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogR2V0IGJsb2NrIGluZm8gYnkgaGFzaFxyXG4gICAgICogQHBhcmFtIHtIYXNofSBibG9ja0hhc2ggLSBIYXNoIG9mIHRoZSBibG9jayB0aGF0IHdlIGFyZSBxdWVyeWluZy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvd1RyYW5zYWN0aW9uSGFzaCAtIFdoZXRoZXIgdG8gaW5jbHVkZSBhbiBleHRyYSBmaWVsZCBjb250YWluaW5nIGFycmF5IG9mIHRyYW5zYWN0aW9uIGhhc2hlcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEJsb2NrKFxyXG4gICAgICAgICAgICBibG9ja0hhc2g6IEhhc2gsXHJcbiAgICAgICAgICAgIHNob3dUcmFuc2FjdGlvbkhhc2ggPSBmYWxzZSxcclxuICAgICAgICApOiBQcm9taXNlPEJsb2NrPlxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8QmxvY2s+KE1ldGhvZHMuR2V0QmxvY2ssIFtibG9ja0hhc2gsIHNob3dUcmFuc2FjdGlvbkhhc2gsIF0pXHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBhc3luYyBnZXREYXRhUmVxdWVzdChkclR4SGFzaDogSGFzaCwgbW9kZT86IEdldERhdGFSZXF1ZXN0TW9kZSwgZm9yY2UgPSBmYWxzZSk6IFByb21pc2U8R2V0RGF0YVJlcXVlc3RGdWxsUmVwb3J0IHwgR2V0RGF0YVJlcXVlc3RFdGhlcmVhbFJlcG9ydD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8R2V0RGF0YVJlcXVlc3RGdWxsUmVwb3J0IHwgR2V0RGF0YVJlcXVlc3RFdGhlcmVhbFJlcG9ydD4oTWV0aG9kcy5HZXREYXRhUmVxdWVzdCwge1xyXG4gICAgICAgICAgICBoYXNoOiBkclR4SGFzaCxcclxuICAgICAgICAgICAgbW9kZTogbW9kZSB8fCBcImZ1bGxcIixcclxuICAgICAgICAgICAgZm9yY2VcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gR2V0IHRoZSBibG9ja3MgdGhhdCBwZXJ0YWluIHRvIHRoZSBzdXBlcmJsb2NrIGluZGV4XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3VwZXJibG9jayhlcG9jaDogRXBvY2gpOiBQcm9taXNlPFN1cGVyYmxvY2tSZXBvcnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPFN1cGVyYmxvY2tSZXBvcnQ+KE1ldGhvZHMuR2V0U3VwZXJibG9jaywgeyBcImJsb2NrX2Vwb2NoXCI6IGVwb2NoIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb24odHhIYXNoOiBIYXNoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlcG9ydD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8VHJhbnNhY3Rpb25SZXBvcnQ+KE1ldGhvZHMuR2V0VHJhbnNhY3Rpb24sIFt0eEhhc2gsIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvblJlY2VpcHQodHhIYXNoOiBIYXNoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlY2VpcHQ+IHtcclxuICAgICAgICAvLyB0b2RvOiBmZXRjaC91cGRhdGUgcmVjZWlwdCBmcm9tIHByb3ZpZGVyLCBpZiBub3QgY2FjaGVkXHJcbiAgICAgICAgcmV0dXJuIEpzb25ScGNQcm92aWRlci5yZWNlaXB0c1t0eEhhc2hdXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyBHZXQgdXR4b3NcclxuICAgIHB1YmxpYyBhc3luYyBnZXRVdHhvcyhwa2g6IFB1YmxpY0tleUhhc2hTdHJpbmcsIGZpbHRlcj86IHsgbWluVmFsdWU/OiBiaWdpbnQgfCBzdHJpbmcsIGZyb21TaWduZXI/OiBQdWJsaWNLZXlIYXNoU3RyaW5nIH0pOiBQcm9taXNlPEFycmF5PFV0eG9NZXRhZGF0YT4+IHtcclxuICAgICAgICBpZiAoZmlsdGVyKSB7XHJcbiAgICAgICAgICAgIGZpbHRlci5taW5WYWx1ZSA9IGZpbHRlcj8ubWluVmFsdWU/LnRvU3RyaW5nKCkgPz8gXCIwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC5jYWxsQXBpTWV0aG9kPFV0eG9JbmZvPihNZXRob2RzLkdldFV0eG9JbmZvLCBbcGtoLCAuLi4oZmlsdGVyID8gW2ZpbHRlcl06IFtdKV0pXHJcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IFV0eG9JbmZvKSA9PiByZXN1bHQudXR4b3MubWFwKCh1dHhvOiBVdHhvTWV0YWRhdGEpID0+ICh7IFxyXG4gICAgICAgICAgICAgICAgLi4udXR4bywgXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogQmlnSW50KHV0eG8udmFsdWUpXHJcbiAgICAgICAgICAgIH0pKSlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VmFsdWVUcmFuc2Zlcih0eEhhc2g6IEhhc2gsIG1vZGU/OiBzdHJpbmcsIGZvcmNlID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8YW55PihNZXRob2RzLkdldFZhbHVlVHJhbnNmZXIsIHtcclxuICAgICAgICAgICAgaGFzaDogdHhIYXNoLFxyXG4gICAgICAgICAgICBtb2RlOiBtb2RlLFxyXG4gICAgICAgICAgICBmb3JjZVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaERhdGFSZXF1ZXN0cyhcclxuICAgICAgICByYWRIYXNoOiBIYXNoLCBcclxuICAgICAgICBvcHRpb25zPzogeyBcclxuICAgICAgICAgICAgbGltaXQ/OiBudW1iZXIsIFxyXG4gICAgICAgICAgICBvZmZzZXQ/OiBudW1iZXIsXHJcbiAgICAgICAgICAgIG1vZGU/OiBHZXREYXRhUmVxdWVzdE1vZGUsIFxyXG4gICAgICAgICAgICByZXZlcnNlPzogYm9vbGVhbiBcclxuICAgIH0pOiBQcm9taXNlPEFycmF5PEdldERhdGFSZXF1ZXN0RXRoZXJlYWxSZXBvcnQgfCBHZXREYXRhUmVxdWVzdEZ1bGxSZXBvcnQ+PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgICAgICAgICAgLmNhbGxBcGlNZXRob2Q8QXJyYXk8YW55W10+PihNZXRob2RzLlNlYXJjaERhdGFSZXF1ZXN0cywge1xyXG4gICAgICAgICAgICAgICAgcmFkSGFzaCxcclxuICAgICAgICAgICAgICAgIGxpbWl0OiBvcHRpb25zPy5saW1pdCxcclxuICAgICAgICAgICAgICAgIG9mZnNldDogb3B0aW9ucz8ub2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgcmV2ZXJzZTogb3B0aW9ucz8ucmV2ZXJzZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihhc3luYyBlbnRyaWVzID0+IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgICAgZW50cmllcy5tYXAoKGVudHJ5OiBhbnlbXSkgPT4gdGhpcy5nZXREYXRhUmVxdWVzdChlbnRyeVsxXSwgb3B0aW9ucz8ubW9kZSB8fCBcImV0aGVyZWFsXCIsIHRydWUpKVxyXG4gICAgICAgICAgICApKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBwdWJsaWMgYXN5bmMgc2VuZFJhd1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPGJvb2xlYW4+KE1ldGhvZHMuSW52ZW50b3J5LCB7IHRyYW5zYWN0aW9uIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLy8vIEdldCBzdXBwbHkgaW5mb1xyXG4gICAgcHVibGljIGFzeW5jIHN1cHBseUluZm8oKTogUHJvbWlzZTxTdXBwbHlJbmZvPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxTdXBwbHlJbmZvPihNZXRob2RzLkdldFN1cHBseUluZm8pXHJcbiAgICB9XHJcbn0iXX0=
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JwYy9wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxJQUFJLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN2RCxPQUFPLE9BQU8sTUFBTSxhQUFhLENBQUM7QUFFbEMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFL0MsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDO0FBRWxDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsUUFBUSxDQUFDO0FBQ3JDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQ25DLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUM1QyxDQUFDO0FBQ0YsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRTVELE9BQU8sRUFDTixTQUFTLEdBR1QsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxPQUFPLEVBU04sT0FBTyxHQWNQLE1BQU0sWUFBWSxDQUFDO0FBa0RwQixNQUFNLE9BQU8sb0JBQXFCLFNBQVEsS0FBSztJQUNyQyxLQUFLLENBQU87SUFDWixNQUFNLENBQVM7SUFDZixNQUFNLENBQVE7SUFDdkIsWUFBWSxNQUFjLEVBQUUsTUFBYSxFQUFFLEtBQVc7UUFDckQsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekUsT0FBTyxLQUFLLEVB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QU0sSUFBSSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sS0FBSyxLQUFLLENBQUM7U0FDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FDekIsT0FBTyxDQUFDLEdBQUcsQ0FDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUN6QixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsT0FBTyxFQUFFLElBQUksSUFBSSxVQUFVLEVBQzNCLElBQUksQ0FDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0YsQ0FDRCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1IQUFtSDtJQUM1RyxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBZ0I7UUFDL0MsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFVLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxtQkFBbUI7SUFDWixLQUFLLENBQUMsVUFBVTtRQUN0QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQWEsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XHJcbmltcG9ydCB7IEF4aW9zSGVhZGVycywgZGVmYXVsdCBhcyBheGlvcyB9IGZyb20gXCJheGlvc1wiO1xyXG5pbXBvcnQganNvbkJpZyBmcm9tIFwianNvbi1iaWdpbnRcIjtcclxuXHJcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XHJcblxyXG5pbXBvcnQgcHJvdG9idWYgZnJvbSBcInByb3RvYnVmanNcIjtcclxuXHJcbmNvbnN0IHsgUm9vdDogUHJvdG9Sb290IH0gPSBwcm90b2J1ZjtcclxuY29uc3QgcHJvdG9Sb290ID0gUHJvdG9Sb290LmZyb21KU09OKFxyXG5cdHJlcXVpcmUoXCIuLi8uLi8uLi93aXRuZXQvd2l0bmV0LnByb3RvLmpzb25cIiksXHJcbik7XHJcbmNvbnN0IHByb3RvQnVmID0gcHJvdG9Sb290Lmxvb2t1cFR5cGUoXCJDb25zZW5zdXNDb25zdGFudHNcIik7XHJcblxyXG5pbXBvcnQge1xyXG5cdFB1YmxpY0tleSxcclxuXHR0eXBlIFB1YmxpY0tleUhhc2hTdHJpbmcsXHJcblx0dHlwZSBUcmFuc2FjdGlvblJlY2VpcHQsXHJcbn0gZnJvbSBcIi4uL2NyeXB0by90eXBlcy5qc1wiO1xyXG5pbXBvcnQgdHlwZSB7IEVwb2NoLCBIYXNoLCBOZXR3b3JrLCBVdHhvTWV0YWRhdGEgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcclxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XHJcblxyXG5pbXBvcnQge1xyXG5cdHR5cGUgQmFsYW5jZSxcclxuXHR0eXBlIEJhbGFuY2UyLFxyXG5cdHR5cGUgQmxvY2ssXHJcblx0dHlwZSBDb25zZW5zdXNDb25zdGFudHMsXHJcblx0dHlwZSBHZXREYXRhUmVxdWVzdEV0aGVyZWFsUmVwb3J0LFxyXG5cdHR5cGUgR2V0RGF0YVJlcXVlc3RGdWxsUmVwb3J0LFxyXG5cdHR5cGUgR2V0RGF0YVJlcXVlc3RNb2RlLFxyXG5cdHR5cGUgTWVtcG9vbCxcclxuXHRNZXRob2RzLFxyXG5cdHR5cGUgUGVlckFkZHIsXHJcblx0dHlwZSBQcmlvcml0aWVzLFxyXG5cdHR5cGUgUHJvdG9jb2xJbmZvLFxyXG5cdHR5cGUgUXVlcnlTdGFrZXMsXHJcblx0dHlwZSBRdWVyeVN0YWtpbmdQb3dlcnMsXHJcblx0dHlwZSBTaWduYWxpbmdJbmZvLFxyXG5cdHR5cGUgU3Rha2VFbnRyeSxcclxuXHR0eXBlIFN0YWtpbmdQb3dlcixcclxuXHR0eXBlIFN1cGVyYmxvY2tSZXBvcnQsXHJcblx0dHlwZSBTdXBwbHlJbmZvLFxyXG5cdHR5cGUgU3luY1N0YXR1cyxcclxuXHR0eXBlIFRyYW5zYWN0aW9uUmVwb3J0LFxyXG5cdHR5cGUgVXR4b0luZm8sXHJcbn0gZnJvbSBcIi4vdHlwZXMuanNcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUpzb25ScGNQcm92aWRlciB7XHJcblx0bmV0d29yaz86IE5ldHdvcms7XHJcblx0bmV0d29ya0lkPzogbnVtYmVyO1xyXG5cclxuXHRibG9ja3MoXHJcblx0XHRzaW5jZTogRXBvY2gsXHJcblx0XHRsaW1pdDogbnVtYmVyLFxyXG5cdCk6IFByb21pc2U8QXJyYXk8W251bWJlciwgSGFzaCAvKiwgUHVibGljS2V5SGFzaFN0cmluZyovXT4+O1xyXG5cdGNvbnN0YW50cygpOiBQcm9taXNlPENvbnNlbnN1c0NvbnN0YW50cz47XHJcblx0aG9sZGVycyhsaW1pdD86IG51bWJlcik6IFByb21pc2U8UmVjb3JkPFB1YmxpY0tleUhhc2hTdHJpbmcsIEJhbGFuY2UyPj47XHJcblx0bWVtcG9vbCgpOiBQcm9taXNlPE1lbXBvb2w+O1xyXG5cdHBvd2VycyhwYXJhbXM/OiBRdWVyeVN0YWtpbmdQb3dlcnMpOiBQcm9taXNlPEFycmF5PFN0YWtpbmdQb3dlcj4+O1xyXG5cdHByaW9yaXRpZXMoKTogUHJvbWlzZTxQcmlvcml0aWVzPjtcclxuXHRwcm90b2NvbEluZm8oKTogUHJvbWlzZTxQcm90b2NvbEluZm8+O1xyXG5cdHN0YWtlcyhwYXJhbXM6IFF1ZXJ5U3Rha2VzKTogUHJvbWlzZTxBcnJheTxTdGFrZUVudHJ5Pj47XHJcblx0c3VwcGx5SW5mbygpOiBQcm9taXNlPFN1cHBseUluZm8+O1xyXG5cdHN5bmNTdGF0dXMoKTogUHJvbWlzZTxhbnk+O1xyXG5cdHdpcHMoKTogUHJvbWlzZTxTaWduYWxpbmdJbmZvPjtcclxuXHR3aXRuZXNzZXMoKTogUHJvbWlzZTxudW1iZXI+O1xyXG5cclxuXHRnZXRCYWxhbmNlKHBraDogUHVibGljS2V5SGFzaFN0cmluZyk6IFByb21pc2U8QmFsYW5jZTI+O1xyXG5cdGdldEJsb2NrKGJsb2NrSGFzaDogSGFzaCwgc2hvd1RyYW5zYWN0aW9uSGFzaGVzPzogYm9vbGVhbik6IFByb21pc2U8QmxvY2s+O1xyXG5cdGdldERhdGFSZXF1ZXN0KFxyXG5cdFx0ZHJUeEhhc2g6IEhhc2gsXHJcblx0XHRtb2RlPzogR2V0RGF0YVJlcXVlc3RNb2RlLFxyXG5cdCk6IFByb21pc2U8R2V0RGF0YVJlcXVlc3RGdWxsUmVwb3J0IHwgR2V0RGF0YVJlcXVlc3RFdGhlcmVhbFJlcG9ydD47XHJcblx0Z2V0U3VwZXJibG9jayhlcG9jaDogRXBvY2gpOiBQcm9taXNlPFN1cGVyYmxvY2tSZXBvcnQ+O1xyXG5cdGdldFRyYW5zYWN0aW9uKHR4SGFzaDogSGFzaCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXBvcnQ+O1xyXG5cdGdldFRyYW5zYWN0aW9uUmVjZWlwdCh0eEhhc2g6IEhhc2gpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVjZWlwdD47XHJcblx0Z2V0VXR4b3MoXHJcblx0XHRwa2g6IFB1YmxpY0tleUhhc2hTdHJpbmcsXHJcblx0XHRmaWx0ZXI/OiB7IG1pblZhbHVlPzogYmlnaW50OyBzaWduZXI/OiBQdWJsaWNLZXlIYXNoU3RyaW5nIH0sXHJcblx0KTogUHJvbWlzZTxBcnJheTxVdHhvTWV0YWRhdGE+PjtcclxuXHRnZXRWYWx1ZVRyYW5zZmVyKHR4SGFzaDogSGFzaCwgbW9kZT86IHN0cmluZyk6IFByb21pc2U8YW55PjtcclxuXHJcblx0c2VhcmNoRGF0YVJlcXVlc3RzKFxyXG5cdFx0cmFkSGFzaDogSGFzaCxcclxuXHRcdG9wdGlvbnM/OiB7XHJcblx0XHRcdGxpbWl0PzogbnVtYmVyO1xyXG5cdFx0XHRvZmZzZXQ/OiBudW1iZXI7XHJcblx0XHRcdG1vZGU/OiBHZXREYXRhUmVxdWVzdE1vZGU7XHJcblx0XHRcdHJldmVyc2U/OiBib29sZWFuO1xyXG5cdFx0fSxcclxuXHQpOiBQcm9taXNlPEFycmF5PEdldERhdGFSZXF1ZXN0RnVsbFJlcG9ydCB8IEdldERhdGFSZXF1ZXN0RXRoZXJlYWxSZXBvcnQ+PjtcclxuXHJcblx0c2VuZFJhd1RyYW5zYWN0aW9uKHR4OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSnNvblJwY1Byb3ZpZGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcblx0cmVhZG9ubHkgZXJyb3I/OiBhbnk7XHJcblx0cmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XHJcblx0cmVhZG9ubHkgcGFyYW1zOiBhbnlbXTtcclxuXHRjb25zdHJ1Y3RvcihtZXRob2Q6IHN0cmluZywgcGFyYW1zOiBhbnlbXSwgZXJyb3I/OiBhbnkpIHtcclxuXHRcdHN1cGVyKGAke21ldGhvZH0oJHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfSk6ICR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfSlgKTtcclxuXHRcdGRlbGV0ZSBlcnJvcj8uc3RhY2s7XHJcblx0XHR0aGlzLmVycm9yID0gZXJyb3I7XHJcblx0XHR0aGlzLm1ldGhvZCA9IG1ldGhvZDtcclxuXHRcdHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEpzb25ScGNQcm92aWRlciBpbXBsZW1lbnRzIElKc29uUnBjUHJvdmlkZXIge1xyXG5cdHB1YmxpYyByZWFkb25seSBlbmRwb2ludHM6IHN0cmluZ1tdO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIHJlY2VpcHRzOiBSZWNvcmQ8SGFzaCwgVHJhbnNhY3Rpb25SZWNlaXB0PiA9IHt9O1xyXG5cclxuXHRwcm90ZWN0ZWQgX2NvbnN0YW50cz86IENvbnNlbnN1c0NvbnN0YW50cztcclxuXHRwcm90ZWN0ZWQgX2hlYWRlcnM6IEF4aW9zSGVhZGVycztcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgSnNvblJwY1Byb3ZpZGVyIG9iamVjdCBjb25uZWN0ZWQgdG8gdGhlIGRlZmF1bHQgV2l0L1JQQyBlbmRwb2ludC5cclxuXHQgKiBEZWZhdWx0cyB0byBodHRwczovL3JwYy0wMS53aXRuZXQuaW8gaWYgbm8gV0lUTkVUX1NES19QUk9WSURFUl9VUkwgZW52YXIgaXMgc2V0dGxlZFxyXG5cdCAqIG9uIHRoZSBlbnZpcm9ubWVudC5cclxuXHQgKi9cclxuXHRzdGF0aWMgYXN5bmMgZnJvbUVudih1cmw/OiBzdHJpbmcpOiBQcm9taXNlPEpzb25ScGNQcm92aWRlcj4ge1xyXG5cdFx0cmV0dXJuIEpzb25ScGNQcm92aWRlci5mcm9tVVJMKFxyXG5cdFx0XHR1cmwgfHwgcHJvY2Vzcy5lbnYuV0lUTkVUX1NES19QUk9WSURFUl9VUkwgfHwgXCJodHRwczovL3JwYy0wMS53aXRuZXQuaW9cIixcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBKc29uUnBjUHJvdmlkZXIgb2JqZWN0IGNvbm5lY3RlZCB0byB0aGUgc3BlY2lmaWVkIFdpdC9SUEMgZW5kcG9pbnQuXHJcblx0ICogQHBhcmFtIHVybCBXaXQvUlBDIGVuZHBvaW50IFVSTC5cclxuXHQgKi9cclxuXHRzdGF0aWMgYXN5bmMgZnJvbVVSTCh1cmw6IHN0cmluZyk6IFByb21pc2U8SnNvblJwY1Byb3ZpZGVyPiB7XHJcblx0XHRjb25zdCBwcm92aWRlciA9IG5ldyBKc29uUnBjUHJvdmlkZXIodXJsKTtcclxuXHRcdHJldHVybiBwcm92aWRlci5jb25zdGFudHMoKS50aGVuKCgpID0+IHByb3ZpZGVyKTtcclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKHVybD86IHN0cmluZykge1xyXG5cdFx0dGhpcy5lbmRwb2ludHMgPSBbXTtcclxuXHRcdGlmICh1cmwgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRjb25zdCB1cmxzID0gdXJsLnJlcGxhY2VBbGwoXCIsXCIsIFwiO1wiKS5zcGxpdChcIjtcIik7XHJcblx0XHRcdHVybHMuZm9yRWFjaCgodXJsKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgW3NjaGVtYV0gPSB1dGlscy5wYXJzZVVSTCh1cmwpO1xyXG5cdFx0XHRcdGlmICghc2NoZW1hLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpICYmICFzY2hlbWEuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XHJcblx0XHRcdFx0XHR0aHJvdyBFcnJvcihcclxuXHRcdFx0XHRcdFx0YFdpdG5ldC5Kc29uUnBjUHJvdmlkZXI6IHVuc3VwcG9ydGVkIFVSTCBzY2hlbWEgJHtzY2hlbWF9YCxcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5lbmRwb2ludHMgPSB1cmxzO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5lbmRwb2ludHMucHVzaChcclxuXHRcdFx0XHRwcm9jZXNzLmVudi5XSVRORVRfU0RLX1BST1ZJREVSX1VSTCB8fCBcImh0dHBzOi8vcnBjLTAxLndpdG5ldC5pb1wiLFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5faGVhZGVycyA9IG5ldyBBeGlvc0hlYWRlcnMoe1xyXG5cdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBuZXR3b3JrKCk6IE5ldHdvcmsgfCB1bmRlZmluZWQge1xyXG5cdFx0aWYgKHRoaXMuX2NvbnN0YW50cykge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5fY29uc3RhbnRzLmJvb3RzdHJhcHBpbmdfY29tbWl0dGVlWzBdLnN0YXJ0c1dpdGgoXCJ3aXRcIilcclxuXHRcdFx0XHQ/IFwibWFpbm5ldFwiXHJcblx0XHRcdFx0OiBcInRlc3RuZXRcIjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IG5ldHdvcmtJZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xyXG5cdFx0aWYgKHRoaXMuX2NvbnN0YW50cykge1xyXG5cdFx0XHRjb25zdCBvYmo6IGFueSA9IHt9O1xyXG5cdFx0XHRvYmouYWN0aXZpdHlQZXJpb2QgPSB0aGlzLl9jb25zdGFudHMuYWN0aXZpdHlfcGVyaW9kO1xyXG5cdFx0XHRvYmouYm9vdHN0cmFwSGFzaCA9IHtcclxuXHRcdFx0XHRTSEEyNTY6IEFycmF5LmZyb20odXRpbHMuZnJvbUhleFN0cmluZyh0aGlzLl9jb25zdGFudHMuYm9vdHN0cmFwX2hhc2gpKSxcclxuXHRcdFx0fTtcclxuXHRcdFx0b2JqLmJvb3RzdHJhcHBpbmdDb21taXR0ZWUgPSB0aGlzLl9jb25zdGFudHMuYm9vdHN0cmFwcGluZ19jb21taXR0ZWU7XHJcblx0XHRcdG9iai5jaGVja3BvaW50WmVyb1RpbWVzdGFtcCA9IHRoaXMuX2NvbnN0YW50cy5jaGVja3BvaW50X3plcm9fdGltZXN0YW1wO1xyXG5cdFx0XHRvYmouY2hlY2twb2ludHNQZXJpb2QgPSB0aGlzLl9jb25zdGFudHMuY2hlY2twb2ludHNfcGVyaW9kO1xyXG5cdFx0XHRvYmouY29sbGF0ZXJhbEFnZSA9IHRoaXMuX2NvbnN0YW50cy5jb2xsYXRlcmFsX2FnZTtcclxuXHRcdFx0b2JqLmNvbGxhdGVyYWxNaW5pbXVtID0gdGhpcy5fY29uc3RhbnRzLmNvbGxhdGVyYWxfbWluaW11bTtcclxuXHRcdFx0b2JqLmVwb2Noc1dpdGhNaW5pbXVtRGlmZmljdWx0eSA9XHJcblx0XHRcdFx0dGhpcy5fY29uc3RhbnRzLmVwb2Noc193aXRoX21pbmltdW1fZGlmZmljdWx0eTtcclxuXHRcdFx0b2JqLmV4dHJhUm91bmRzID0gdGhpcy5fY29uc3RhbnRzLmV4dHJhX3JvdW5kcztcclxuXHRcdFx0b2JqLmdlbmVzaXNIYXNoID0ge1xyXG5cdFx0XHRcdFNIQTI1NjogQXJyYXkuZnJvbSh1dGlscy5mcm9tSGV4U3RyaW5nKHRoaXMuX2NvbnN0YW50cy5nZW5lc2lzX2hhc2gpKSxcclxuXHRcdFx0fTtcclxuXHRcdFx0b2JqLmhhbHZpbmdQZXJpb2QgPSB0aGlzLl9jb25zdGFudHMuaGFsdmluZ19wZXJpb2Q7XHJcblx0XHRcdG9iai5pbml0aWFsQmxvY2tSZXdhcmQgPSB0aGlzLl9jb25zdGFudHMuaW5pdGlhbF9ibG9ja19yZXdhcmQ7XHJcblx0XHRcdG9iai5tYXhEcldlaWdodCA9IHRoaXMuX2NvbnN0YW50cy5tYXhfZHJfd2VpZ2h0O1xyXG5cdFx0XHRvYmoubWF4VnRXZWlnaHQgPSB0aGlzLl9jb25zdGFudHMubWF4X3Z0X3dlaWdodDtcclxuXHRcdFx0aWYgKHRoaXMuX2NvbnN0YW50cy5taW5pbXVtX2RpZmZpY3VsdHkgPiAwKVxyXG5cdFx0XHRcdG9iai5taW5pbXVtRGlmZmljdWx0eSA9IHRoaXMuX2NvbnN0YW50cy5taW5pbXVtX2RpZmZpY3VsdHk7XHJcblx0XHRcdG9iai5taW5pbmdCYWNrdXBGYWN0b3IgPSB0aGlzLl9jb25zdGFudHMubWluaW5nX2JhY2t1cF9mYWN0b3I7XHJcblx0XHRcdG9iai5taW5pbmdSZXBsaWNhdGlvbkZhY3RvciA9IHRoaXMuX2NvbnN0YW50cy5taW5pbmdfcmVwbGljYXRpb25fZmFjdG9yO1xyXG5cdFx0XHRvYmoucmVwdXRhdGlvbkV4cGlyZUFscGhhRGlmZiA9XHJcblx0XHRcdFx0dGhpcy5fY29uc3RhbnRzLnJlcHV0YXRpb25fZXhwaXJlX2FscGhhX2RpZmY7XHJcblx0XHRcdG9iai5yZXB1dGF0aW9uSXNzdWFuY2UgPSB0aGlzLl9jb25zdGFudHMucmVwdXRhdGlvbl9pc3N1YW5jZTtcclxuXHRcdFx0b2JqLnJlcHV0YXRpb25Jc3N1YW5jZVN0b3AgPSB0aGlzLl9jb25zdGFudHMucmVwdXRhdGlvbl9pc3N1YW5jZV9zdG9wO1xyXG5cdFx0XHRvYmoucmVwdXRhdGlvblBlbmFsaXphdGlvbkZhY3RvciA9XHJcblx0XHRcdFx0dGhpcy5fY29uc3RhbnRzLnJlcHV0YXRpb25fcGVuYWxpemF0aW9uX2ZhY3RvcjtcclxuXHRcdFx0b2JqLnN1cGVyYmxvY2tDb21taXR0ZWVEZWNyZWFzaW5nUGVyaW9kID1cclxuXHRcdFx0XHR0aGlzLl9jb25zdGFudHMuc3VwZXJibG9ja19jb21taXR0ZWVfZGVjcmVhc2luZ19wZXJpb2Q7XHJcblx0XHRcdG9iai5zdXBlcmJsb2NrQ29tbWl0dGVlRGVjcmVhc2luZ1N0ZXAgPVxyXG5cdFx0XHRcdHRoaXMuX2NvbnN0YW50cy5zdXBlcmJsb2NrX2NvbW1pdHRlZV9kZWNyZWFzaW5nX3N0ZXA7XHJcblx0XHRcdG9iai5zdXBlcmJsb2NrUGVyaW9kID0gdGhpcy5fY29uc3RhbnRzLnN1cGVyYmxvY2tfcGVyaW9kO1xyXG5cdFx0XHRvYmouc3VwZXJibG9ja1NpZ25pbmdDb21taXR0ZWVTaXplID1cclxuXHRcdFx0XHR0aGlzLl9jb25zdGFudHMuc3VwZXJibG9ja19zaWduaW5nX2NvbW1pdHRlZV9zaXplO1xyXG5cdFx0XHRjb25zdCBtZXNzYWdlID0gcHJvdG9CdWYuZnJvbU9iamVjdChvYmopO1xyXG5cdFx0XHRjb25zdCBidWZmZXIgPSBwcm90b0J1Zi5lbmNvZGUobWVzc2FnZSkuZmluaXNoKCk7XHJcblx0XHRcdGNvbnN0IGhhc2ggPSB1dGlscy50b0hleFN0cmluZyh1dGlscy5zaGEyNTYoYnVmZmVyKSk7XHJcblx0XHRcdGNvbnN0IGhleCA9IGhhc2guc3Vic3RyaW5nKDAsIDQpO1xyXG5cdFx0XHRyZXR1cm4gcGFyc2VJbnQoaGV4LCAxNik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0cHJvdGVjdGVkIG5leHRVUkwoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLmVuZHBvaW50c1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLmVuZHBvaW50cy5sZW5ndGgpXTtcclxuXHR9XHJcblxyXG5cdHByb3RlY3RlZCBhc3luYyBjYWxsQXBpTWV0aG9kPFQ+KFxyXG5cdFx0bWV0aG9kOiBzdHJpbmcsXHJcblx0XHRwYXJhbXM/OiBBcnJheTxhbnk+IHwgYW55LFxyXG5cdCk6IFByb21pc2U8RXJyb3IgfCBhbnk+IHtcclxuXHRcdGNvbnN0IHVybCA9IHRoaXMubmV4dFVSTCgpO1xyXG5cdFx0cmV0dXJuIGF4aW9zXHJcblx0XHRcdC5wb3N0KFxyXG5cdFx0XHRcdHVybCxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRqc29ucnBjOiBcIjIuMFwiLFxyXG5cdFx0XHRcdFx0aWQ6IERhdGUubm93KCksXHJcblx0XHRcdFx0XHRtZXRob2QsXHJcblx0XHRcdFx0XHRwYXJhbXMsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRoZWFkZXJzOiB0aGlzLl9oZWFkZXJzLFxyXG5cdFx0XHRcdFx0dHJhbnNmb3JtUmVzcG9uc2U6IChyZXNwb25zZSkgPT4ganNvbkJpZygpLnBhcnNlKHJlc3BvbnNlKSxcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHQpXHJcblx0XHRcdC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcblx0XHRcdFx0aWYgKHJlc3BvbnNlPy5lcnJvciB8fCByZXNwb25zZT8uZGF0YT8uZXJyb3IpIHtcclxuXHRcdFx0XHRcdHRocm93IG5ldyBKc29uUnBjUHJvdmlkZXJFcnJvcihcclxuXHRcdFx0XHRcdFx0bWV0aG9kLFxyXG5cdFx0XHRcdFx0XHRwYXJhbXMsXHJcblx0XHRcdFx0XHRcdHJlc3BvbnNlPy5lcnJvciB8fCByZXNwb25zZT8uZGF0YT8uZXJyb3IsXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH0gZWxzZSByZXR1cm4gcmVzcG9uc2U/LmRhdGE/LnJlc3VsdCBhcyBUO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IHRoZSBsaXN0IG9mIGJsb2NrIGhhc2hlcyB3aXRoaW4gZ2l2ZW4gcmFuZ2UsIGFzIGtub3duIGJ5IHRoZSBwcm92aWRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2luY2UgLSBGaXJzdCBlcG9jaCBmb3Igd2hpY2ggdG8gcmV0dXJuIGJsb2NrIGhhc2hlcy4gSWYgbmVnYXRpdmUsIHJldHVybiBibG9jayBoYXNoZXMgZnJvbSB0aGUgbGFzdCBuIGVwb2Nocy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBOdW1iZXIgb2YgYmxvY2sgaGFzaGVzIHRvIHJldHVybi4gSWYgbmVnYXRpdmUsIHJldHVybiB0aGUgbGFzdCBuIGJsb2NrIGhhc2hlcyBmcm9tIHRoaXMgZXBvY2ggcmFuZ2UuXHJcblx0ICovXHJcblx0cHVibGljIGFzeW5jIGJsb2NrcyhcclxuXHRcdHNpbmNlOiBudW1iZXIgPSAtMSxcclxuXHRcdGxpbWl0OiBudW1iZXIgPSAxLFxyXG5cdCk6IFByb21pc2U8QXJyYXk8W251bWJlciwgSGFzaF0+PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPFtudW1iZXIsIEhhc2hdPihNZXRob2RzLkdldEJsb2NrQ2hhaW4sIFtcclxuXHRcdFx0c2luY2UsXHJcblx0XHRcdGxpbWl0LFxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHQvLy8gR2V0IGNvbnNlbnN1cyBjb25zdGFudHMgdXNlZCBieSB0aGUgbm9kZVxyXG5cdHB1YmxpYyBhc3luYyBjb25zdGFudHMoKTogUHJvbWlzZTxDb25zZW5zdXNDb25zdGFudHM+IHtcclxuXHRcdGlmICghdGhpcy5fY29uc3RhbnRzKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8Q29uc2Vuc3VzQ29uc3RhbnRzPihcclxuXHRcdFx0XHRNZXRob2RzLkdldENvbnNlbnN1c0NvbnN0YW50cyxcclxuXHRcdFx0KS50aGVuKChjb25zdGFudHM6IENvbnNlbnN1c0NvbnN0YW50cykgPT4ge1xyXG5cdFx0XHRcdHRoaXMuX2NvbnN0YW50cyA9IGNvbnN0YW50cztcclxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnRzO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB0aGlzLl9jb25zdGFudHM7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLy8gR2V0IGxpbWl0ZWQgbGlzdCBvZiBjdXJyZW50bHkgdG9wIGhvbGRlcnMsIGFzIGtub3duIGJ5IHRoZSBwcm92aWRlci5cclxuXHRwdWJsaWMgYXN5bmMgaG9sZGVycyhcclxuXHRcdG1pbkJhbGFuY2UgPSAwLFxyXG5cdFx0bWF4QmFsYW5jZT86IG51bWJlcixcclxuXHQpOiBQcm9taXNlPFJlY29yZDxQdWJsaWNLZXlIYXNoU3RyaW5nLCBCYWxhbmNlMj4+IHtcclxuXHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8UmVjb3JkPFB1YmxpY0tleUhhc2hTdHJpbmcsIEJhbGFuY2U+PihcclxuXHRcdFx0TWV0aG9kcy5HZXRCYWxhbmNlMixcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGFsbDoge1xyXG5cdFx0XHRcdFx0bWluQmFsYW5jZSxcclxuXHRcdFx0XHRcdC4uLihtYXhCYWxhbmNlID8geyBtYXhCYWxhbmNlIH0gOiB7fSksXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSxcclxuXHRcdCkudGhlbigoYmFsYW5jZXM6IFJlY29yZDxQdWJsaWNLZXlIYXNoU3RyaW5nLCBCYWxhbmNlMj4pID0+IHtcclxuXHRcdFx0Y29uc3QgcmV2ZXJzZUNvbXBhcmUgPSAoYTogQmFsYW5jZTIsIGI6IEJhbGFuY2UyKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgYV90b3QgPSBhLmxvY2tlZCArIGEudW5sb2NrZWQgKyBhLnN0YWtlZDtcclxuXHRcdFx0XHRjb25zdCBiX3RvdCA9IGIubG9ja2VkICsgYi51bmxvY2tlZCArIGIuc3Rha2VkO1xyXG5cdFx0XHRcdGlmIChhX3RvdCA8IGJfdG90KSByZXR1cm4gMTtcclxuXHRcdFx0XHRlbHNlIGlmIChhX3RvdCA+IGJfdG90KSByZXR1cm4gLTE7XHJcblx0XHRcdFx0ZWxzZSByZXR1cm4gMDtcclxuXHRcdFx0fTtcclxuXHRcdFx0cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcclxuXHRcdFx0XHRPYmplY3QuZW50cmllcyhiYWxhbmNlcykuc29ydChcclxuXHRcdFx0XHRcdChhOiAoc3RyaW5nIHwgQmFsYW5jZTIpW10sIGI6IChzdHJpbmcgfCBCYWxhbmNlMilbXSkgPT5cclxuXHRcdFx0XHRcdFx0cmV2ZXJzZUNvbXBhcmUoYVsxXSBhcyBCYWxhbmNlMiwgYlsxXSBhcyBCYWxhbmNlMiksXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8vIEdldCBsaXN0IG9mIGtub3duIHBlZXJzXHJcblx0cHVibGljIGFzeW5jIGtub3duUGVlcnMoKTogUHJvbWlzZTxBcnJheTxQZWVyQWRkcj4+IHtcclxuXHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8QXJyYXk8UGVlckFkZHI+PihNZXRob2RzLktub3duUGVlcnMpO1xyXG5cdH1cclxuXHJcblx0Ly8vIEdldCBhbGwgdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb25zXHJcblx0cHVibGljIGFzeW5jIG1lbXBvb2woKTogUHJvbWlzZTxNZW1wb29sPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPE1lbXBvb2w+KE1ldGhvZHMuR2V0TWVtcG9vbCk7XHJcblx0fVxyXG5cclxuXHQvLy8gR2V0IHByaW9yaXR5IGFuZCB0aW1lLXRvLWJsb2NrIGVzdGltYXRpb25zIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgdGllcnMuXHJcblx0cHVibGljIGFzeW5jIHByaW9yaXRpZXMoKTogUHJvbWlzZTxQcmlvcml0aWVzPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPFByaW9yaXRpZXM+KE1ldGhvZHMuUHJpb3JpdHkpO1xyXG5cdH1cclxuXHJcblx0Ly8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCBwcm90b2NvbCB2ZXJzaW9ucyBhbmQgd2hpY2ggdmVyc2lvbiBpcyBjdXJyZW50bHkgYmVpbmcgZW5mb3JjZWQuXHJcblx0cHVibGljIGFzeW5jIHByb3RvY29sSW5mbygpOiBQcm9taXNlPFByb3RvY29sSW5mbz4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxQcm90b2NvbEluZm8+KE1ldGhvZHMuUHJvdG9jb2wpO1xyXG5cdH1cclxuXHJcblx0Ly8vIEdldCBhIGZ1bGwgbGlzdCBvZiBzdGFraW5nIHBvd2VycyBvcmRlcmVkIGJ5IHJhbmtcclxuXHRwdWJsaWMgYXN5bmMgcG93ZXJzKFxyXG5cdFx0cXVlcnk/OiBRdWVyeVN0YWtpbmdQb3dlcnMsXHJcblx0KTogUHJvbWlzZTxBcnJheTxTdGFraW5nUG93ZXI+PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPEFycmF5PFN0YWtpbmdQb3dlcj4+KFxyXG5cdFx0XHRNZXRob2RzLlF1ZXJ5U3Rha2luZ1Bvd2VycyxcclxuXHRcdFx0cXVlcnksXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0Ly8vIEdldCBhIGZ1bGwgbGlzdCBvZiBjdXJyZW50IHN0YWtlIGVudHJpZXMgIFF1ZXJ5IHRoZSBhbW91bnQgb2YgbmFub3dpdHMgc3Rha2VkIGJ5IGFuIGFkZHJlc3MuXHJcblx0cHVibGljIGFzeW5jIHN0YWtlcyhxdWVyeT86IFF1ZXJ5U3Rha2VzKTogUHJvbWlzZTxBcnJheTxTdGFrZUVudHJ5Pj4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxBcnJheTxTdGFrZUVudHJ5Pj4oXHJcblx0XHRcdE1ldGhvZHMuUXVlcnlTdGFrZXMsXHJcblx0XHRcdHF1ZXJ5LFxyXG5cdFx0KS5jYXRjaCgoZXJyKSA9PiB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRlcnI/LmVycm9yPy5tZXNzYWdlICYmXHJcblx0XHRcdFx0ZXJyLmVycm9yLm1lc3NhZ2UuaW5kZXhPZihcIm5vdCByZWdpc3RlcmVkXCIpID4gLTFcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRocm93IGVycjtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLy8gR2V0IG5vZGUgc3RhdHVzXHJcblx0cHVibGljIGFzeW5jIHN5bmNTdGF0dXMoKTogUHJvbWlzZTxTeW5jU3RhdHVzPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPFN5bmNTdGF0dXM+KE1ldGhvZHMuU3luY1N0YXR1cyk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgd2lwcygpOiBQcm9taXNlPFNpZ25hbGluZ0luZm8+IHtcclxuXHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8U2lnbmFsaW5nSW5mbz4oTWV0aG9kcy5TaWduYWxpbmdJbmZvKTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyB3aXRuZXNzZXMoX3NpbmNlPzogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcclxuXHRcdC8vIHRvZG86IHdpdG5lc3NlcyBlc3RpbWF0aW9uIHNob3VsZCBpbnN0ZWFkIGJlIGNvbXB1dGVkIGluIHByb3BvcnRpb24gdG9cclxuXHRcdC8vICAgICAgIHJhdGlvIG9mIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGhvbmVzdGx5IHdpdG5lc3NlZCBkYXRhIHJlcXVlc3RzXHJcblx0XHQvLyAgICAgICB2cyB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBob25lc3RseSB3aXRuZXNzZWQgZGF0YSByZXF1ZXN0cyBhbmRcclxuXHRcdC8vICAgICAgIG5ldmVyIHJldmVhbGVkIFwiaSBwYXNzZWRcIiBvdXQgb2YgbWFqb3JpdHksXHJcblx0XHQvLyAgICAgICB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZSBvZiBlcG9jaHMuXHJcblx0XHRsZXQgY2Vuc3VzID0gMDtcclxuXHRcdHJldHVybiB0aGlzLnN0YWtlcyh7IHBhcmFtczogeyBkaXN0aW5jdDogdHJ1ZSB9IH0pIC8vIHRvZG86IGltcGxlbWVudCBgY291bnRgIGZsYWcgb24gSUpzb25ScGNQcm92aWRlci5zdGFrZXMoKVxyXG5cdFx0XHQudGhlbigocmVjb3JkcykgPT4ge1xyXG5cdFx0XHRcdGNlbnN1cyA9IHJlY29yZHMubGVuZ3RoO1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmJsb2NrcygtMTYsIDE2KTsgLy8gdG9kbzogYmxvY2tzKCkgc2hvdWxkIHJldHVybiBlcG9jaCwgaGFzaCBhbmQgdmFsaWRhdG9yIHBraCBmb3IgZWFjaCBibG9ja1xyXG5cdFx0XHR9KVxyXG5cdFx0XHQudGhlbigocmVjb3JkcykgPT4ge1xyXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChyZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB0aGlzLmdldEJsb2NrKHJlY29yZFsxXSkpKTtcclxuXHRcdFx0fSlcclxuXHRcdFx0LnRoZW4oKGJsb2NrcykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZhbGlkYXRvcnM6IEFycmF5PFB1YmxpY0tleUhhc2hTdHJpbmc+ID0gW107XHJcblx0XHRcdFx0YmxvY2tzLm1hcCgoYmxvY2spID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHBraCA9IFB1YmxpY0tleS5mcm9tUHJvdG9idWYoYmxvY2suYmxvY2tfc2lnLnB1YmxpY19rZXkpXHJcblx0XHRcdFx0XHRcdC5oYXNoKClcclxuXHRcdFx0XHRcdFx0LnRvQmVjaDMyKHRoaXMubmV0d29yayk7XHJcblx0XHRcdFx0XHRpZiAoIXZhbGlkYXRvcnMuaW5jbHVkZXMocGtoKSkgdmFsaWRhdG9ycy5wdXNoKHBraCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0cmV0dXJuIE1hdGgubWluKFxyXG5cdFx0XHRcdFx0dmFsaWRhdG9ycy5sZW5ndGgsXHJcblx0XHRcdFx0XHRNYXRoLmZsb29yKHRoaXMubmV0d29yayA9PT0gXCJ0ZXN0bmV0XCIgPyBjZW5zdXMgLyAyIDogY2Vuc3VzIC8gNCksXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8vIEdldCBiYWxhbmNlXHJcblx0cHVibGljIGFzeW5jIGdldEJhbGFuY2UocGtoOiBQdWJsaWNLZXlIYXNoU3RyaW5nKTogUHJvbWlzZTxCYWxhbmNlMj4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxCYWxhbmNlMj4oTWV0aG9kcy5HZXRCYWxhbmNlMiwgeyBwa2ggfSkudGhlbihcclxuXHRcdFx0KGJhbGFuY2U6IEJhbGFuY2UyKSA9PiAoe1xyXG5cdFx0XHRcdGxvY2tlZDogQmlnSW50KGJhbGFuY2UubG9ja2VkKSxcclxuXHRcdFx0XHRzdGFrZWQ6IEJpZ0ludChiYWxhbmNlLnN0YWtlZCksXHJcblx0XHRcdFx0dW5sb2NrZWQ6IEJpZ0ludChiYWxhbmNlLnVubG9ja2VkKSxcclxuXHRcdFx0fSksXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IGJsb2NrIGluZm8gYnkgaGFzaFxyXG5cdCAqIEBwYXJhbSB7SGFzaH0gYmxvY2tIYXNoIC0gSGFzaCBvZiB0aGUgYmxvY2sgdGhhdCB3ZSBhcmUgcXVlcnlpbmcuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBzaG93VHJhbnNhY3Rpb25IYXNoIC0gV2hldGhlciB0byBpbmNsdWRlIGFuIGV4dHJhIGZpZWxkIGNvbnRhaW5pbmcgYXJyYXkgb2YgdHJhbnNhY3Rpb24gaGFzaGVzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhc3luYyBnZXRCbG9jayhcclxuXHRcdGJsb2NrSGFzaDogSGFzaCxcclxuXHRcdHNob3dUcmFuc2FjdGlvbkhhc2ggPSBmYWxzZSxcclxuXHQpOiBQcm9taXNlPEJsb2NrPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPEJsb2NrPihNZXRob2RzLkdldEJsb2NrLCBbXHJcblx0XHRcdGJsb2NrSGFzaCxcclxuXHRcdFx0c2hvd1RyYW5zYWN0aW9uSGFzaCxcclxuXHRcdF0pO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFzeW5jIGdldERhdGFSZXF1ZXN0KFxyXG5cdFx0ZHJUeEhhc2g6IEhhc2gsXHJcblx0XHRtb2RlPzogR2V0RGF0YVJlcXVlc3RNb2RlLFxyXG5cdFx0Zm9yY2UgPSBmYWxzZSxcclxuXHQpOiBQcm9taXNlPEdldERhdGFSZXF1ZXN0RnVsbFJlcG9ydCB8IEdldERhdGFSZXF1ZXN0RXRoZXJlYWxSZXBvcnQ+IHtcclxuXHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8XHJcblx0XHRcdEdldERhdGFSZXF1ZXN0RnVsbFJlcG9ydCB8IEdldERhdGFSZXF1ZXN0RXRoZXJlYWxSZXBvcnRcclxuXHRcdD4oTWV0aG9kcy5HZXREYXRhUmVxdWVzdCwge1xyXG5cdFx0XHRoYXNoOiBkclR4SGFzaCxcclxuXHRcdFx0bW9kZTogbW9kZSB8fCBcImZ1bGxcIixcclxuXHRcdFx0Zm9yY2UsXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vLyBHZXQgdGhlIGJsb2NrcyB0aGF0IHBlcnRhaW4gdG8gdGhlIHN1cGVyYmxvY2sgaW5kZXhcclxuXHRwdWJsaWMgYXN5bmMgZ2V0U3VwZXJibG9jayhlcG9jaDogRXBvY2gpOiBQcm9taXNlPFN1cGVyYmxvY2tSZXBvcnQ+IHtcclxuXHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8U3VwZXJibG9ja1JlcG9ydD4oTWV0aG9kcy5HZXRTdXBlcmJsb2NrLCB7XHJcblx0XHRcdGJsb2NrX2Vwb2NoOiBlcG9jaCxcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFzeW5jIGdldFRyYW5zYWN0aW9uKHR4SGFzaDogSGFzaCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXBvcnQ+IHtcclxuXHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8VHJhbnNhY3Rpb25SZXBvcnQ+KE1ldGhvZHMuR2V0VHJhbnNhY3Rpb24sIFtcclxuXHRcdFx0dHhIYXNoLFxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KFxyXG5cdFx0dHhIYXNoOiBIYXNoLFxyXG5cdCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZWNlaXB0PiB7XHJcblx0XHQvLyB0b2RvOiBmZXRjaC91cGRhdGUgcmVjZWlwdCBmcm9tIHByb3ZpZGVyLCBpZiBub3QgY2FjaGVkXHJcblx0XHRyZXR1cm4gSnNvblJwY1Byb3ZpZGVyLnJlY2VpcHRzW3R4SGFzaF07XHJcblx0fVxyXG5cclxuXHQvLy8gR2V0IHV0eG9zXHJcblx0cHVibGljIGFzeW5jIGdldFV0eG9zKFxyXG5cdFx0cGtoOiBQdWJsaWNLZXlIYXNoU3RyaW5nLFxyXG5cdFx0ZmlsdGVyPzogeyBtaW5WYWx1ZT86IGJpZ2ludCB8IHN0cmluZzsgZnJvbVNpZ25lcj86IFB1YmxpY0tleUhhc2hTdHJpbmcgfSxcclxuXHQpOiBQcm9taXNlPEFycmF5PFV0eG9NZXRhZGF0YT4+IHtcclxuXHRcdGlmIChmaWx0ZXIpIHtcclxuXHRcdFx0ZmlsdGVyLm1pblZhbHVlID0gZmlsdGVyPy5taW5WYWx1ZT8udG9TdHJpbmcoKSA/PyBcIjBcIjtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8VXR4b0luZm8+KE1ldGhvZHMuR2V0VXR4b0luZm8sIFtcclxuXHRcdFx0cGtoLFxyXG5cdFx0XHQuLi4oZmlsdGVyID8gW2ZpbHRlcl0gOiBbXSksXHJcblx0XHRdKS50aGVuKChyZXN1bHQ6IFV0eG9JbmZvKSA9PlxyXG5cdFx0XHRyZXN1bHQudXR4b3MubWFwKCh1dHhvOiBVdHhvTWV0YWRhdGEpID0+ICh7XHJcblx0XHRcdFx0Li4udXR4byxcclxuXHRcdFx0XHR2YWx1ZTogQmlnSW50KHV0eG8udmFsdWUpLFxyXG5cdFx0XHR9KSksXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFzeW5jIGdldFZhbHVlVHJhbnNmZXIoXHJcblx0XHR0eEhhc2g6IEhhc2gsXHJcblx0XHRtb2RlPzogc3RyaW5nLFxyXG5cdFx0Zm9yY2UgPSBmYWxzZSxcclxuXHQpOiBQcm9taXNlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxhbnk+KE1ldGhvZHMuR2V0VmFsdWVUcmFuc2Zlciwge1xyXG5cdFx0XHRoYXNoOiB0eEhhc2gsXHJcblx0XHRcdG1vZGU6IG1vZGUsXHJcblx0XHRcdGZvcmNlLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgc2VhcmNoRGF0YVJlcXVlc3RzKFxyXG5cdFx0cmFkSGFzaDogSGFzaCxcclxuXHRcdG9wdGlvbnM/OiB7XHJcblx0XHRcdGxpbWl0PzogbnVtYmVyO1xyXG5cdFx0XHRvZmZzZXQ/OiBudW1iZXI7XHJcblx0XHRcdG1vZGU/OiBHZXREYXRhUmVxdWVzdE1vZGU7XHJcblx0XHRcdHJldmVyc2U/OiBib29sZWFuO1xyXG5cdFx0fSxcclxuXHQpOiBQcm9taXNlPEFycmF5PEdldERhdGFSZXF1ZXN0RXRoZXJlYWxSZXBvcnQgfCBHZXREYXRhUmVxdWVzdEZ1bGxSZXBvcnQ+PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPEFycmF5PGFueVtdPj4oTWV0aG9kcy5TZWFyY2hEYXRhUmVxdWVzdHMsIHtcclxuXHRcdFx0cmFkSGFzaCxcclxuXHRcdFx0bGltaXQ6IG9wdGlvbnM/LmxpbWl0IHx8IDEsXHJcblx0XHRcdG9mZnNldDogb3B0aW9ucz8ub2Zmc2V0IHx8IDAsXHJcblx0XHRcdHJldmVyc2U6ICEob3B0aW9ucz8ucmV2ZXJzZSA9PT0gZmFsc2UpLFxyXG5cdFx0fSkudGhlbihhc3luYyAoZW50cmllcykgPT5cclxuXHRcdFx0UHJvbWlzZS5hbGwoXHJcblx0XHRcdFx0ZW50cmllcy5tYXAoKGVudHJ5OiBhbnlbXSkgPT4ge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0RGF0YVJlcXVlc3QoXHJcblx0XHRcdFx0XHRcdGVudHJ5WzFdLFxyXG5cdFx0XHRcdFx0XHRvcHRpb25zPy5tb2RlIHx8IFwiZXRoZXJlYWxcIixcclxuXHRcdFx0XHRcdFx0dHJ1ZSxcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSksXHJcblx0XHRcdCksXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0Ly8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHB1YmxpYyBhc3luYyBzZW5kUmF3VHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxib29sZWFuPihNZXRob2RzLkludmVudG9yeSwgeyB0cmFuc2FjdGlvbiB9KTtcclxuXHR9XHJcblxyXG5cdC8vLyBHZXQgc3VwcGx5IGluZm9cclxuXHRwdWJsaWMgYXN5bmMgc3VwcGx5SW5mbygpOiBQcm9taXNlPFN1cHBseUluZm8+IHtcclxuXHRcdHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8U3VwcGx5SW5mbz4oTWV0aG9kcy5HZXRTdXBwbHlJbmZvKTtcclxuXHR9XHJcbn1cclxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PublicKeyHashString } from "../crypto/types";
|
|
2
|
-
import { Epoch,
|
|
1
|
+
import type { PublicKeyHashString } from "../crypto/types.js";
|
|
2
|
+
import type { Epoch, f64, Hash, i64, u8, u16, u32, u64, usize } from "../types.js";
|
|
3
3
|
export declare enum Methods {
|
|
4
4
|
AddPeers = "addPeers",
|
|
5
5
|
AuthorizeStake = "authorizeStake",
|