UNPKG

@c4tplatform/caminojs

Version:
258 lines 31.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.utils = exports.platformvm = exports.metrics = exports.keystore = exports.info = exports.index = exports.health = exports.evm = exports.common = exports.avm = exports.auth = exports.admin = exports.Socket = exports.PubSub = exports.Mnemonic = exports.GenesisData = exports.GenesisAsset = exports.HDNode = exports.DB = exports.Buffer = exports.BN = exports.BinTools = exports.AvalancheCore = exports.Avalanche = void 0; /** * @packageDocumentation * @module Avalanche */ const camino_1 = __importDefault(require("./camino")); exports.AvalancheCore = camino_1.default; const api_1 = require("./apis/admin/api"); const api_2 = require("./apis/auth/api"); const api_3 = require("./apis/avm/api"); const api_4 = require("./apis/evm/api"); const genesisasset_1 = require("./apis/avm/genesisasset"); Object.defineProperty(exports, "GenesisAsset", { enumerable: true, get: function () { return genesisasset_1.GenesisAsset; } }); const genesisdata_1 = require("./apis/avm/genesisdata"); Object.defineProperty(exports, "GenesisData", { enumerable: true, get: function () { return genesisdata_1.GenesisData; } }); const api_5 = require("./apis/health/api"); const api_6 = require("./apis/index/api"); const api_7 = require("./apis/info/api"); const api_8 = require("./apis/keystore/api"); const api_9 = require("./apis/metrics/api"); const api_10 = require("./apis/platformvm/api"); const socket_1 = require("./apis/socket/socket"); Object.defineProperty(exports, "Socket", { enumerable: true, get: function () { return socket_1.Socket; } }); const bintools_1 = __importDefault(require("./utils/bintools")); exports.BinTools = bintools_1.default; const db_1 = __importDefault(require("./utils/db")); exports.DB = db_1.default; const mnemonic_1 = __importDefault(require("./utils/mnemonic")); exports.Mnemonic = mnemonic_1.default; const pubsub_1 = __importDefault(require("./utils/pubsub")); exports.PubSub = pubsub_1.default; const hdnode_1 = __importDefault(require("./utils/hdnode")); exports.HDNode = hdnode_1.default; const bn_js_1 = __importDefault(require("bn.js")); exports.BN = bn_js_1.default; const buffer_1 = require("buffer/"); Object.defineProperty(exports, "Buffer", { enumerable: true, get: function () { return buffer_1.Buffer; } }); const networks_1 = __importDefault(require("./utils/networks")); const constants_1 = require("./utils/constants"); const utils_1 = require("./utils"); /** * CaminoJS is middleware for interacting with Camino node RPC APIs. * * Example usage: * ```js * const avalanche: Avalanche = new Avalanche("127.0.0.1", 9650, "https") * ``` * */ class Avalanche extends camino_1.default { /** * Creates a new Avalanche instance. Sets the address and port of the main Avalanche Client. * * @param host The hostname to resolve to reach the Avalanche Client RPC APIs * @param port The port to resolve to reach the Avalanche Client RPC APIs * @param protocol The protocol string to use before a "://" in a request, * ex: "http", "https", "git", "ws", etc. Defaults to http * @param networkID Sets the NetworkID of the class. Default [[DefaultNetworkID]] * @param XChainID Sets the blockchainID for the AVM. Will try to auto-detect, * otherwise default "2eNy1mUFdmaxXNj1eQHUe7Np4gju9sJsEtWQ4MX3ToiNKuADed" * @param CChainID Sets the blockchainID for the EVM. Will try to auto-detect, * otherwise default "2CA6j5zYzasynPsFeNoqWkmTCt3VScMvXUZHbfDJ8k3oGzAPtU" * @param hrp The human-readable part of the bech32 addresses * @param skipinit Skips creating the APIs. Defaults to false */ constructor(host, port, protocol, networkID = undefined, XChainID = undefined, CChainID = undefined) { super(host, port, protocol, networkID); /** * Returns a reference to the Admin RPC. */ this.Admin = () => this.apis.admin; /** * Returns a reference to the Auth RPC. */ this.Auth = () => this.apis.auth; /** * Returns a reference to the EVMAPI RPC pointed at the C-Chain. */ this.CChain = () => this.apis.cchain; /** * Returns a reference to the AVM RPC pointed at the X-Chain. */ this.XChain = () => this.apis.xchain; /** * Returns a reference to the Health RPC for a node. */ this.Health = () => this.apis.health; /** * Returns a reference to the Index RPC for a node. */ this.Index = () => this.apis.index; /** * Returns a reference to the Info RPC for a node. */ this.Info = () => this.apis.info; /** * Returns a reference to the Metrics RPC. */ this.Metrics = () => this.apis.metrics; /** * Returns a reference to the Keystore RPC for a node. We label it "NodeKeys" to reduce * confusion about what it's accessing. */ this.NodeKeys = () => this.apis.keystore; /** * Returns a reference to the PlatformVM RPC pointed at the P-Chain. */ this.PChain = () => this.apis.pchain; this.fetchNetworkSettings = () => __awaiter(this, void 0, void 0, function* () { // Nothing to do if network is known if (this.network) return true; // We need this to be able to make init calls const pAPI = this.apis["pchain"]; const iAPI = this.apis["info"]; this.addAPI("pchain", api_10.PlatformVMAPI); this.addAPI("info", api_7.InfoAPI); //Get platform configuration let response; try { response = yield this.PChain().getConfiguration(); this.networkID = response.networkID; } catch (error) { this.networkID = yield this.Info().getNetworkID(); } if (networks_1.default.isPredefined(this.networkID)) { this.network = networks_1.default.getNetwork(this.networkID); return this.setupAPIs(); } if (!response) { // restore apis this.apis["pchain"] = pAPI; this.apis["info"] = iAPI; throw new Error("Configuration required"); } const xchain = response.blockchains.find((b) => b["name"] === "X-Chain"); const cchain = response.blockchains.find((b) => b["name"] === "C-Chain"); const fees = yield this.Info().getTxFee(); this.network = { hrp: response.hrp, X: { alias: constants_1.XChainAlias, avaxAssetID: response.assetID, avaxAssetAlias: response.assetSymbol, blockchainID: xchain["id"], vm: constants_1.XChainVMName, createAssetTxFee: fees.createAssetTxFee, txFee: fees.txFee }, P: { alias: constants_1.PChainAlias, blockchainID: utils_1.DefaultPlatformChainID, createAssetTxFee: fees.createAssetTxFee, createSubnetTx: fees.createSubnetTxFee, createChainTx: fees.createBlockchainTxFee, maxConsumption: response.maxConsumptionRate, maxStakeDuration: response.maxStakeDuration, maxStakingDuration: new bn_js_1.default(response.maxStakeDuration), maxSupply: response.supplyCap, minConsumption: response.minConsumptionRate, minDelegationFee: response.minDelegationFee, minDelegationStake: response.minDelegatorStake, minStake: response.minValidatorStake, minStakeDuration: response.minStakeDuration, vm: constants_1.PChainVMName, txFee: fees.txFee, verifyNodeSignature: response.verifyNodeSignature, lockModeBondDeposit: response.lockModeBondDeposit }, C: { alias: constants_1.CChainAlias, blockchainID: cchain["id"], chainID: 43112, costPerSignature: 1000, gasPrice: constants_1.GWEI.mul(new bn_js_1.default(225)), maxGasPrice: constants_1.GWEI.mul(new bn_js_1.default(1000)), minGasPrice: constants_1.GWEI.mul(new bn_js_1.default(25)), txBytesGas: 1, txFee: constants_1.MILLIAVAX, vm: constants_1.CChainVMName } }; networks_1.default.registerNetwork(this.networkID, this.network); return this.setupAPIs(); }); this.setupAPIs = (XChainID, CChainID) => { this.addAPI("admin", api_1.AdminAPI); this.addAPI("auth", api_2.AuthAPI); this.addAPI("health", api_5.HealthAPI); this.addAPI("info", api_7.InfoAPI); this.addAPI("index", api_6.IndexAPI); this.addAPI("keystore", api_8.KeystoreAPI); this.addAPI("metrics", api_9.MetricsAPI); this.addAPI("pchain", api_10.PlatformVMAPI); this.addAPI("xchain", api_3.AVMAPI, "/ext/bc/X", XChainID ? XChainID : this.network.X.blockchainID); this.addAPI("cchain", api_4.EVMAPI, "/ext/bc/C/avax", CChainID ? CChainID : this.network.C.blockchainID); return true; }; if (networkID && networks_1.default.isPredefined(networkID)) { this.network = networks_1.default.getNetwork(networkID); this.networkID = networkID; this.setupAPIs(XChainID, CChainID); } } } exports.default = Avalanche; exports.Avalanche = Avalanche; exports.admin = __importStar(require("./apis/admin")); exports.auth = __importStar(require("./apis/auth")); exports.avm = __importStar(require("./apis/avm")); exports.common = __importStar(require("./common")); exports.evm = __importStar(require("./apis/evm")); exports.health = __importStar(require("./apis/health")); exports.index = __importStar(require("./apis/index")); exports.info = __importStar(require("./apis/info")); exports.keystore = __importStar(require("./apis/keystore")); exports.metrics = __importStar(require("./apis/metrics")); exports.platformvm = __importStar(require("./apis/platformvm")); exports.utils = __importStar(require("./utils")); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0dBR0c7QUFDSCxzREFBb0M7QUFtUDNCLHdCQW5QRixnQkFBYSxDQW1QRTtBQWxQdEIsMENBQTJDO0FBQzNDLHlDQUF5QztBQUN6Qyx3Q0FBdUM7QUFDdkMsd0NBQXVDO0FBQ3ZDLDBEQUFzRDtBQW9QN0MsNkZBcFBBLDJCQUFZLE9Bb1BBO0FBblByQix3REFBb0Q7QUFvUDNDLDRGQXBQQSx5QkFBVyxPQW9QQTtBQW5QcEIsMkNBQTZDO0FBQzdDLDBDQUEyQztBQUMzQyx5Q0FBeUM7QUFDekMsNkNBQWlEO0FBQ2pELDRDQUErQztBQUMvQyxnREFBcUQ7QUFDckQsaURBQTZDO0FBZ1BwQyx1RkFoUEEsZUFBTSxPQWdQQTtBQS9PZixnRUFBdUM7QUFzTzlCLG1CQXRPRixrQkFBUSxDQXNPRTtBQXJPakIsb0RBQTJCO0FBd09sQixhQXhPRixZQUFFLENBd09FO0FBdk9YLGdFQUF1QztBQTJPOUIsbUJBM09GLGtCQUFRLENBMk9FO0FBMU9qQiw0REFBbUM7QUEyTzFCLGlCQTNPRixnQkFBTSxDQTJPRTtBQTFPZiw0REFBbUM7QUFzTzFCLGlCQXRPRixnQkFBTSxDQXNPRTtBQXJPZixrREFBc0I7QUFrT2IsYUFsT0YsZUFBRSxDQWtPRTtBQWpPWCxvQ0FBZ0M7QUFrT3ZCLHVGQWxPQSxlQUFNLE9Ba09BO0FBak9mLGdFQUF1QztBQUN2QyxpREFTMEI7QUFDMUIsbUNBQWdEO0FBR2hEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBcUIsU0FBVSxTQUFRLGdCQUFhO0lBb0RsRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILFlBQ0UsSUFBWSxFQUNaLElBQVksRUFDWixRQUFnQixFQUNoQixZQUFvQixTQUFTLEVBQzdCLFdBQW1CLFNBQVMsRUFDNUIsV0FBbUIsU0FB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QUFwTUQsNEJBb01DO0FBRVEsOEJBQVM7QUFhbEIsc0RBQXFDO0FBQ3JDLG9EQUFtQztBQUNuQyxrREFBaUM7QUFDakMsbURBQWtDO0FBQ2xDLGtEQUFpQztBQUNqQyx3REFBdUM7QUFDdkMsc0RBQXFDO0FBQ3JDLG9EQUFtQztBQUNuQyw0REFBMkM7QUFDM0MsMERBQXlDO0FBQ3pDLGdFQUErQztBQUMvQyxpREFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBBdmFsYW5jaGVcbiAqL1xuaW1wb3J0IEF2YWxhbmNoZUNvcmUgZnJvbSBcIi4vY2FtaW5vXCJcbmltcG9ydCB7IEFkbWluQVBJIH0gZnJvbSBcIi4vYXBpcy9hZG1pbi9hcGlcIlxuaW1wb3J0IHsgQXV0aEFQSSB9IGZyb20gXCIuL2FwaXMvYXV0aC9hcGlcIlxuaW1wb3J0IHsgQVZNQVBJIH0gZnJvbSBcIi4vYXBpcy9hdm0vYXBpXCJcbmltcG9ydCB7IEVWTUFQSSB9IGZyb20gXCIuL2FwaXMvZXZtL2FwaVwiXG5pbXBvcnQgeyBHZW5lc2lzQXNzZXQgfSBmcm9tIFwiLi9hcGlzL2F2bS9nZW5lc2lzYXNzZXRcIlxuaW1wb3J0IHsgR2VuZXNpc0RhdGEgfSBmcm9tIFwiLi9hcGlzL2F2bS9nZW5lc2lzZGF0YVwiXG5pbXBvcnQgeyBIZWFsdGhBUEkgfSBmcm9tIFwiLi9hcGlzL2hlYWx0aC9hcGlcIlxuaW1wb3J0IHsgSW5kZXhBUEkgfSBmcm9tIFwiLi9hcGlzL2luZGV4L2FwaVwiXG5pbXBvcnQgeyBJbmZvQVBJIH0gZnJvbSBcIi4vYXBpcy9pbmZvL2FwaVwiXG5pbXBvcnQgeyBLZXlzdG9yZUFQSSB9IGZyb20gXCIuL2FwaXMva2V5c3RvcmUvYXBpXCJcbmltcG9ydCB7IE1ldHJpY3NBUEkgfSBmcm9tIFwiLi9hcGlzL21ldHJpY3MvYXBpXCJcbmltcG9ydCB7IFBsYXRmb3JtVk1BUEkgfSBmcm9tIFwiLi9hcGlzL3BsYXRmb3Jtdm0vYXBpXCJcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gXCIuL2FwaXMvc29ja2V0L3NvY2tldFwiXG5pbXBvcnQgQmluVG9vbHMgZnJvbSBcIi4vdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0IERCIGZyb20gXCIuL3V0aWxzL2RiXCJcbmltcG9ydCBNbmVtb25pYyBmcm9tIFwiLi91dGlscy9tbmVtb25pY1wiXG5pbXBvcnQgUHViU3ViIGZyb20gXCIuL3V0aWxzL3B1YnN1YlwiXG5pbXBvcnQgSEROb2RlIGZyb20gXCIuL3V0aWxzL2hkbm9kZVwiXG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCJcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXIvXCJcbmltcG9ydCBuZXR3b3JrcyBmcm9tIFwiLi91dGlscy9uZXR3b3Jrc1wiXG5pbXBvcnQge1xuICBDQ2hhaW5BbGlhcyxcbiAgQ0NoYWluVk1OYW1lLFxuICBHV0VJLFxuICBNSUxMSUFWQVgsXG4gIFBDaGFpbkFsaWFzLFxuICBQQ2hhaW5WTU5hbWUsXG4gIFhDaGFpbkFsaWFzLFxuICBYQ2hhaW5WTU5hbWVcbn0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCJcbmltcG9ydCB7IERlZmF1bHRQbGF0Zm9ybUNoYWluSUQgfSBmcm9tIFwiLi91dGlsc1wiXG5pbXBvcnQgeyBHZXRDb25maWd1cmF0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi9hcGlzL3BsYXRmb3Jtdm0vaW50ZXJmYWNlc1wiXG5cbi8qKlxuICogQ2FtaW5vSlMgaXMgbWlkZGxld2FyZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDYW1pbm8gbm9kZSBSUEMgQVBJcy5cbiAqXG4gKiBFeGFtcGxlIHVzYWdlOlxuICogYGBganNcbiAqIGNvbnN0IGF2YWxhbmNoZTogQXZhbGFuY2hlID0gbmV3IEF2YWxhbmNoZShcIjEyNy4wLjAuMVwiLCA5NjUwLCBcImh0dHBzXCIpXG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF2YWxhbmNoZSBleHRlbmRzIEF2YWxhbmNoZUNvcmUge1xuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgQWRtaW4gUlBDLlxuICAgKi9cbiAgQWRtaW4gPSAoKSA9PiB0aGlzLmFwaXMuYWRtaW4gYXMgQWRtaW5BUElcblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgQXV0aCBSUEMuXG4gICAqL1xuICBBdXRoID0gKCkgPT4gdGhpcy5hcGlzLmF1dGggYXMgQXV0aEFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBFVk1BUEkgUlBDIHBvaW50ZWQgYXQgdGhlIEMtQ2hhaW4uXG4gICAqL1xuICBDQ2hhaW4gPSAoKSA9PiB0aGlzLmFwaXMuY2NoYWluIGFzIEVWTUFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBBVk0gUlBDIHBvaW50ZWQgYXQgdGhlIFgtQ2hhaW4uXG4gICAqL1xuICBYQ2hhaW4gPSAoKSA9PiB0aGlzLmFwaXMueGNoYWluIGFzIEFWTUFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBIZWFsdGggUlBDIGZvciBhIG5vZGUuXG4gICAqL1xuICBIZWFsdGggPSAoKSA9PiB0aGlzLmFwaXMuaGVhbHRoIGFzIEhlYWx0aEFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBJbmRleCBSUEMgZm9yIGEgbm9kZS5cbiAgICovXG4gIEluZGV4ID0gKCkgPT4gdGhpcy5hcGlzLmluZGV4IGFzIEluZGV4QVBJXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIEluZm8gUlBDIGZvciBhIG5vZGUuXG4gICAqL1xuICBJbmZvID0gKCkgPT4gdGhpcy5hcGlzLmluZm8gYXMgSW5mb0FQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBNZXRyaWNzIFJQQy5cbiAgICovXG4gIE1ldHJpY3MgPSAoKSA9PiB0aGlzLmFwaXMubWV0cmljcyBhcyBNZXRyaWNzQVBJXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIEtleXN0b3JlIFJQQyBmb3IgYSBub2RlLiBXZSBsYWJlbCBpdCBcIk5vZGVLZXlzXCIgdG8gcmVkdWNlXG4gICAqIGNvbmZ1c2lvbiBhYm91dCB3aGF0IGl0J3MgYWNjZXNzaW5nLlxuICAgKi9cbiAgTm9kZUtleXMgPSAoKSA9PiB0aGlzLmFwaXMua2V5c3RvcmUgYXMgS2V5c3RvcmVBUElcblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgUGxhdGZvcm1WTSBSUEMgcG9pbnRlZCBhdCB0aGUgUC1DaGFpbi5cbiAgICovXG4gIFBDaGFpbiA9ICgpID0+IHRoaXMuYXBpcy5wY2hhaW4gYXMgUGxhdGZvcm1WTUFQSVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF2YWxhbmNoZSBpbnN0YW5jZS4gU2V0cyB0aGUgYWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgbWFpbiBBdmFsYW5jaGUgQ2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgaG9zdG5hbWUgdG8gcmVzb2x2ZSB0byByZWFjaCB0aGUgQXZhbGFuY2hlIENsaWVudCBSUEMgQVBJc1xuICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byByZXNvbHZlIHRvIHJlYWNoIHRoZSBBdmFsYW5jaGUgQ2xpZW50IFJQQyBBUElzXG4gICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgcHJvdG9jb2wgc3RyaW5nIHRvIHVzZSBiZWZvcmUgYSBcIjovL1wiIGluIGEgcmVxdWVzdCxcbiAgICogZXg6IFwiaHR0cFwiLCBcImh0dHBzXCIsIFwiZ2l0XCIsIFwid3NcIiwgZXRjLiBEZWZhdWx0cyB0byBodHRwXG4gICAqIEBwYXJhbSBuZXR3b3JrSUQgU2V0cyB0aGUgTmV0d29ya0lEIG9mIHRoZSBjbGFzcy4gRGVmYXVsdCBbW0RlZmF1bHROZXR3b3JrSURdXVxuICAgKiBAcGFyYW0gWENoYWluSUQgU2V0cyB0aGUgYmxvY2tjaGFpbklEIGZvciB0aGUgQVZNLiBXaWxsIHRyeSB0byBhdXRvLWRldGVjdCxcbiAgICogb3RoZXJ3aXNlIGRlZmF1bHQgXCIyZU55MW1VRmRtYXhYTmoxZVFIVWU3TnA0Z2p1OXNKc0V0V1E0TVgzVG9pTkt1QURlZFwiXG4gICAqIEBwYXJhbSBDQ2hhaW5JRCBTZXRzIHRoZSBibG9ja2NoYWluSUQgZm9yIHRoZSBFVk0uIFdpbGwgdHJ5IHRvIGF1dG8tZGV0ZWN0LFxuICAgKiBvdGhlcndpc2UgZGVmYXVsdCBcIjJDQTZqNXpZemFzeW5Qc0ZlTm9xV2ttVEN0M1ZTY012WFVaSGJmREo4azNvR3pBUHRVXCJcbiAgICogQHBhcmFtIGhycCBUaGUgaHVtYW4tcmVhZGFibGUgcGFydCBvZiB0aGUgYmVjaDMyIGFkZHJlc3Nlc1xuICAgKiBAcGFyYW0gc2tpcGluaXQgU2tpcHMgY3JlYXRpbmcgdGhlIEFQSXMuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBzdHJpbmcsXG4gICAgcG9ydDogbnVtYmVyLFxuICAgIHByb3RvY29sOiBzdHJpbmcsXG4gICAgbmV0d29ya0lEOiBudW1iZXIgPSB1bmRlZmluZWQsXG4gICAgWENoYWluSUQ6IHN0cmluZyA9IHVuZGVmaW5lZCxcbiAgICBDQ2hhaW5JRDogc3RyaW5nID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKGhvc3QsIHBvcnQsIHByb3RvY29sLCBuZXR3b3JrSUQpXG5cbiAgICBpZiAobmV0d29ya0lEICYmIG5ldHdvcmtzLmlzUHJlZGVmaW5lZChuZXR3b3JrSUQpKSB7XG4gICAgICB0aGlzLm5ldHdvcmsgPSBuZXR3b3Jrcy5nZXROZXR3b3JrKG5ldHdvcmtJRClcbiAgICAgIHRoaXMubmV0d29ya0lEID0gbmV0d29ya0lEXG4gICAgICB0aGlzLnNldHVwQVBJcyhYQ2hhaW5JRCwgQ0NoYWluSUQpXG4gICAgfVxuICB9XG5cbiAgZmV0Y2hOZXR3b3JrU2V0dGluZ3MgPSBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgLy8gTm90aGluZyB0byBkbyBpZiBuZXR3b3JrIGlzIGtub3duXG4gICAgaWYgKHRoaXMubmV0d29yaykgcmV0dXJuIHRydWVcbiAgICAvLyBXZSBuZWVkIHRoaXMgdG8gYmUgYWJsZSB0byBtYWtlIGluaXQgY2FsbHNcbiAgICBjb25zdCBwQVBJID0gdGhpcy5hcGlzW1wicGNoYWluXCJdXG4gICAgY29uc3QgaUFQSSA9IHRoaXMuYXBpc1tcImluZm9cIl1cbiAgICB0aGlzLmFkZEFQSShcInBjaGFpblwiLCBQbGF0Zm9ybVZNQVBJKVxuICAgIHRoaXMuYWRkQVBJKFwiaW5mb1wiLCBJbmZvQVBJKVxuXG4gICAgLy9HZXQgcGxhdGZvcm0gY29uZmlndXJhdGlvblxuICAgIGxldCByZXNwb25zZTogR2V0Q29uZmlndXJhdGlvblJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLlBDaGFpbigpLmdldENvbmZpZ3VyYXRpb24oKVxuICAgICAgdGhpcy5uZXR3b3JrSUQgPSByZXNwb25zZS5uZXR3b3JrSURcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5uZXR3b3JrSUQgPSBhd2FpdCB0aGlzLkluZm8oKS5nZXROZXR3b3JrSUQoKVxuICAgIH1cblxuICAgIGlmIChuZXR3b3Jrcy5pc1ByZWRlZmluZWQodGhpcy5uZXR3b3JrSUQpKSB7XG4gICAgICB0aGlzLm5ldHdvcmsgPSBuZXR3b3Jrcy5nZXROZXR3b3JrKHRoaXMubmV0d29ya0lEKVxuICAgICAgcmV0dXJuIHRoaXMuc2V0dXBBUElzKClcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAvLyByZXN0b3JlIGFwaXNcbiAgICAgIHRoaXMuYXBpc1tcInBjaGFpblwiXSA9IHBBUElcbiAgICAgIHRoaXMuYXBpc1tcImluZm9cIl0gPSBpQVBJXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbmZpZ3VyYXRpb24gcmVxdWlyZWRcIilcbiAgICB9XG5cbiAgICBjb25zdCB4Y2hhaW4gPSByZXNwb25zZS5ibG9ja2NoYWlucy5maW5kKChiKSA9PiBiW1wibmFtZVwiXSA9PT0gXCJYLUNoYWluXCIpXG4gICAgY29uc3QgY2NoYWluID0gcmVzcG9uc2UuYmxvY2tjaGFpbnMuZmluZCgoYikgPT4gYltcIm5hbWVcIl0gPT09IFwiQy1DaGFpblwiKVxuXG4gICAgY29uc3QgZmVlcyA9IGF3YWl0IHRoaXMuSW5mbygpLmdldFR4RmVlKClcblxuICAgIHRoaXMubmV0d29yayA9IHtcbiAgICAgIGhycDogcmVzcG9uc2UuaHJwLFxuICAgICAgWDoge1xuICAgICAgICBhbGlhczogWENoYWluQWxpYXMsXG4gICAgICAgIGF2YXhBc3NldElEOiByZXNwb25zZS5hc3NldElELFxuICAgICAgICBhdmF4QXNzZXRBbGlhczogcmVzcG9uc2UuYXNzZXRTeW1ib2wsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogeGNoYWluW1wiaWRcIl0sXG4gICAgICAgIHZtOiBYQ2hhaW5WTU5hbWUsXG4gICAgICAgIGNyZWF0ZUFzc2V0VHhGZWU6IGZlZXMuY3JlYXRlQXNzZXRUeEZlZSxcbiAgICAgICAgdHhGZWU6IGZlZXMudHhGZWVcbiAgICAgIH0sXG4gICAgICBQOiB7XG4gICAgICAgIGFsaWFzOiBQQ2hhaW5BbGlhcyxcbiAgICAgICAgYmxvY2tjaGFpbklEOiBEZWZhdWx0UGxhdGZvcm1DaGFpbklELFxuICAgICAgICBjcmVhdGVBc3NldFR4RmVlOiBmZWVzLmNyZWF0ZUFzc2V0VHhGZWUsXG4gICAgICAgIGNyZWF0ZVN1Ym5ldFR4OiBmZWVzLmNyZWF0ZVN1Ym5ldFR4RmVlLFxuICAgICAgICBjcmVhdGVDaGFpblR4OiBmZWVzLmNyZWF0ZUJsb2NrY2hhaW5UeEZlZSxcbiAgICAgICAgbWF4Q29uc3VtcHRpb246IHJlc3BvbnNlLm1heENvbnN1bXB0aW9uUmF0ZSxcbiAgICAgICAgbWF4U3Rha2VEdXJhdGlvbjogcmVzcG9uc2UubWF4U3Rha2VEdXJhdGlvbixcbiAgICAgICAgbWF4U3Rha2luZ0R1cmF0aW9uOiBuZXcgQk4ocmVzcG9uc2UubWF4U3Rha2VEdXJhdGlvbiksXG4gICAgICAgIG1heFN1cHBseTogcmVzcG9uc2Uuc3VwcGx5Q2FwLFxuICAgICAgICBtaW5Db25zdW1wdGlvbjogcmVzcG9uc2UubWluQ29uc3VtcHRpb25SYXRlLFxuICAgICAgICBtaW5EZWxlZ2F0aW9uRmVlOiByZXNwb25zZS5taW5EZWxlZ2F0aW9uRmVlLFxuICAgICAgICBtaW5EZWxlZ2F0aW9uU3Rha2U6IHJlc3BvbnNlLm1pbkRlbGVnYXRvclN0YWtlLFxuICAgICAgICBtaW5TdGFrZTogcmVzcG9uc2UubWluVmFsaWRhdG9yU3Rha2UsXG4gICAgICAgIG1pblN0YWtlRHVyYXRpb246IHJlc3BvbnNlLm1pblN0YWtlRHVyYXRpb24sXG4gICAgICAgIHZtOiBQQ2hhaW5WTU5hbWUsXG4gICAgICAgIHR4RmVlOiBmZWVzLnR4RmVlLFxuICAgICAgICB2ZXJpZnlOb2RlU2lnbmF0dXJlOiByZXNwb25zZS52ZXJpZnlOb2RlU2lnbmF0dXJlLFxuICAgICAgICBsb2NrTW9kZUJvbmREZXBvc2l0OiByZXNwb25zZS5sb2NrTW9kZUJvbmREZXBvc2l0XG4gICAgICB9LFxuICAgICAgQzoge1xuICAgICAgICBhbGlhczogQ0NoYWluQWxpYXMsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogY2NoYWluW1wiaWRcIl0sXG4gICAgICAgIGNoYWluSUQ6IDQzMTEyLFxuICAgICAgICBjb3N0UGVyU2lnbmF0dXJlOiAxMDAwLFxuICAgICAgICBnYXNQcmljZTogR1dFSS5tdWwobmV3IEJOKDIyNSkpLFxuICAgICAgICBtYXhHYXNQcmljZTogR1dFSS5tdWwobmV3IEJOKDEwMDApKSxcbiAgICAgICAgbWluR2FzUHJpY2U6IEdXRUkubXVsKG5ldyBCTigyNSkpLFxuICAgICAgICB0eEJ5dGVzR2FzOiAxLFxuICAgICAgICB0eEZlZTogTUlMTElBVkFYLFxuICAgICAgICB2bTogQ0NoYWluVk1OYW1lXG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV0d29ya3MucmVnaXN0ZXJOZXR3b3JrKHRoaXMubmV0d29ya0lELCB0aGlzLm5ldHdvcmspXG5cbiAgICByZXR1cm4gdGhpcy5zZXR1cEFQSXMoKVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldHVwQVBJcyA9IChYQ2hhaW5JRD86IHN0cmluZywgQ0NoYWluSUQ/OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICB0aGlzLmFkZEFQSShcImFkbWluXCIsIEFkbWluQVBJKVxuICAgIHRoaXMuYWRkQVBJKFwiYXV0aFwiLCBBdXRoQVBJKVxuICAgIHRoaXMuYWRkQVBJKFwiaGVhbHRoXCIsIEhlYWx0aEFQSSlcbiAgICB0aGlzLmFkZEFQSShcImluZm9cIiwgSW5mb0FQSSlcbiAgICB0aGlzLmFkZEFQSShcImluZGV4XCIsIEluZGV4QVBJKVxuICAgIHRoaXMuYWRkQVBJKFwia2V5c3RvcmVcIiwgS2V5c3RvcmVBUEkpXG4gICAgdGhpcy5hZGRBUEkoXCJtZXRyaWNzXCIsIE1ldHJpY3NBUEkpXG5cbiAgICB0aGlzLmFkZEFQSShcInBjaGFpblwiLCBQbGF0Zm9ybVZNQVBJKVxuICAgIHRoaXMuYWRkQVBJKFxuICAgICAgXCJ4Y2hhaW5cIixcbiAgICAgIEFWTUFQSSxcbiAgICAgIFwiL2V4dC9iYy9YXCIsXG4gICAgICBYQ2hhaW5JRCA/IFhDaGFpbklEIDogdGhpcy5uZXR3b3JrLlguYmxvY2tjaGFpbklEXG4gICAgKVxuICAgIHRoaXMuYWRkQVBJKFxuICAgICAgXCJjY2hhaW5cIixcbiAgICAgIEVWTUFQSSxcbiAgICAgIFwiL2V4dC9iYy9DL2F2YXhcIixcbiAgICAgIENDaGFpbklEID8gQ0NoYWluSUQgOiB0aGlzLm5ldHdvcmsuQy5ibG9ja2NoYWluSURcbiAgICApXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCB7IEF2YWxhbmNoZSB9XG5leHBvcnQgeyBBdmFsYW5jaGVDb3JlIH1cbmV4cG9ydCB7IEJpblRvb2xzIH1cbmV4cG9ydCB7IEJOIH1cbmV4cG9ydCB7IEJ1ZmZlciB9XG5leHBvcnQgeyBEQiB9XG5leHBvcnQgeyBIRE5vZGUgfVxuZXhwb3J0IHsgR2VuZXNpc0Fzc2V0IH1cbmV4cG9ydCB7IEdlbmVzaXNEYXRhIH1cbmV4cG9ydCB7IE1uZW1vbmljIH1cbmV4cG9ydCB7IFB1YlN1YiB9XG5leHBvcnQgeyBTb2NrZXQgfVxuXG5leHBvcnQgKiBhcyBhZG1pbiBmcm9tIFwiLi9hcGlzL2FkbWluXCJcbmV4cG9ydCAqIGFzIGF1dGggZnJvbSBcIi4vYXBpcy9hdXRoXCJcbmV4cG9ydCAqIGFzIGF2bSBmcm9tIFwiLi9hcGlzL2F2bVwiXG5leHBvcnQgKiBhcyBjb21tb24gZnJvbSBcIi4vY29tbW9uXCJcbmV4cG9ydCAqIGFzIGV2bSBmcm9tIFwiLi9hcGlzL2V2bVwiXG5leHBvcnQgKiBhcyBoZWFsdGggZnJvbSBcIi4vYXBpcy9oZWFsdGhcIlxuZXhwb3J0ICogYXMgaW5kZXggZnJvbSBcIi4vYXBpcy9pbmRleFwiXG5leHBvcnQgKiBhcyBpbmZvIGZyb20gXCIuL2FwaXMvaW5mb1wiXG5leHBvcnQgKiBhcyBrZXlzdG9yZSBmcm9tIFwiLi9hcGlzL2tleXN0b3JlXCJcbmV4cG9ydCAqIGFzIG1ldHJpY3MgZnJvbSBcIi4vYXBpcy9tZXRyaWNzXCJcbmV4cG9ydCAqIGFzIHBsYXRmb3Jtdm0gZnJvbSBcIi4vYXBpcy9wbGF0Zm9ybXZtXCJcbmV4cG9ydCAqIGFzIHV0aWxzIGZyb20gXCIuL3V0aWxzXCJcbiJdfQ==