PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-trx/dist/src/lib
Просмотр файла: unfreezeBalanceTxBuilder.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnfreezeBalanceTxBuilder = void 0;
const crypto_1 = require("crypto");
const sdk_core_1 = require("@bitgo/sdk-core");
const transactionBuilder_1 = require("./transactionBuilder");
const transaction_1 = require("./transaction");
const utils_1 = require("./utils");
const tron_1 = require("../../resources/protobuf/tron");
var ContractType = tron_1.protocol.Transaction.Contract.ContractType;
class UnfreezeBalanceTxBuilder extends transactionBuilder_1.TransactionBuilder {
constructor(_coinConfig) {
super(_coinConfig);
this._signingKeys = [];
this.transaction = new transaction_1.Transaction(_coinConfig);
}
/** @inheritdoc */
get transactionType() {
return sdk_core_1.TransactionType.StakingDeactivate;
}
/**
* Set the unfrozen balance amount
*
* @param amount amount in TRX to unfreeze
* @returns the builder with the new parameter set
*/
setUnfreezeBalance(amount) {
this._unfreezeBalance = amount;
return this;
}
/**
* Set the resource type
*
* @param resource resource type to unfreeze
* @returns the builder with the new parameter set
*/
setResource(resource) {
this.validateResource(resource);
this._resource = resource;
return this;
}
/** @inheritdoc */
extendValidTo(extensionMs) {
if (this.transaction.signature && this.transaction.signature.length > 0) {
throw new sdk_core_1.ExtendTransactionError('Cannot extend a signed transaction');
}
if (extensionMs <= 0) {
throw new Error('Value cannot be below zero');
}
if (extensionMs > utils_1.TRANSACTION_MAX_EXPIRATION) {
throw new sdk_core_1.ExtendTransactionError('The expiration cannot be extended more than one year');
}
if (this._expiration) {
this._expiration = this._expiration + extensionMs;
}
else {
throw new Error('There is not expiration to extend');
}
}
initBuilder(rawTransaction) {
this.transaction = this.fromImplementation(rawTransaction);
this.transaction.setTransactionType(this.transactionType);
this.validateRawTransaction(rawTransaction);
const tx = this.fromImplementation(rawTransaction);
this.transaction = tx;
this._signingKeys = [];
const rawData = tx.toJson().raw_data;
this._refBlockBytes = rawData.ref_block_bytes;
this._refBlockHash = rawData.ref_block_hash;
this._expiration = rawData.expiration;
this._timestamp = rawData.timestamp;
const contractCall = rawData.contract[0];
this.initUnfreezeContractCall(contractCall);
return this;
}
/**
* Initialize the freeze contract call specific data
*
* @param {UnfreezeBalanceV2Contract} unfreezeContractCall object with freeze txn data
*/
initUnfreezeContractCall(unfreezeContractCall) {
const { resource, owner_address, unfreeze_balance } = unfreezeContractCall.parameter.value;
if (owner_address) {
this.source({ address: (0, utils_1.getBase58AddressFromHex)(owner_address) });
}
if (resource) {
this.setResource(resource);
}
if (unfreeze_balance) {
this.setUnfreezeBalance(unfreeze_balance.toString());
}
}
async buildImplementation() {
this.createUnfreezeBalanceTransaction();
/** @inheritdoccreateTransaction */
// This method must be extended on child classes
if (this._signingKeys.length > 0) {
this.applySignatures();
}
if (!this.transaction.id) {
throw new sdk_core_1.BuildTransactionError('A valid transaction must have an id');
}
return Promise.resolve(this.transaction);
}
/**
* Helper method to create the freeze balance transaction
*/
createUnfreezeBalanceTransaction() {
const rawDataHex = this.getUnfreezeRawDataHex();
const rawData = (0, utils_1.decodeTransaction)(rawDataHex);
const contract = rawData.contract[0];
const contractParameter = contract.parameter;
contractParameter.value.owner_address = this._ownerAddress.toLocaleLowerCase();
contractParameter.value.unfreeze_balance = Number(this._unfreezeBalance);
contractParameter.value.resource = this._resource;
contractParameter.type_url = 'type.googleapis.com/protocol.UnfreezeBalanceV2Contract';
contract.type = 'UnfreezeBalanceV2Contract';
const hexBuffer = Buffer.from(rawDataHex, 'hex');
const id = (0, crypto_1.createHash)('sha256').update(hexBuffer).digest('hex');
const txRecip = {
raw_data: rawData,
raw_data_hex: rawDataHex,
txID: id,
signature: this.transaction.signature,
};
this.transaction = new transaction_1.Transaction(this._coinConfig, txRecip);
}
/**
* Helper method to get the unfreeze balance transaction raw data hex
*
* @returns {string} the freeze balance transaction raw data hex
*/
getUnfreezeRawDataHex() {
const rawContract = {
ownerAddress: (0, utils_1.getByteArrayFromHexAddress)(this._ownerAddress),
unfreezeBalance: this._unfreezeBalance,
resource: this._resource,
};
const unfreezeContract = tron_1.protocol.UnfreezeBalanceV2Contract.fromObject(rawContract);
const unfreezeContractBytes = tron_1.protocol.UnfreezeBalanceV2Contract.encode(unfreezeContract).finish();
const txContract = {
type: ContractType.UnfreezeBalanceV2Contract,
parameter: {
value: unfreezeContractBytes,
type_url: 'type.googleapis.com/protocol.UnfreezeBalanceV2Contract',
},
};
const raw = {
refBlockBytes: Buffer.from(this._refBlockBytes, 'hex'),
refBlockHash: Buffer.from(this._refBlockHash, 'hex'),
expiration: this._expiration || Date.now() + utils_1.TRANSACTION_DEFAULT_EXPIRATION,
timestamp: this._timestamp || Date.now(),
contract: [txContract],
};
const rawTx = tron_1.protocol.Transaction.raw.create(raw);
return Buffer.from(tron_1.protocol.Transaction.raw.encode(rawTx).finish()).toString('hex');
}
/** @inheritdoc */
signImplementation(key) {
if (this._signingKeys.some((signingKey) => signingKey.key === key.key)) {
throw new sdk_core_1.SigningError('Duplicated key');
}
this._signingKeys.push(key);
// We keep this return for compatibility but is not meant to be use
return this.transaction;
}
applySignatures() {
if (!this.transaction.inputs) {
throw new sdk_core_1.SigningError('Transaction has no inputs');
}
this._signingKeys.forEach((key) => this.applySignature(key));
}
/**
* Validates the transaction
*
* @param {Transaction} transaction - The transaction to validate
* @throws {BuildTransactionError} when the transaction is invalid
*/
validateTransaction(transaction) {
this.validateFreezeTransactionFields();
}
/**
* Validates if the transaction is a valid unfreeze transaction
*
* @param {TransactionReceipt} transaction - The transaction to validate
* @throws {BuildTransactionError} when the transaction is invalid
*/
validateFreezeTransactionFields() {
if (!this._unfreezeBalance) {
throw new sdk_core_1.BuildTransactionError('Missing parameter: unfreezeBalance');
}
if (!this._ownerAddress) {
throw new sdk_core_1.BuildTransactionError('Missing parameter: source');
}
if (!this._resource) {
throw new sdk_core_1.BuildTransactionError('Missing parameter: resource');
}
if (!this._refBlockBytes || !this._refBlockHash) {
throw new sdk_core_1.BuildTransactionError('Missing block reference information');
}
}
}
exports.UnfreezeBalanceTxBuilder = UnfreezeBalanceTxBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5mcmVlemVCYWxhbmNlVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi91bmZyZWV6ZUJhbGFuY2VUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBQ3BDLDhDQUF3SDtBQUV4SCw2REFBMEQ7QUFDMUQsK0NBQTRDO0FBRTVDLG1DQU1pQjtBQUNqQix3REFBeUQ7QUFFekQsSUFBTyxZQUFZLEdBQUcsZUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO0FBRWpFLE1BQWEsd0JBQXlCLFNBQVEsdUNBQWtCO0lBSzlELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxpQkFBaUIsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxrQkFBa0IsQ0FBQyxNQUFjO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsUUFBZ0I7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixhQUFhLENBQUMsV0FBbUI7UUFDL0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEUsTUFBTSxJQUFJLGlDQUFzQixDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELElBQUksV0FBVyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsa0NBQTBCLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksaUNBQXNCLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUMzRixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNwRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxjQUEyQztRQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQzlDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUE4QixDQUFDO1FBQ3RFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sd0JBQXdCLENBQUMsb0JBQStDO1FBQ2hGLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUMzRixJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBQSwrQkFBdUIsRUFBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFUyxLQUFLLENBQUMsbUJBQW1CO1FBQ2pDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ3hDLG1DQUFtQztRQUNuQyxnREFBZ0Q7UUFDaEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNLLGdDQUFnQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUE4QixDQUFDO1FBQ2xFLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUM3QyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNsRCxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsd0RBQXdELENBQUM7UUFDdEYsUUFBUSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxNQUFNLEVBQUUsR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBdUI7WUFDbEMsUUFBUSxFQUFFLE9BQU87WUFDakIsWUFBWSxFQUFFLFVBQVU7WUFDeEIsSUFBSSxFQUFFLEVBQUU7WUFDUixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTO1NBQ3RDLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0sscUJBQXFCO1FBQzNCLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLFlBQVksRUFBRSxJQUFBLGtDQUEwQixFQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDNUQsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdEMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3pCLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUFHLGVBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEYsTUFBTSxxQkFBcUIsR0FBRyxlQUFRLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkcsTUFBTSxVQUFVLEdBQUc7WUFDakIsSUFBSSxFQUFFLFlBQVksQ0FBQyx5QkFBeUI7WUFDNUMsU0FBUyxFQUFFO2dCQUNULEtBQUssRUFBRSxxQkFBcUI7Z0JBQzVCLFFBQVEsRUFBRSx3REFBd0Q7YUFDbkU7U0FDRixDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUc7WUFDVixhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQztZQUN0RCxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQztZQUNwRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsc0NBQThCO1lBQzNFLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDeEMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDO1NBQ3ZCLENBQUM7UUFDRixNQUFNLEtBQUssR0FBRyxlQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsa0JBQWtCO0lBQ1Isa0JBQWtCLENBQUMsR0FBWTtRQUN2QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSx1QkFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLG1FQUFtRTtRQUNuRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLHVCQUFZLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxXQUF3QjtRQUMxQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSywrQkFBK0I7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMU5ELDREQTBOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlLCBCYXNlS2V5LCBFeHRlbmRUcmFuc2FjdGlvbkVycm9yLCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFNpZ25pbmdFcnJvciB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uUmVjZWlwdCwgVW5mcmVlemVCYWxhbmNlVjJDb250cmFjdCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHtcbiAgZGVjb2RlVHJhbnNhY3Rpb24sXG4gIGdldEJ5dGVBcnJheUZyb21IZXhBZGRyZXNzLFxuICBnZXRCYXNlNThBZGRyZXNzRnJvbUhleCxcbiAgVFJBTlNBQ1RJT05fTUFYX0VYUElSQVRJT04sXG4gIFRSQU5TQUNUSU9OX0RFRkFVTFRfRVhQSVJBVElPTixcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBwcm90b2NvbCB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9wcm90b2J1Zi90cm9uJztcblxuaW1wb3J0IENvbnRyYWN0VHlwZSA9IHByb3RvY29sLlRyYW5zYWN0aW9uLkNvbnRyYWN0LkNvbnRyYWN0VHlwZTtcblxuZXhwb3J0IGNsYXNzIFVuZnJlZXplQmFsYW5jZVR4QnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfc2lnbmluZ0tleXM6IEJhc2VLZXlbXTtcbiAgcHJpdmF0ZSBfdW5mcmVlemVCYWxhbmNlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3Jlc291cmNlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gW107XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdW5mcm96ZW4gYmFsYW5jZSBhbW91bnRcbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCBhbW91bnQgaW4gVFJYIHRvIHVuZnJlZXplXG4gICAqIEByZXR1cm5zIHRoZSBidWlsZGVyIHdpdGggdGhlIG5ldyBwYXJhbWV0ZXIgc2V0XG4gICAqL1xuICBzZXRVbmZyZWV6ZUJhbGFuY2UoYW1vdW50OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLl91bmZyZWV6ZUJhbGFuY2UgPSBhbW91bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZXNvdXJjZSB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSB0eXBlIHRvIHVuZnJlZXplXG4gICAqIEByZXR1cm5zIHRoZSBidWlsZGVyIHdpdGggdGhlIG5ldyBwYXJhbWV0ZXIgc2V0XG4gICAqL1xuICBzZXRSZXNvdXJjZShyZXNvdXJjZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVJlc291cmNlKHJlc291cmNlKTtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGV4dGVuZFZhbGlkVG8oZXh0ZW5zaW9uTXM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLnNpZ25hdHVyZSAmJiB0aGlzLnRyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignQ2Fubm90IGV4dGVuZCBhIHNpZ25lZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChleHRlbnNpb25NcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGNhbm5vdCBiZSBiZWxvdyB6ZXJvJyk7XG4gICAgfVxuXG4gICAgaWYgKGV4dGVuc2lvbk1zID4gVFJBTlNBQ1RJT05fTUFYX0VYUElSQVRJT04pIHtcbiAgICAgIHRocm93IG5ldyBFeHRlbmRUcmFuc2FjdGlvbkVycm9yKCdUaGUgZXhwaXJhdGlvbiBjYW5ub3QgYmUgZXh0ZW5kZWQgbW9yZSB0aGFuIG9uZSB5ZWFyJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V4cGlyYXRpb24pIHtcbiAgICAgIHRoaXMuX2V4cGlyYXRpb24gPSB0aGlzLl9leHBpcmF0aW9uICsgZXh0ZW5zaW9uTXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm90IGV4cGlyYXRpb24gdG8gZXh0ZW5kJyk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEJ1aWxkZXIocmF3VHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uUmVjZWlwdCB8IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0aGlzLmZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIHRoaXMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgY29uc3QgdHggPSB0aGlzLmZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IHR4O1xuICAgIHRoaXMuX3NpZ25pbmdLZXlzID0gW107XG4gICAgY29uc3QgcmF3RGF0YSA9IHR4LnRvSnNvbigpLnJhd19kYXRhO1xuICAgIHRoaXMuX3JlZkJsb2NrQnl0ZXMgPSByYXdEYXRhLnJlZl9ibG9ja19ieXRlcztcbiAgICB0aGlzLl9yZWZCbG9ja0hhc2ggPSByYXdEYXRhLnJlZl9ibG9ja19oYXNoO1xuICAgIHRoaXMuX2V4cGlyYXRpb24gPSByYXdEYXRhLmV4cGlyYXRpb247XG4gICAgdGhpcy5fdGltZXN0YW1wID0gcmF3RGF0YS50aW1lc3RhbXA7XG4gICAgY29uc3QgY29udHJhY3RDYWxsID0gcmF3RGF0YS5jb250cmFjdFswXSBhcyBVbmZyZWV6ZUJhbGFuY2VWMkNvbnRyYWN0O1xuICAgIHRoaXMuaW5pdFVuZnJlZXplQ29udHJhY3RDYWxsKGNvbnRyYWN0Q2FsbCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgZnJlZXplIGNvbnRyYWN0IGNhbGwgc3BlY2lmaWMgZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge1VuZnJlZXplQmFsYW5jZVYyQ29udHJhY3R9IHVuZnJlZXplQ29udHJhY3RDYWxsIG9iamVjdCB3aXRoIGZyZWV6ZSB0eG4gZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRVbmZyZWV6ZUNvbnRyYWN0Q2FsbCh1bmZyZWV6ZUNvbnRyYWN0Q2FsbDogVW5mcmVlemVCYWxhbmNlVjJDb250cmFjdCk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb3VyY2UsIG93bmVyX2FkZHJlc3MsIHVuZnJlZXplX2JhbGFuY2UgfSA9IHVuZnJlZXplQ29udHJhY3RDYWxsLnBhcmFtZXRlci52YWx1ZTtcbiAgICBpZiAob3duZXJfYWRkcmVzcykge1xuICAgICAgdGhpcy5zb3VyY2UoeyBhZGRyZXNzOiBnZXRCYXNlNThBZGRyZXNzRnJvbUhleChvd25lcl9hZGRyZXNzKSB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuc2V0UmVzb3VyY2UocmVzb3VyY2UpO1xuICAgIH1cblxuICAgIGlmICh1bmZyZWV6ZV9iYWxhbmNlKSB7XG4gICAgICB0aGlzLnNldFVuZnJlZXplQmFsYW5jZSh1bmZyZWV6ZV9iYWxhbmNlLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmNyZWF0ZVVuZnJlZXplQmFsYW5jZVRyYW5zYWN0aW9uKCk7XG4gICAgLyoqIEBpbmhlcml0ZG9jY3JlYXRlVHJhbnNhY3Rpb24gKi9cbiAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGV4dGVuZGVkIG9uIGNoaWxkIGNsYXNzZXNcbiAgICBpZiAodGhpcy5fc2lnbmluZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hcHBseVNpZ25hdHVyZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uaWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0EgdmFsaWQgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGFuIGlkJyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50cmFuc2FjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgdGhlIGZyZWV6ZSBiYWxhbmNlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVVuZnJlZXplQmFsYW5jZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHJhd0RhdGFIZXggPSB0aGlzLmdldFVuZnJlZXplUmF3RGF0YUhleCgpO1xuICAgIGNvbnN0IHJhd0RhdGEgPSBkZWNvZGVUcmFuc2FjdGlvbihyYXdEYXRhSGV4KTtcbiAgICBjb25zdCBjb250cmFjdCA9IHJhd0RhdGEuY29udHJhY3RbMF0gYXMgVW5mcmVlemVCYWxhbmNlVjJDb250cmFjdDtcbiAgICBjb25zdCBjb250cmFjdFBhcmFtZXRlciA9IGNvbnRyYWN0LnBhcmFtZXRlcjtcbiAgICBjb250cmFjdFBhcmFtZXRlci52YWx1ZS5vd25lcl9hZGRyZXNzID0gdGhpcy5fb3duZXJBZGRyZXNzLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgY29udHJhY3RQYXJhbWV0ZXIudmFsdWUudW5mcmVlemVfYmFsYW5jZSA9IE51bWJlcih0aGlzLl91bmZyZWV6ZUJhbGFuY2UpO1xuICAgIGNvbnRyYWN0UGFyYW1ldGVyLnZhbHVlLnJlc291cmNlID0gdGhpcy5fcmVzb3VyY2U7XG4gICAgY29udHJhY3RQYXJhbWV0ZXIudHlwZV91cmwgPSAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2NvbC5VbmZyZWV6ZUJhbGFuY2VWMkNvbnRyYWN0JztcbiAgICBjb250cmFjdC50eXBlID0gJ1VuZnJlZXplQmFsYW5jZVYyQ29udHJhY3QnO1xuICAgIGNvbnN0IGhleEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJhd0RhdGFIZXgsICdoZXgnKTtcbiAgICBjb25zdCBpZCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShoZXhCdWZmZXIpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgY29uc3QgdHhSZWNpcDogVHJhbnNhY3Rpb25SZWNlaXB0ID0ge1xuICAgICAgcmF3X2RhdGE6IHJhd0RhdGEsXG4gICAgICByYXdfZGF0YV9oZXg6IHJhd0RhdGFIZXgsXG4gICAgICB0eElEOiBpZCxcbiAgICAgIHNpZ25hdHVyZTogdGhpcy50cmFuc2FjdGlvbi5zaWduYXR1cmUsXG4gICAgfTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcsIHR4UmVjaXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSB1bmZyZWV6ZSBiYWxhbmNlIHRyYW5zYWN0aW9uIHJhdyBkYXRhIGhleFxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZnJlZXplIGJhbGFuY2UgdHJhbnNhY3Rpb24gcmF3IGRhdGEgaGV4XG4gICAqL1xuICBwcml2YXRlIGdldFVuZnJlZXplUmF3RGF0YUhleCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJhd0NvbnRyYWN0ID0ge1xuICAgICAgb3duZXJBZGRyZXNzOiBnZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyh0aGlzLl9vd25lckFkZHJlc3MpLFxuICAgICAgdW5mcmVlemVCYWxhbmNlOiB0aGlzLl91bmZyZWV6ZUJhbGFuY2UsXG4gICAgICByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UsXG4gICAgfTtcbiAgICBjb25zdCB1bmZyZWV6ZUNvbnRyYWN0ID0gcHJvdG9jb2wuVW5mcmVlemVCYWxhbmNlVjJDb250cmFjdC5mcm9tT2JqZWN0KHJhd0NvbnRyYWN0KTtcbiAgICBjb25zdCB1bmZyZWV6ZUNvbnRyYWN0Qnl0ZXMgPSBwcm90b2NvbC5VbmZyZWV6ZUJhbGFuY2VWMkNvbnRyYWN0LmVuY29kZSh1bmZyZWV6ZUNvbnRyYWN0KS5maW5pc2goKTtcbiAgICBjb25zdCB0eENvbnRyYWN0ID0ge1xuICAgICAgdHlwZTogQ29udHJhY3RUeXBlLlVuZnJlZXplQmFsYW5jZVYyQ29udHJhY3QsXG4gICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgdmFsdWU6IHVuZnJlZXplQ29udHJhY3RCeXRlcyxcbiAgICAgICAgdHlwZV91cmw6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlVuZnJlZXplQmFsYW5jZVYyQ29udHJhY3QnLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IHJhdyA9IHtcbiAgICAgIHJlZkJsb2NrQnl0ZXM6IEJ1ZmZlci5mcm9tKHRoaXMuX3JlZkJsb2NrQnl0ZXMsICdoZXgnKSxcbiAgICAgIHJlZkJsb2NrSGFzaDogQnVmZmVyLmZyb20odGhpcy5fcmVmQmxvY2tIYXNoLCAnaGV4JyksXG4gICAgICBleHBpcmF0aW9uOiB0aGlzLl9leHBpcmF0aW9uIHx8IERhdGUubm93KCkgKyBUUkFOU0FDVElPTl9ERUZBVUxUX0VYUElSQVRJT04sXG4gICAgICB0aW1lc3RhbXA6IHRoaXMuX3RpbWVzdGFtcCB8fCBEYXRlLm5vdygpLFxuICAgICAgY29udHJhY3Q6IFt0eENvbnRyYWN0XSxcbiAgICB9O1xuICAgIGNvbnN0IHJhd1R4ID0gcHJvdG9jb2wuVHJhbnNhY3Rpb24ucmF3LmNyZWF0ZShyYXcpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShwcm90b2NvbC5UcmFuc2FjdGlvbi5yYXcuZW5jb2RlKHJhd1R4KS5maW5pc2goKSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oa2V5OiBCYXNlS2V5KTogVHJhbnNhY3Rpb24ge1xuICAgIGlmICh0aGlzLl9zaWduaW5nS2V5cy5zb21lKChzaWduaW5nS2V5KSA9PiBzaWduaW5nS2V5LmtleSA9PT0ga2V5LmtleSkpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ0R1cGxpY2F0ZWQga2V5Jyk7XG4gICAgfVxuICAgIHRoaXMuX3NpZ25pbmdLZXlzLnB1c2goa2V5KTtcblxuICAgIC8vIFdlIGtlZXAgdGhpcyByZXR1cm4gZm9yIGNvbXBhdGliaWxpdHkgYnV0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTaWduYXR1cmVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5pbnB1dHMpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ1RyYW5zYWN0aW9uIGhhcyBubyBpbnB1dHMnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zaWduaW5nS2V5cy5mb3JFYWNoKChrZXkpID0+IHRoaXMuYXBwbHlTaWduYXR1cmUoa2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIHtCdWlsZFRyYW5zYWN0aW9uRXJyb3J9IHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGludmFsaWRcbiAgICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUZyZWV6ZVRyYW5zYWN0aW9uRmllbGRzKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBhIHZhbGlkIHVuZnJlZXplIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25SZWNlaXB0fSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIHtCdWlsZFRyYW5zYWN0aW9uRXJyb3J9IHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVGcmVlemVUcmFuc2FjdGlvbkZpZWxkcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3VuZnJlZXplQmFsYW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWlzc2luZyBwYXJhbWV0ZXI6IHVuZnJlZXplQmFsYW5jZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fb3duZXJBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogc291cmNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9yZXNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWlzc2luZyBwYXJhbWV0ZXI6IHJlc291cmNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9yZWZCbG9ja0J5dGVzIHx8ICF0aGlzLl9yZWZCbG9ja0hhc2gpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3NpbmcgYmxvY2sgcmVmZXJlbmNlIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuICB9XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!