PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-core/dist/src
Просмотр файла: dustThreshold.js
"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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDustThresholdSat = getDustThresholdSat;
exports.getDustThresholdSatForOutputScript = getDustThresholdSatForOutputScript;
const utxolib = __importStar(require("@bitgo/utxo-lib"));
/**
* Checks if the output script is a witness script or not
* @param script
* @returns true if the script is a witness script
*/
function isWitnessOutputScript(script) {
/**
* Source: https://github.com/bitcoin/bitcoin/blob/v28.1/src/script/script.cpp#L241-L257
* A witness program is any valid CScript that consists of a 1-byte push opcode
* followed by a data push between 2 and 40 bytes.
*/
if (script.length < 4 || script.length > 42) {
return false;
}
if (script[0] !== utxolib.opcodes.OP_0 && (script[0] < utxolib.opcodes.OP_1 || script[0] > utxolib.opcodes.OP_16)) {
return false;
}
return script[1] + 2 === script.length;
}
function getDustRelayLimit(network) {
network = utxolib.getMainnet(network);
switch (network) {
case utxolib.networks.bitcoin:
case utxolib.networks.bitcoingold:
case utxolib.networks.dash:
// btc: https://github.com/bitcoin/bitcoin/blob/v28.0/src/policy/policy.h#L50-L55
// btg: https://github.com/BTCGPU/BTCGPU/blob/v0.17.3/src/policy/policy.h#L48
// dash: https://github.com/dashpay/dash/blob/v22.0.0-beta.1/src/policy/policy.h#L41-L46
return { feeRateSatKB: 3000 };
case utxolib.networks.bitcoincash:
// https://github.com/bitcoin-cash-node/bitcoin-cash-node/blob/v27.1.0/src/policy/policy.h#L76-L83
// I actually haven't looked at BSV and am depressed that I still need to handle the case here
return { feeRateSatKB: 1000 };
case utxolib.networks.dogecoin:
// https://github.com/dogecoin/dogecoin/blob/v1.14.8/src/policy/policy.h#L65-L81
// (COIN / 100) / 10;
return { satAmount: 1000000 };
case utxolib.networks.litecoin:
// https://github.com/litecoin-project/litecoin/blob/master/src/policy/policy.h#L47-L52
return { feeRateSatKB: 30000 };
case utxolib.networks.zcash:
// https://github.com/zcash/zcash/blob/master/src/primitives/transaction.h#L396-L399
// https://github.com/zcash/zcash/blob/v6.0.0/src/policy/policy.h#L43-L89 (I don't quite get it)
return { satAmount: 300 };
case utxolib.networks.bitcoinsv:
throw new Error('deprecated coin');
default:
throw new Error('unsupported network');
}
}
function getSpendSize(network, outputSize, isWitness) {
network = utxolib.getMainnet(network);
switch (network) {
case utxolib.networks.bitcoin:
case utxolib.networks.bitcoincash:
case utxolib.networks.bitcoingold:
case utxolib.networks.litecoin:
/*
btc: https://github.com/bitcoin/bitcoin/blob/v28.0/src/policy/policy.cpp#L26-L68
bch: https://github.com/bitcoin-cash-node/bitcoin-cash-node/blob/v27.1.0/src/policy/policy.cpp#L18-L36 (btc-ish)
btg: https://github.com/BTCGPU/BTCGPU/blob/v0.17.3/src/policy/policy.cpp#L18-L50 (btc-ish)
ltc: https://github.com/litecoin-project/litecoin/blob/v0.21.4/src/policy/policy.cpp#L15-L47 (btc-ish)
The fixed component here is 69.75 for isWitness=true and 150 for isWitness=false.
*/
return outputSize + 32 + 4 + 1 + 107 / (isWitness ? 4 : 1) + 4;
case utxolib.networks.dash:
// dash: https://github.com/dashpay/dash/blob/v21.1.1/src/policy/policy.cpp#L14-L30 (btc-ish)
// how did they end up with 148? I don't know
return outputSize + 148;
case utxolib.networks.dogecoin:
case utxolib.networks.zcash:
// doge: https://github.com/dogecoin/dogecoin/blob/v1.14.8/src/policy/policy.h#L65-L81 (hardcoded)
// zec: https://github.com/zcash/zcash/blob/v6.0.0/src/policy/policy.h#L43-L89 (some weird other thing, doge-ish)
throw new Error('dust limit is size-independent');
case utxolib.networks.bitcoinsv:
throw new Error('deprecated coin');
default:
throw new Error('unsupported network');
}
}
function getDustThresholdSat(network, outputSize, isWitness) {
const dustLimit = getDustRelayLimit(network);
if ('satAmount' in dustLimit) {
return dustLimit.satAmount;
}
if ('feeRateSatKB' in dustLimit) {
const spendSize = getSpendSize(network, outputSize, isWitness);
return Math.ceil((dustLimit.feeRateSatKB * spendSize) / 1000);
}
throw new Error('unexpected dustLimit');
}
function getDustThresholdSatForOutputScript(network, script) {
return getDustThresholdSat(network, script.length, isWitnessOutputScript(script));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVzdFRocmVzaG9sZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kdXN0VGhyZXNob2xkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOElBLGtEQVVDO0FBRUQsZ0ZBRUM7QUE1SkQseURBQTJDO0FBRTNDOzs7O0dBSUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLE1BQWM7SUFDM0M7Ozs7T0FJRztJQUNILElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUM1QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3pDLENBQUM7QUEwREQsU0FBUyxpQkFBaUIsQ0FBQyxPQUF3QjtJQUNqRCxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxRQUFRLE9BQU8sRUFBRSxDQUFDO1FBQ2hCLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDOUIsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUNsQyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSTtZQUN4QixrRkFBa0Y7WUFDbEYsOEVBQThFO1lB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TSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFnQixrQ0FBa0MsQ0FBQyxPQUF3QixFQUFFLE1BQWM7SUFDekYsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3BGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBvdXRwdXQgc2NyaXB0IGlzIGEgd2l0bmVzcyBzY3JpcHQgb3Igbm90XG4gKiBAcGFyYW0gc2NyaXB0XG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBzY3JpcHQgaXMgYSB3aXRuZXNzIHNjcmlwdFxuICovXG5mdW5jdGlvbiBpc1dpdG5lc3NPdXRwdXRTY3JpcHQoc2NyaXB0OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgLyoqXG4gICAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL3YyOC4xL3NyYy9zY3JpcHQvc2NyaXB0LmNwcCNMMjQxLUwyNTdcbiAgICogQSB3aXRuZXNzIHByb2dyYW0gaXMgYW55IHZhbGlkIENTY3JpcHQgdGhhdCBjb25zaXN0cyBvZiBhIDEtYnl0ZSBwdXNoIG9wY29kZVxuICAgKiBmb2xsb3dlZCBieSBhIGRhdGEgcHVzaCBiZXR3ZWVuIDIgYW5kIDQwIGJ5dGVzLlxuICAgKi9cbiAgaWYgKHNjcmlwdC5sZW5ndGggPCA0IHx8IHNjcmlwdC5sZW5ndGggPiA0Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoc2NyaXB0WzBdICE9PSB1dHhvbGliLm9wY29kZXMuT1BfMCAmJiAoc2NyaXB0WzBdIDwgdXR4b2xpYi5vcGNvZGVzLk9QXzEgfHwgc2NyaXB0WzBdID4gdXR4b2xpYi5vcGNvZGVzLk9QXzE2KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gc2NyaXB0WzFdICsgMiA9PT0gc2NyaXB0Lmxlbmd0aDtcbn1cblxuLypcblxuVGhlIGR1c3QgdGhyZXNob2xkIGZvciBtb3N0IFVUWE8gY29pbnMgaXMgZGVwZW5kZW50IG9uIG11bHRpcGxlIGZhY3RvcnM6XG5cbigxKSBzcGVuZGFiaWxpdHkgb2YgdGhlIG91dHB1dCAoT1BfUkVUVVJOcyBhcmUgYWxsb3dlZCB0byBiZSAwIHNpemVkKVxuKDIpIHdoZXRoZXIgaXQgaXMgYSB3aXRuZXNzIG9yIG5vbi13aXRuZXNzIG91dHB1dFxuKDMpIGEgcGFydGljdWxhciBmZWUgcmF0ZSAoR2V0RGlzY2FyZFJhdGUoKSlcblxuSSB3aWxsIGRvIHRoZSBhbmFseXNpcyBtb3N0bHkgZm9yIGJpdGNvaW4gaGVyZSBhbmQgdGhlbiBnZW5lcmFsaXplLlxuXG5PbiB0aGUgaW5kZXhlciB3ZSB1c2UgYHNlbmRyYXd0cmFuc2FjdGlvbmAsIHdoaWNoIGNhbGxzIGBJc1N0YW5kYXJkVHhgIGxpa2UgdGhpc1xuXG5odHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvdjI4LjAvc3JjL2tlcm5lbC9tZW1wb29sX29wdGlvbnMuaCNMNDdcblxuYGBgXG5pZiAoXG4gIG1fcG9vbC5tX29wdHMucmVxdWlyZV9zdGFuZGFyZCAmJlxuICAgIUlzU3RhbmRhcmRUeCh0eCxcbiAgIG1fcG9vbC5tX29wdHMubWF4X2RhdGFjYXJyaWVyX2J5dGVzLFxuICAgbV9wb29sLm1fb3B0cy5wZXJtaXRfYmFyZV9tdWx0aXNpZyxcbiAgIG1fcG9vbC5tX29wdHMuZHVzdF9yZWxheV9mZWVyYXRlLCByZWFzb24pKVxuYGBgXG5cblRoZSBgZHVzdF9yZWxheV9mZWVyYXRlYCBpbiB0aGlzIGNvbnRleHQgaXMgYSBoYXJkY29kZWQgY29uc3RhbnQ6XG5odHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvdjI4LjAvc3JjL3BvbGljeS9wb2xpY3kuaCNMNTAtTDU1XG5cbih0aGF0IGNhbiBhY3R1YWxseSBiZSBvdmVycmlkZGVuIHdpdGggYSBoaWRkZW4gY29tbWFuZFxubGluZSBwYXJhbWV0ZXI6IGh0dHBzOi8vYml0Y29pbi5zdGFja2V4Y2hhbmdlLmNvbS9hLzQxMDgyLzEzNzYwMSlcblxuVGhlcmUgd2UgY2FsbCBgSXNEdXN0YFxuXG5odHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvdjI4LjAvc3JjL3BvbGljeS9wb2xpY3kuY3BwI0wxNDQtTDE0NlxuXG5gYGBcbmlmIChJc0R1c3QodHhvdXQsIGR1c3RfcmVsYXlfZmVlKSkge1xuICAgIHJlYXNvbiA9IFwiZHVzdFwiO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmBgYFxuXG5XaGljaCBjYWxscyBgR2V0RHVzdFRocmVzaG9sZGAsXG5cbmh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpdGNvaW4vYmxvYi92MjguMC9zcmMvcG9saWN5L3BvbGljeS5jcHAjTDY3XG5cblRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgR2V0RHVzdFRocmVzaG9sZGAgY29tcHV0ZXMgdGhlIG1pbmltYWwgdHJhbnNhY3Rpb24gc2l6ZSB0aGF0IGNhbiBzcGVuZCB0aGUgb3V0cHV0LCBhbmQgY29tcHV0ZXNcbmEgbWluaW11bSBmZWUgZm9yIHRoYXQgdHJhbnNhY3Rpb24gc2l6ZSBiYXNlZCBvbiB0aGUgYGR1c3RfcmVsYXlfZmVlYCAoRmVlUmF0ZSkgcGFyYW1ldGVyLlxuXG5UaGUgZGlmZmVyZW50IHV0eG8gaW1wbGVtZW50YXRpb25zIGRpZmZlciBpbiB0aGVzZSB3YXlzOlxuXG4tIHNvbWUgaGF2ZSBhIGZpeGVkLCBzYXRvc2hpIGFtb3VudCBkdXN0IGxpbWl0IChkb2dlLCB6ZWMpXG4tIHNvbWUgaGF2ZSBhIGRpZmZlcmVudCBkdXN0X3JlbGF5X2ZlZVxuXG4qL1xuXG50eXBlIER1c3RMaW1pdCA9IHsgZmVlUmF0ZVNhdEtCOiBudW1iZXIgfSB8IHsgc2F0QW1vdW50OiBudW1iZXIgfTtcblxuZnVuY3Rpb24gZ2V0RHVzdFJlbGF5TGltaXQobmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogRHVzdExpbWl0IHtcbiAgbmV0d29yayA9IHV0eG9saWIuZ2V0TWFpbm5ldChuZXR3b3JrKTtcbiAgc3dpdGNoIChuZXR3b3JrKSB7XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW46XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5nb2xkOlxuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5kYXNoOlxuICAgICAgLy8gYnRjOiAgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL3YyOC4wL3NyYy9wb2xpY3kvcG9saWN5LmgjTDUwLUw1NVxuICAgICAgLy8gYnRnOiAgaHR0cHM6Ly9naXRodWIuY29tL0JUQ0dQVS9CVENHUFUvYmxvYi92MC4xNy4zL3NyYy9wb2xpY3kvcG9saWN5LmgjTDQ4XG4gICAgICAvLyBkYXNoOiBodHRwczovL2dpdGh1Yi5jb20vZGFzaHBheS9kYXNoL2Jsb2IvdjIyLjAuMC1iZXRhLjEvc3JjL3BvbGljeS9wb2xpY3kuaCNMNDEtTDQ2XG4gICAgICByZXR1cm4geyBmZWVSYXRlU2F0S0I6IDMwMDAgfTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbmNhc2g6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi1jYXNoLW5vZGUvYml0Y29pbi1jYXNoLW5vZGUvYmxvYi92MjcuMS4wL3NyYy9wb2xpY3kvcG9saWN5LmgjTDc2LUw4M1xuICAgICAgLy8gSSBhY3R1YWxseSBoYXZlbid0IGxvb2tlZCBhdCBCU1YgYW5kIGFtIGRlcHJlc3NlZCB0aGF0IEkgc3RpbGwgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2UgaGVyZVxuICAgICAgcmV0dXJuIHsgZmVlUmF0ZVNhdEtCOiAxMDAwIH07XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmRvZ2Vjb2luOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RvZ2Vjb2luL2RvZ2Vjb2luL2Jsb2IvdjEuMTQuOC9zcmMvcG9saWN5L3BvbGljeS5oI0w2NS1MODFcbiAgICAgIC8vIChDT0lOIC8gMTAwKSAvIDEwO1xuICAgICAgcmV0dXJuIHsgc2F0QW1vdW50OiAxXzAwMF8wMDAgfTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MubGl0ZWNvaW46XG4gICAgICAvLyAgaHR0cHM6Ly9naXRodWIuY29tL2xpdGVjb2luLXByb2plY3QvbGl0ZWNvaW4vYmxvYi9tYXN0ZXIvc3JjL3BvbGljeS9wb2xpY3kuaCNMNDctTDUyXG4gICAgICByZXR1cm4geyBmZWVSYXRlU2F0S0I6IDMwXzAwMCB9O1xuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy56Y2FzaDpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL21hc3Rlci9zcmMvcHJpbWl0aXZlcy90cmFuc2FjdGlvbi5oI0wzOTYtTDM5OVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjYuMC4wL3NyYy9wb2xpY3kvcG9saWN5LmgjTDQzLUw4OSAoSSBkb24ndCBxdWl0ZSBnZXQgaXQpXG4gICAgICByZXR1cm4geyBzYXRBbW91bnQ6IDMwMCB9O1xuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luc3Y6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlcHJlY2F0ZWQgY29pbicpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIG5ldHdvcmsnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTcGVuZFNpemUobmV0d29yazogdXR4b2xpYi5OZXR3b3JrLCBvdXRwdXRTaXplOiBudW1iZXIsIGlzV2l0bmVzczogYm9vbGVhbik6IG51bWJlciB7XG4gIG5ldHdvcmsgPSB1dHhvbGliLmdldE1haW5uZXQobmV0d29yayk7XG4gIHN3aXRjaCAobmV0d29yaykge1xuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luOlxuICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luY2FzaDpcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbmdvbGQ6XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmxpdGVjb2luOlxuICAgICAgLypcbiAgICAgICAgYnRjOiAgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL3YyOC4wL3NyYy9wb2xpY3kvcG9saWN5LmNwcCNMMjYtTDY4XG4gICAgICAgIGJjaDogIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luLWNhc2gtbm9kZS9iaXRjb2luLWNhc2gtbm9kZS9ibG9iL3YyNy4xLjAvc3JjL3BvbGljeS9wb2xpY3kuY3BwI0wxOC1MMzYgKGJ0Yy1pc2gpXG4gICAgICAgIGJ0ZzogIGh0dHBzOi8vZ2l0aHViLmNvbS9CVENHUFUvQlRDR1BVL2Jsb2IvdjAuMTcuMy9zcmMvcG9saWN5L3BvbGljeS5jcHAjTDE4LUw1MCAoYnRjLWlzaClcbiAgICAgICAgbHRjOiAgaHR0cHM6Ly9naXRodWIuY29tL2xpdGVjb2luLXByb2plY3QvbGl0ZWNvaW4vYmxvYi92MC4yMS40L3NyYy9wb2xpY3kvcG9saWN5LmNwcCNMMTUtTDQ3IChidGMtaXNoKVxuXG4gICAgICAgIFRoZSBmaXhlZCBjb21wb25lbnQgaGVyZSBpcyA2OS43NSBmb3IgaXNXaXRuZXNzPXRydWUgYW5kIDE1MCBmb3IgaXNXaXRuZXNzPWZhbHNlLlxuICAgICAgICovXG4gICAgICByZXR1cm4gb3V0cHV0U2l6ZSArIDMyICsgNCArIDEgKyAxMDcgLyAoaXNXaXRuZXNzID8gNCA6IDEpICsgNDtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuZGFzaDpcbiAgICAgIC8vIGRhc2g6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXNocGF5L2Rhc2gvYmxvYi92MjEuMS4xL3NyYy9wb2xpY3kvcG9saWN5LmNwcCNMMTQtTDMwIChidGMtaXNoKVxuICAgICAgLy8gaG93IGRpZCB0aGV5IGVuZCB1cCB3aXRoIDE0OD8gSSBkb24ndCBrbm93XG4gICAgICByZXR1cm4gb3V0cHV0U2l6ZSArIDE0ODtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuZG9nZWNvaW46XG4gICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLnpjYXNoOlxuICAgICAgLy8gZG9nZTogaHR0cHM6Ly9naXRodWIuY29tL2RvZ2Vjb2luL2RvZ2Vjb2luL2Jsb2IvdjEuMTQuOC9zcmMvcG9saWN5L3BvbGljeS5oI0w2NS1MODEgKGhhcmRjb2RlZClcbiAgICAgIC8vIHplYzogIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL3Y2LjAuMC9zcmMvcG9saWN5L3BvbGljeS5oI0w0My1MODkgKHNvbWUgd2VpcmQgb3RoZXIgdGhpbmcsIGRvZ2UtaXNoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdXN0IGxpbWl0IGlzIHNpemUtaW5kZXBlbmRlbnQnKTtcbiAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbnN2OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXByZWNhdGVkIGNvaW4nKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBuZXR3b3JrJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldER1c3RUaHJlc2hvbGRTYXQobmV0d29yazogdXR4b2xpYi5OZXR3b3JrLCBvdXRwdXRTaXplOiBudW1iZXIsIGlzV2l0bmVzczogYm9vbGVhbik6IG51bWJlciB7XG4gIGNvbnN0IGR1c3RMaW1pdCA9IGdldER1c3RSZWxheUxpbWl0KG5ldHdvcmspO1xuICBpZiAoJ3NhdEFtb3VudCcgaW4gZHVzdExpbWl0KSB7XG4gICAgcmV0dXJuIGR1c3RMaW1pdC5zYXRBbW91bnQ7XG4gIH1cbiAgaWYgKCdmZWVSYXRlU2F0S0InIGluIGR1c3RMaW1pdCkge1xuICAgIGNvbnN0IHNwZW5kU2l6ZSA9IGdldFNwZW5kU2l6ZShuZXR3b3JrLCBvdXRwdXRTaXplLCBpc1dpdG5lc3MpO1xuICAgIHJldHVybiBNYXRoLmNlaWwoKGR1c3RMaW1pdC5mZWVSYXRlU2F0S0IgKiBzcGVuZFNpemUpIC8gMTAwMCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGR1c3RMaW1pdCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVzdFRocmVzaG9sZFNhdEZvck91dHB1dFNjcmlwdChuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssIHNjcmlwdDogQnVmZmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldER1c3RUaHJlc2hvbGRTYXQobmV0d29yaywgc2NyaXB0Lmxlbmd0aCwgaXNXaXRuZXNzT3V0cHV0U2NyaXB0KHNjcmlwdCkpO1xufVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!