UNPKG

@kubectl/caminojs

Version:
256 lines 31.2 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, skipinit = false) { 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 be able to make next call this.addAPI("pchain", api_10.PlatformVMAPI); //Get platform configuration let response; try { response = yield this.PChain().getConfiguration(); this.networkID = response.networkID; } catch (error) { this.networkID = yield this.Info().getNetworkID(); } if ((this.network = networks_1.default.getNetwork(this.networkID))) return this.refreshAPI(); if (!response) { 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, creationTxFee: fees.creationTxFee, txFee: fees.txFee }, P: { alias: constants_1.PChainAlias, blockchainID: utils_1.DefaultPlatformChainID, creationTxFee: fees.creationTxFee, 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 }, 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.refreshAPI(); }); this.refreshAPI = () => { // Re-apply pchain which creates the correct keychain this.addAPI("pchain", api_10.PlatformVMAPI); // Finally register x and c chains this.addAPI("xchain", api_3.AVMAPI, "/ext/bc/X", this.network.X.blockchainID); this.addAPI("cchain", api_4.EVMAPI, "/ext/bc/C/avax", this.network.C.blockchainID); return true; }; if (!skipinit) { 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); } // Static initializing if (networkID && (this.network = networks_1.default.getNetwork(networkID))) { this.networkID = networkID; if (!skipinit) { 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); } } } } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0dBR0c7QUFDSCxzREFBb0M7QUFnUDNCLHdCQWhQRixnQkFBYSxDQWdQRTtBQS9PdEIsMENBQTJDO0FBQzNDLHlDQUF5QztBQUN6Qyx3Q0FBdUM7QUFDdkMsd0NBQXVDO0FBQ3ZDLDBEQUFzRDtBQWlQN0MsNkZBalBBLDJCQUFZLE9BaVBBO0FBaFByQix3REFBb0Q7QUFpUDNDLDRGQWpQQSx5QkFBVyxPQWlQQTtBQWhQcEIsMkNBQTZDO0FBQzdDLDBDQUEyQztBQUMzQyx5Q0FBeUM7QUFDekMsNkNBQWlEO0FBQ2pELDRDQUErQztBQUMvQyxnREFBcUQ7QUFDckQsaURBQTZDO0FBNk9wQyx1RkE3T0EsZUFBTSxPQTZPQTtBQTVPZixnRUFBdUM7QUFtTzlCLG1CQW5PRixrQkFBUSxDQW1PRTtBQWxPakIsb0RBQTJCO0FBcU9sQixhQXJPRixZQUFFLENBcU9FO0FBcE9YLGdFQUF1QztBQXdPOUIsbUJBeE9GLGtCQUFRLENBd09FO0FBdk9qQiw0REFBbUM7QUF3TzFCLGlCQXhPRixnQkFBTSxDQXdPRTtBQXZPZiw0REFBbUM7QUFtTzFCLGlCQW5PRixnQkFBTSxDQW1PRTtBQWxPZixrREFBc0I7QUErTmIsYUEvTkYsZUFBRSxDQStORTtBQTlOWCxvQ0FBZ0M7QUErTnZCLHVGQS9OQSxlQUFNLE9BK05BO0FBOU5mLGdFQUF1QztBQUN2QyxpREFTMEI7QUFDMUIsbUNBQWdEO0FBR2hEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBcUIsU0FBVSxTQUFRLGdCQUFhO0lBb0RsRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILFlBQ0UsSUFBWSxFQUNaLElBQVksRUFDWixRQUFnQixFQUNoQixZQUFvQixTQUFTLEVBQzdCLFdBQW1CLFNBQVMsRUFDNUIsV0FBbUIs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MkM7QUFDM0MsMERBQXlDO0FBQ3pDLGdFQUErQztBQUMvQyxpREFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBBdmFsYW5jaGVcbiAqL1xuaW1wb3J0IEF2YWxhbmNoZUNvcmUgZnJvbSBcIi4vY2FtaW5vXCJcbmltcG9ydCB7IEFkbWluQVBJIH0gZnJvbSBcIi4vYXBpcy9hZG1pbi9hcGlcIlxuaW1wb3J0IHsgQXV0aEFQSSB9IGZyb20gXCIuL2FwaXMvYXV0aC9hcGlcIlxuaW1wb3J0IHsgQVZNQVBJIH0gZnJvbSBcIi4vYXBpcy9hdm0vYXBpXCJcbmltcG9ydCB7IEVWTUFQSSB9IGZyb20gXCIuL2FwaXMvZXZtL2FwaVwiXG5pbXBvcnQgeyBHZW5lc2lzQXNzZXQgfSBmcm9tIFwiLi9hcGlzL2F2bS9nZW5lc2lzYXNzZXRcIlxuaW1wb3J0IHsgR2VuZXNpc0RhdGEgfSBmcm9tIFwiLi9hcGlzL2F2bS9nZW5lc2lzZGF0YVwiXG5pbXBvcnQgeyBIZWFsdGhBUEkgfSBmcm9tIFwiLi9hcGlzL2hlYWx0aC9hcGlcIlxuaW1wb3J0IHsgSW5kZXhBUEkgfSBmcm9tIFwiLi9hcGlzL2luZGV4L2FwaVwiXG5pbXBvcnQgeyBJbmZvQVBJIH0gZnJvbSBcIi4vYXBpcy9pbmZvL2FwaVwiXG5pbXBvcnQgeyBLZXlzdG9yZUFQSSB9IGZyb20gXCIuL2FwaXMva2V5c3RvcmUvYXBpXCJcbmltcG9ydCB7IE1ldHJpY3NBUEkgfSBmcm9tIFwiLi9hcGlzL21ldHJpY3MvYXBpXCJcbmltcG9ydCB7IFBsYXRmb3JtVk1BUEkgfSBmcm9tIFwiLi9hcGlzL3BsYXRmb3Jtdm0vYXBpXCJcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gXCIuL2FwaXMvc29ja2V0L3NvY2tldFwiXG5pbXBvcnQgQmluVG9vbHMgZnJvbSBcIi4vdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0IERCIGZyb20gXCIuL3V0aWxzL2RiXCJcbmltcG9ydCBNbmVtb25pYyBmcm9tIFwiLi91dGlscy9tbmVtb25pY1wiXG5pbXBvcnQgUHViU3ViIGZyb20gXCIuL3V0aWxzL3B1YnN1YlwiXG5pbXBvcnQgSEROb2RlIGZyb20gXCIuL3V0aWxzL2hkbm9kZVwiXG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCJcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXIvXCJcbmltcG9ydCBuZXR3b3JrcyBmcm9tIFwiLi91dGlscy9uZXR3b3Jrc1wiXG5pbXBvcnQge1xuICBDQ2hhaW5BbGlhcyxcbiAgQ0NoYWluVk1OYW1lLFxuICBHV0VJLFxuICBNSUxMSUFWQVgsXG4gIFBDaGFpbkFsaWFzLFxuICBQQ2hhaW5WTU5hbWUsXG4gIFhDaGFpbkFsaWFzLFxuICBYQ2hhaW5WTU5hbWVcbn0gZnJvbSBcIi4vdXRpbHMvY29uc3RhbnRzXCJcbmltcG9ydCB7IERlZmF1bHRQbGF0Zm9ybUNoYWluSUQgfSBmcm9tIFwiLi91dGlsc1wiXG5pbXBvcnQgeyBHZXRDb25maWd1cmF0aW9uUmVzcG9uc2UgfSBmcm9tIFwiLi9hcGlzL3BsYXRmb3Jtdm0vaW50ZXJmYWNlc1wiXG5cbi8qKlxuICogQ2FtaW5vSlMgaXMgbWlkZGxld2FyZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDYW1pbm8gbm9kZSBSUEMgQVBJcy5cbiAqXG4gKiBFeGFtcGxlIHVzYWdlOlxuICogYGBganNcbiAqIGNvbnN0IGF2YWxhbmNoZTogQXZhbGFuY2hlID0gbmV3IEF2YWxhbmNoZShcIjEyNy4wLjAuMVwiLCA5NjUwLCBcImh0dHBzXCIpXG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF2YWxhbmNoZSBleHRlbmRzIEF2YWxhbmNoZUNvcmUge1xuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgQWRtaW4gUlBDLlxuICAgKi9cbiAgQWRtaW4gPSAoKSA9PiB0aGlzLmFwaXMuYWRtaW4gYXMgQWRtaW5BUElcblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgQXV0aCBSUEMuXG4gICAqL1xuICBBdXRoID0gKCkgPT4gdGhpcy5hcGlzLmF1dGggYXMgQXV0aEFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBFVk1BUEkgUlBDIHBvaW50ZWQgYXQgdGhlIEMtQ2hhaW4uXG4gICAqL1xuICBDQ2hhaW4gPSAoKSA9PiB0aGlzLmFwaXMuY2NoYWluIGFzIEVWTUFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBBVk0gUlBDIHBvaW50ZWQgYXQgdGhlIFgtQ2hhaW4uXG4gICAqL1xuICBYQ2hhaW4gPSAoKSA9PiB0aGlzLmFwaXMueGNoYWluIGFzIEFWTUFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBIZWFsdGggUlBDIGZvciBhIG5vZGUuXG4gICAqL1xuICBIZWFsdGggPSAoKSA9PiB0aGlzLmFwaXMuaGVhbHRoIGFzIEhlYWx0aEFQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBJbmRleCBSUEMgZm9yIGEgbm9kZS5cbiAgICovXG4gIEluZGV4ID0gKCkgPT4gdGhpcy5hcGlzLmluZGV4IGFzIEluZGV4QVBJXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIEluZm8gUlBDIGZvciBhIG5vZGUuXG4gICAqL1xuICBJbmZvID0gKCkgPT4gdGhpcy5hcGlzLmluZm8gYXMgSW5mb0FQSVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBNZXRyaWNzIFJQQy5cbiAgICovXG4gIE1ldHJpY3MgPSAoKSA9PiB0aGlzLmFwaXMubWV0cmljcyBhcyBNZXRyaWNzQVBJXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIEtleXN0b3JlIFJQQyBmb3IgYSBub2RlLiBXZSBsYWJlbCBpdCBcIk5vZGVLZXlzXCIgdG8gcmVkdWNlXG4gICAqIGNvbmZ1c2lvbiBhYm91dCB3aGF0IGl0J3MgYWNjZXNzaW5nLlxuICAgKi9cbiAgTm9kZUtleXMgPSAoKSA9PiB0aGlzLmFwaXMua2V5c3RvcmUgYXMgS2V5c3RvcmVBUElcblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgUGxhdGZvcm1WTSBSUEMgcG9pbnRlZCBhdCB0aGUgUC1DaGFpbi5cbiAgICovXG4gIFBDaGFpbiA9ICgpID0+IHRoaXMuYXBpcy5wY2hhaW4gYXMgUGxhdGZvcm1WTUFQSVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF2YWxhbmNoZSBpbnN0YW5jZS4gU2V0cyB0aGUgYWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgbWFpbiBBdmFsYW5jaGUgQ2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgaG9zdG5hbWUgdG8gcmVzb2x2ZSB0byByZWFjaCB0aGUgQXZhbGFuY2hlIENsaWVudCBSUEMgQVBJc1xuICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byByZXNvbHZlIHRvIHJlYWNoIHRoZSBBdmFsYW5jaGUgQ2xpZW50IFJQQyBBUElzXG4gICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgcHJvdG9jb2wgc3RyaW5nIHRvIHVzZSBiZWZvcmUgYSBcIjovL1wiIGluIGEgcmVxdWVzdCxcbiAgICogZXg6IFwiaHR0cFwiLCBcImh0dHBzXCIsIFwiZ2l0XCIsIFwid3NcIiwgZXRjLiBEZWZhdWx0cyB0byBodHRwXG4gICAqIEBwYXJhbSBuZXR3b3JrSUQgU2V0cyB0aGUgTmV0d29ya0lEIG9mIHRoZSBjbGFzcy4gRGVmYXVsdCBbW0RlZmF1bHROZXR3b3JrSURdXVxuICAgKiBAcGFyYW0gWENoYWluSUQgU2V0cyB0aGUgYmxvY2tjaGFpbklEIGZvciB0aGUgQVZNLiBXaWxsIHRyeSB0byBhdXRvLWRldGVjdCxcbiAgICogb3RoZXJ3aXNlIGRlZmF1bHQgXCIyZU55MW1VRmRtYXhYTmoxZVFIVWU3TnA0Z2p1OXNKc0V0V1E0TVgzVG9pTkt1QURlZFwiXG4gICAqIEBwYXJhbSBDQ2hhaW5JRCBTZXRzIHRoZSBibG9ja2NoYWluSUQgZm9yIHRoZSBFVk0uIFdpbGwgdHJ5IHRvIGF1dG8tZGV0ZWN0LFxuICAgKiBvdGhlcndpc2UgZGVmYXVsdCBcIjJDQTZqNXpZemFzeW5Qc0ZlTm9xV2ttVEN0M1ZTY012WFVaSGJmREo4azNvR3pBUHRVXCJcbiAgICogQHBhcmFtIGhycCBUaGUgaHVtYW4tcmVhZGFibGUgcGFydCBvZiB0aGUgYmVjaDMyIGFkZHJlc3Nlc1xuICAgKiBAcGFyYW0gc2tpcGluaXQgU2tpcHMgY3JlYXRpbmcgdGhlIEFQSXMuIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBzdHJpbmcsXG4gICAgcG9ydDogbnVtYmVyLFxuICAgIHByb3RvY29sOiBzdHJpbmcsXG4gICAgbmV0d29ya0lEOiBudW1iZXIgPSB1bmRlZmluZWQsXG4gICAgWENoYWluSUQ6IHN0cmluZyA9IHVuZGVmaW5lZCxcbiAgICBDQ2hhaW5JRDogc3RyaW5nID0gdW5kZWZpbmVkLFxuICAgIHNraXBpbml0OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgc3VwZXIoaG9zdCwgcG9ydCwgcHJvdG9jb2wsIG5ldHdvcmtJRClcbiAgICBpZiAoIXNraXBpbml0KSB7XG4gICAgICB0aGlzLmFkZEFQSShcImFkbWluXCIsIEFkbWluQVBJKVxuICAgICAgdGhpcy5hZGRBUEkoXCJhdXRoXCIsIEF1dGhBUEkpXG4gICAgICB0aGlzLmFkZEFQSShcImhlYWx0aFwiLCBIZWFsdGhBUEkpXG4gICAgICB0aGlzLmFkZEFQSShcImluZm9cIiwgSW5mb0FQSSlcbiAgICAgIHRoaXMuYWRkQVBJKFwiaW5kZXhcIiwgSW5kZXhBUEkpXG4gICAgICB0aGlzLmFkZEFQSShcImtleXN0b3JlXCIsIEtleXN0b3JlQVBJKVxuICAgICAgdGhpcy5hZGRBUEkoXCJtZXRyaWNzXCIsIE1ldHJpY3NBUEkpXG4gICAgfVxuXG4gICAgLy8gU3RhdGljIGluaXRpYWxpemluZ1xuICAgIGlmIChuZXR3b3JrSUQgJiYgKHRoaXMubmV0d29yayA9IG5ldHdvcmtzLmdldE5ldHdvcmsobmV0d29ya0lEKSkpIHtcbiAgICAgIHRoaXMubmV0d29ya0lEID0gbmV0d29ya0lEXG4gICAgICBpZiAoIXNraXBpbml0KSB7XG4gICAgICAgIHRoaXMuYWRkQVBJKFwicGNoYWluXCIsIFBsYXRmb3JtVk1BUEkpXG4gICAgICAgIHRoaXMuYWRkQVBJKFxuICAgICAgICAgIFwieGNoYWluXCIsXG4gICAgICAgICAgQVZNQVBJLFxuICAgICAgICAgIFwiL2V4dC9iYy9YXCIsXG4gICAgICAgICAgWENoYWluSUQgPyBYQ2hhaW5JRCA6IHRoaXMubmV0d29yay5YLmJsb2NrY2hhaW5JRFxuICAgICAgICApXG4gICAgICAgIHRoaXMuYWRkQVBJKFxuICAgICAgICAgIFwiY2NoYWluXCIsXG4gICAgICAgICAgRVZNQVBJLFxuICAgICAgICAgIFwiL2V4dC9iYy9DL2F2YXhcIixcbiAgICAgICAgICBDQ2hhaW5JRCA/IENDaGFpbklEIDogdGhpcy5uZXR3b3JrLkMuYmxvY2tjaGFpbklEXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmZXRjaE5ldHdvcmtTZXR0aW5ncyA9IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIG5ldHdvcmsgaXMga25vd25cbiAgICBpZiAodGhpcy5uZXR3b3JrKSByZXR1cm4gdHJ1ZVxuICAgIC8vIFdlIG5lZWQgdGhpcyBiZSBhYmxlIHRvIG1ha2UgbmV4dCBjYWxsXG4gICAgdGhpcy5hZGRBUEkoXCJwY2hhaW5cIiwgUGxhdGZvcm1WTUFQSSlcbiAgICAvL0dldCBwbGF0Zm9ybSBjb25maWd1cmF0aW9uXG4gICAgbGV0IHJlc3BvbnNlOiBHZXRDb25maWd1cmF0aW9uUmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuUENoYWluKCkuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgICB0aGlzLm5ldHdvcmtJRCA9IHJlc3BvbnNlLm5ldHdvcmtJRFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm5ldHdvcmtJRCA9IGF3YWl0IHRoaXMuSW5mbygpLmdldE5ldHdvcmtJRCgpXG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLm5ldHdvcmsgPSBuZXR3b3Jrcy5nZXROZXR3b3JrKHRoaXMubmV0d29ya0lEKSkpXG4gICAgICByZXR1cm4gdGhpcy5yZWZyZXNoQVBJKClcblxuICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbmZpZ3VyYXRpb24gcmVxdWlyZWRcIilcbiAgICB9XG5cbiAgICBjb25zdCB4Y2hhaW4gPSByZXNwb25zZS5ibG9ja2NoYWlucy5maW5kKChiKSA9PiBiW1wibmFtZVwiXSA9PT0gXCJYLUNoYWluXCIpXG4gICAgY29uc3QgY2NoYWluID0gcmVzcG9uc2UuYmxvY2tjaGFpbnMuZmluZCgoYikgPT4gYltcIm5hbWVcIl0gPT09IFwiQy1DaGFpblwiKVxuXG4gICAgY29uc3QgZmVlcyA9IGF3YWl0IHRoaXMuSW5mbygpLmdldFR4RmVlKClcblxuICAgIHRoaXMubmV0d29yayA9IHtcbiAgICAgIGhycDogcmVzcG9uc2UuaHJwLFxuICAgICAgWDoge1xuICAgICAgICBhbGlhczogWENoYWluQWxpYXMsXG4gICAgICAgIGF2YXhBc3NldElEOiByZXNwb25zZS5hc3NldElELFxuICAgICAgICBhdmF4QXNzZXRBbGlhczogcmVzcG9uc2UuYXNzZXRTeW1ib2wsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogeGNoYWluW1wiaWRcIl0sXG4gICAgICAgIHZtOiBYQ2hhaW5WTU5hbWUsXG4gICAgICAgIGNyZWF0aW9uVHhGZWU6IGZlZXMuY3JlYXRpb25UeEZlZSxcbiAgICAgICAgdHhGZWU6IGZlZXMudHhGZWVcbiAgICAgIH0sXG4gICAgICBQOiB7XG4gICAgICAgIGFsaWFzOiBQQ2hhaW5BbGlhcyxcbiAgICAgICAgYmxvY2tjaGFpbklEOiBEZWZhdWx0UGxhdGZvcm1DaGFpbklELFxuICAgICAgICBjcmVhdGlvblR4RmVlOiBmZWVzLmNyZWF0aW9uVHhGZWUsXG4gICAgICAgIGNyZWF0ZVN1Ym5ldFR4OiBmZWVzLmNyZWF0ZVN1Ym5ldFR4RmVlLFxuICAgICAgICBjcmVhdGVDaGFpblR4OiBmZWVzLmNyZWF0ZUJsb2NrY2hhaW5UeEZlZSxcbiAgICAgICAgbWF4Q29uc3VtcHRpb246IHJlc3BvbnNlLm1heENvbnN1bXB0aW9uUmF0ZSxcbiAgICAgICAgbWF4U3Rha2VEdXJhdGlvbjogcmVzcG9uc2UubWF4U3Rha2VEdXJhdGlvbixcbiAgICAgICAgbWF4U3Rha2luZ0R1cmF0aW9uOiBuZXcgQk4ocmVzcG9uc2UubWF4U3Rha2VEdXJhdGlvbiksXG4gICAgICAgIG1heFN1cHBseTogcmVzcG9uc2Uuc3VwcGx5Q2FwLFxuICAgICAgICBtaW5Db25zdW1wdGlvbjogcmVzcG9uc2UubWluQ29uc3VtcHRpb25SYXRlLFxuICAgICAgICBtaW5EZWxlZ2F0aW9uRmVlOiByZXNwb25zZS5taW5EZWxlZ2F0aW9uRmVlLFxuICAgICAgICBtaW5EZWxlZ2F0aW9uU3Rha2U6IHJlc3BvbnNlLm1pbkRlbGVnYXRvclN0YWtlLFxuICAgICAgICBtaW5TdGFrZTogcmVzcG9uc2UubWluVmFsaWRhdG9yU3Rha2UsXG4gICAgICAgIG1pblN0YWtlRHVyYXRpb246IHJlc3BvbnNlLm1pblN0YWtlRHVyYXRpb24sXG4gICAgICAgIHZtOiBQQ2hhaW5WTU5hbWUsXG4gICAgICAgIHR4RmVlOiBmZWVzLnR4RmVlXG4gICAgICB9LFxuICAgICAgQzoge1xuICAgICAgICBhbGlhczogQ0NoYWluQWxpYXMsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogY2NoYWluW1wiaWRcIl0sXG4gICAgICAgIGNoYWluSUQ6IDQzMTEyLFxuICAgICAgICBjb3N0UGVyU2lnbmF0dXJlOiAxMDAwLFxuICAgICAgICBnYXNQcmljZTogR1dFSS5tdWwobmV3IEJOKDIyNSkpLFxuICAgICAgICBtYXhHYXNQcmljZTogR1dFSS5tdWwobmV3IEJOKDEwMDApKSxcbiAgICAgICAgbWluR2FzUHJpY2U6IEdXRUkubXVsKG5ldyBCTigyNSkpLFxuICAgICAgICB0eEJ5dGVzR2FzOiAxLFxuICAgICAgICB0eEZlZTogTUlMTElBVkFYLFxuICAgICAgICB2bTogQ0NoYWluVk1OYW1lXG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV0d29ya3MucmVnaXN0ZXJOZXR3b3JrKHRoaXMubmV0d29ya0lELCB0aGlzLm5ldHdvcmspXG5cbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoQVBJKClcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoQVBJID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIC8vIFJlLWFwcGx5IHBjaGFpbiB3aGljaCBjcmVhdGVzIHRoZSBjb3JyZWN0IGtleWNoYWluXG4gICAgdGhpcy5hZGRBUEkoXCJwY2hhaW5cIiwgUGxhdGZvcm1WTUFQSSlcblxuICAgIC8vIEZpbmFsbHkgcmVnaXN0ZXIgeCBhbmQgYyBjaGFpbnNcbiAgICB0aGlzLmFkZEFQSShcInhjaGFpblwiLCBBVk1BUEksIFwiL2V4dC9iYy9YXCIsIHRoaXMubmV0d29yay5YLmJsb2NrY2hhaW5JRClcbiAgICB0aGlzLmFkZEFQSShcImNjaGFpblwiLCBFVk1BUEksIFwiL2V4dC9iYy9DL2F2YXhcIiwgdGhpcy5uZXR3b3JrLkMuYmxvY2tjaGFpbklEKVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5leHBvcnQgeyBBdmFsYW5jaGUgfVxuZXhwb3J0IHsgQXZhbGFuY2hlQ29yZSB9XG5leHBvcnQgeyBCaW5Ub29scyB9XG5leHBvcnQgeyBCTiB9XG5leHBvcnQgeyBCdWZmZXIgfVxuZXhwb3J0IHsgREIgfVxuZXhwb3J0IHsgSEROb2RlIH1cbmV4cG9ydCB7IEdlbmVzaXNBc3NldCB9XG5leHBvcnQgeyBHZW5lc2lzRGF0YSB9XG5leHBvcnQgeyBNbmVtb25pYyB9XG5leHBvcnQgeyBQdWJTdWIgfVxuZXhwb3J0IHsgU29ja2V0IH1cblxuZXhwb3J0ICogYXMgYWRtaW4gZnJvbSBcIi4vYXBpcy9hZG1pblwiXG5leHBvcnQgKiBhcyBhdXRoIGZyb20gXCIuL2FwaXMvYXV0aFwiXG5leHBvcnQgKiBhcyBhdm0gZnJvbSBcIi4vYXBpcy9hdm1cIlxuZXhwb3J0ICogYXMgY29tbW9uIGZyb20gXCIuL2NvbW1vblwiXG5leHBvcnQgKiBhcyBldm0gZnJvbSBcIi4vYXBpcy9ldm1cIlxuZXhwb3J0ICogYXMgaGVhbHRoIGZyb20gXCIuL2FwaXMvaGVhbHRoXCJcbmV4cG9ydCAqIGFzIGluZGV4IGZyb20gXCIuL2FwaXMvaW5kZXhcIlxuZXhwb3J0ICogYXMgaW5mbyBmcm9tIFwiLi9hcGlzL2luZm9cIlxuZXhwb3J0ICogYXMga2V5c3RvcmUgZnJvbSBcIi4vYXBpcy9rZXlzdG9yZVwiXG5leHBvcnQgKiBhcyBtZXRyaWNzIGZyb20gXCIuL2FwaXMvbWV0cmljc1wiXG5leHBvcnQgKiBhcyBwbGF0Zm9ybXZtIGZyb20gXCIuL2FwaXMvcGxhdGZvcm12bVwiXG5leHBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi91dGlsc1wiXG4iXX0=