1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const client_common_1 = require("@neo-one/client-common");
|
5 | const bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js"));
|
6 | const bn_js_1 = require("bn.js");
|
7 | const crypto_1 = require("crypto");
|
8 | const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
9 | const toASCII = (bytes) => {
|
10 | let result = '';
|
11 | lodash_1.default.range(bytes.length).forEach((i) => {
|
12 | result += String.fromCharCode(bytes.readUInt8(i));
|
13 | });
|
14 | return result;
|
15 | };
|
16 | const toUTF8 = (bytes) => bytes.toString('utf8');
|
17 | const calculateClaimAmount = async ({ coins, decrementInterval, generationAmount, getSystemFee, }) => {
|
18 | const grouped = Object.values(lodash_1.default.groupBy(coins, (coin) => `${coin.startHeight}:${coin.endHeight}`));
|
19 | const claimed = await Promise.all(grouped.map(async (coinsGroup) => {
|
20 | const { startHeight, endHeight } = coinsGroup[0];
|
21 | let amount = client_common_1.utils.ZERO;
|
22 | let ustart = Math.floor(startHeight / decrementInterval);
|
23 | if (ustart < generationAmount.length) {
|
24 | let istart = startHeight % decrementInterval;
|
25 | let uend = Math.floor(endHeight / decrementInterval);
|
26 | let iend = endHeight % decrementInterval;
|
27 | if (uend >= generationAmount.length) {
|
28 | uend = generationAmount.length;
|
29 | iend = 0;
|
30 | }
|
31 | if (iend === 0) {
|
32 | uend -= 1;
|
33 | iend = decrementInterval;
|
34 | }
|
35 | while (ustart < uend) {
|
36 | amount = amount.addn((decrementInterval - istart) * generationAmount[ustart]);
|
37 | ustart += 1;
|
38 | istart = 0;
|
39 | }
|
40 | amount = amount.addn((iend - istart) * generationAmount[ustart]);
|
41 | }
|
42 | const [sysFeeEnd, sysFeeStart] = await Promise.all([
|
43 | getSystemFee(endHeight - 1),
|
44 | startHeight === 0 ? Promise.resolve(client_common_1.utils.ZERO) : getSystemFee(startHeight - 1),
|
45 | ]);
|
46 | amount = amount.add(sysFeeEnd.sub(sysFeeStart).div(client_common_1.utils.ONE_HUNDRED_MILLION));
|
47 | const totalValue = coinsGroup.reduce((acc, { value }) => acc.add(value), client_common_1.utils.ZERO);
|
48 | return [totalValue, amount];
|
49 | }));
|
50 | return claimed.reduce((acc, [value, amount]) => acc.add(value.div(client_common_1.utils.ONE_HUNDRED_MILLION).mul(amount)), client_common_1.utils.ZERO);
|
51 | };
|
52 | const randomUInt64 = () => new bn_js_1.BN(crypto_1.randomBytes(8).toString('hex'), 16);
|
53 | const toKeyString = (clazz, toKey) => () => `${clazz.name}:${toKey()}`;
|
54 | function lazyAsync(getValue) {
|
55 | let valuePromise;
|
56 | return async (input) => {
|
57 | if (valuePromise === undefined) {
|
58 | valuePromise = getValue(input);
|
59 | }
|
60 | return valuePromise;
|
61 | };
|
62 | }
|
63 | function lazyOrValue(getValue) {
|
64 | let settings = typeof getValue === 'function' ? { type: 'lazy', getValue } : { type: 'evaluated', value: getValue };
|
65 | return () => {
|
66 | if (settings.type === 'lazy') {
|
67 | settings = { type: 'evaluated', value: settings.getValue() };
|
68 | }
|
69 | return settings.value;
|
70 | };
|
71 | }
|
72 | function weightedAverage(input) {
|
73 | let sumWeight = new bignumber_js_1.default(0);
|
74 | let sumValue = new bignumber_js_1.default(0);
|
75 | input.forEach((value) => {
|
76 | sumWeight = sumWeight.plus(value.weight);
|
77 | sumValue = sumValue.plus(value.weight.times(value.value));
|
78 | });
|
79 | if (sumValue.isEqualTo(0) || sumWeight.isEqualTo(0)) {
|
80 | return 0;
|
81 | }
|
82 | return sumValue
|
83 | .div(sumWeight)
|
84 | .integerValue(bignumber_js_1.default.ROUND_FLOOR)
|
85 | .toNumber();
|
86 | }
|
87 | function weightedFilter(input, startIn, endIn, getValueIn) {
|
88 | const start = new bignumber_js_1.default(startIn);
|
89 | const end = new bignumber_js_1.default(endIn);
|
90 | const getValue = (value) => new bignumber_js_1.default(getValueIn(value).toString(10));
|
91 | const amount = input.reduce((acc, value) => acc.plus(getValue(value)), new bignumber_js_1.default(0));
|
92 | let sum = new bignumber_js_1.default(0);
|
93 | let current = new bignumber_js_1.default(0);
|
94 | const mutableResult = [];
|
95 | for (const value of input) {
|
96 | if (current.gte(end)) {
|
97 | break;
|
98 | }
|
99 | let weight = getValue(value);
|
100 | sum = sum.plus(weight);
|
101 | const old = current;
|
102 | current = sum.div(amount);
|
103 | if (current.lte(start)) {
|
104 | continue;
|
105 | }
|
106 | if (old.lt(start)) {
|
107 | weight = current.gt(end) ? end.minus(start).times(amount) : current.minus(start).times(amount);
|
108 | }
|
109 | else if (current.gt(end)) {
|
110 | weight = end.minus(old).times(amount);
|
111 | }
|
112 | mutableResult.push([
|
113 | value,
|
114 | weight.gte(0) ? weight.integerValue(bignumber_js_1.default.ROUND_FLOOR) : weight.integerValue(bignumber_js_1.default.ROUND_CEIL),
|
115 | ]);
|
116 | }
|
117 | return mutableResult;
|
118 | }
|
119 | function equals(clazz, thiz, equalsFunc) {
|
120 | return (other) => other != undefined && (thiz === other || (other instanceof clazz && equalsFunc(other)));
|
121 | }
|
122 | exports.utils = Object.assign({}, client_common_1.utils, { toASCII,
|
123 | toUTF8,
|
124 | calculateClaimAmount,
|
125 | randomUInt64,
|
126 | toKeyString,
|
127 | equals,
|
128 | lazyAsync,
|
129 | lazyOrValue,
|
130 | weightedAverage,
|
131 | weightedFilter });
|
132 |
|
133 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FFYixLQUFnQyxFQUNoQyxJQUFPLEVBQ1AsVUFBaUM7SUFHakMsT0FBTyxDQUFDLEtBQUssRUFBVyxFQUFFLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckgsQ0FBQztBQUVZLFFBQUEsS0FBSyxxQkFDYixxQkFBVyxJQUNkLE9BQU87SUFDUCxNQUFNO0lBQ04sb0JBQW9CO0lBQ3BCLFlBQVk7SUFDWixXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxXQUFXO0lBQ1gsZUFBZTtJQUNmLGNBQWMsSUFDZCIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvdXRpbHMvdXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlscyBhcyBjbGllbnRVdGlscyB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQk4gfSBmcm9tICdibi5qcyc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCB0b0FTQ0lJID0gKGJ5dGVzOiBCdWZmZXIpID0+IHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBfLnJhbmdlKGJ5dGVzLmxlbmd0aCkuZm9yRWFjaCgoaSkgPT4ge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzLnJlYWRVSW50OChpKSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0b1VURjggPSAoYnl0ZXM6IEJ1ZmZlcikgPT4gYnl0ZXMudG9TdHJpbmcoJ3V0ZjgnKTtcblxuY29uc3QgY2FsY3VsYXRlQ2xhaW1BbW91bnQgPSBhc3luYyAoe1xuICBjb2lucyxcbiAgZGVjcmVtZW50SW50ZXJ2YWwsXG4gIGdlbmVyYXRpb25BbW91bnQsXG4gIGdldFN5c3RlbUZlZSxcbn06IHtcbiAgcmVhZG9ubHkgY29pbnM6IFJlYWRvbmx5QXJyYXk8e1xuICAgIHJlYWRvbmx5IHZhbHVlOiBCTjtcbiAgICByZWFkb25seSBzdGFydEhlaWdodDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGVuZEhlaWdodDogbnVtYmVyO1xuICB9PjtcbiAgcmVhZG9ubHkgZGVjcmVtZW50SW50ZXJ2YWw6IG51bWJlcjtcbiAgcmVhZG9ubHkgZ2VuZXJhdGlvbkFtb3VudDogcmVhZG9ubHkgbnVtYmVyW107XG4gIHJlYWRvbmx5IGdldFN5c3RlbUZlZTogKGluZGV4OiBudW1iZXIpID0+IFByb21pc2U8Qk4+O1xufSk6IFByb21pc2U8Qk4+ID0+IHtcbiAgY29uc3QgZ3JvdXBlZCA9IE9iamVjdC52YWx1ZXMoXy5ncm91cEJ5KGNvaW5zLCAoY29pbikgPT4gYCR7Y29pbi5zdGFydEhlaWdodH06JHtjb2luLmVuZEhlaWdodH1gKSk7XG5cbiAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGdyb3VwZWQubWFwKGFzeW5jIChjb2luc0dyb3VwKSA9PiB7XG4gICAgICBjb25zdCB7IHN0YXJ0SGVpZ2h0LCBlbmRIZWlnaHQgfSA9IGNvaW5zR3JvdXBbMF07XG5cbiAgICAgIGxldCBhbW91bnQgPSBjbGllbnRVdGlscy5aRVJPO1xuICAgICAgbGV0IHVzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnRIZWlnaHQgLyBkZWNyZW1lbnRJbnRlcnZhbCk7XG4gICAgICBpZiAodXN0YXJ0IDwgZ2VuZXJhdGlvbkFtb3VudC5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGlzdGFydCA9IHN0YXJ0SGVpZ2h0ICUgZGVjcmVtZW50SW50ZXJ2YWw7XG4gICAgICAgIGxldCB1ZW5kID0gTWF0aC5mbG9vcihlbmRIZWlnaHQgLyBkZWNyZW1lbnRJbnRlcnZhbCk7XG4gICAgICAgIGxldCBpZW5kID0gZW5kSGVpZ2h0ICUgZGVjcmVtZW50SW50ZXJ2YWw7XG4gICAgICAgIGlmICh1ZW5kID49IGdlbmVyYXRpb25BbW91bnQubGVuZ3RoKSB7XG4gICAgICAgICAgdWVuZCA9IGdlbmVyYXRpb25BbW91bnQubGVuZ3RoO1xuICAgICAgICAgIGllbmQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGllbmQgPT09IDApIHtcbiAgICAgICAgICB1ZW5kIC09IDE7XG4gICAgICAgICAgaWVuZCA9IGRlY3JlbWVudEludGVydmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgICAgIHdoaWxlICh1c3RhcnQgPCB1ZW5kKSB7XG4gICAgICAgICAgYW1vdW50ID0gYW1vdW50LmFkZG4oKGRlY3JlbWVudEludGVydmFsIC0gaXN0YXJ0KSAqIGdlbmVyYXRpb25BbW91bnRbdXN0YXJ0XSk7XG5cbiAgICAgICAgICB1c3RhcnQgKz0gMTtcbiAgICAgICAgICBpc3RhcnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgYW1vdW50ID0gYW1vdW50LmFkZG4oKGllbmQgLSBpc3RhcnQpICogZ2VuZXJhdGlvbkFtb3VudFt1c3RhcnRdKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgW3N5c0ZlZUVuZCwgc3lzRmVlU3RhcnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRTeXN0ZW1GZWUoZW5kSGVpZ2h0IC0gMSksXG4gICAgICAgIHN0YXJ0SGVpZ2h0ID09PSAwID8gUHJvbWlzZS5yZXNvbHZlKGNsaWVudFV0aWxzLlpFUk8pIDogZ2V0U3lzdGVtRmVlKHN0YXJ0SGVpZ2h0IC0gMSksXG4gICAgICBdKTtcblxuICAgICAgYW1vdW50ID0gYW1vdW50LmFkZChzeXNGZWVFbmQuc3ViKHN5c0ZlZVN0YXJ0KS5kaXYoY2xpZW50VXRpbHMuT05FX0hVTkRSRURfTUlMTElPTikpO1xuICAgICAgY29uc3QgdG90YWxWYWx1ZSA9IGNvaW5zR3JvdXAucmVkdWNlKChhY2MsIHsgdmFsdWUgfSkgPT4gYWNjLmFkZCh2YWx1ZSksIGNsaWVudFV0aWxzLlpFUk8pO1xuXG4gICAgICByZXR1cm4gW3RvdGFsVmFsdWUsIGFtb3VudF07XG4gICAgfSksXG4gICk7XG5cbiAgcmV0dXJuIGNsYWltZWQucmVkdWNlKFxuICAgIChhY2MsIFt2YWx1ZSwgYW1vdW50XSkgPT4gYWNjLmFkZCh2YWx1ZS5kaXYoY2xpZW50VXRpbHMuT05FX0hVTkRSRURfTUlMTElPTikubXVsKGFtb3VudCkpLFxuICAgIGNsaWVudFV0aWxzLlpFUk8sXG4gICk7XG59O1xuXG5jb25zdCByYW5kb21VSW50NjQgPSAoKTogQk4gPT4gbmV3IEJOKHJhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKCdoZXgnKSwgMTYpO1xuXG5jb25zdCB0b0tleVN0cmluZyA9IChjbGF6ejogeyByZWFkb25seSBuYW1lOiBzdHJpbmcgfSwgdG9LZXk6ICgpID0+IHN0cmluZykgPT4gKCkgPT4gYCR7Y2xhenoubmFtZX06JHt0b0tleSgpfWA7XG5cbmZ1bmN0aW9uIGxhenlBc3luYzxJbnB1dCwgVmFsdWU+KGdldFZhbHVlOiAoaW5wdXQ6IElucHV0KSA9PiBQcm9taXNlPFZhbHVlPik6IChpbnB1dDogSW5wdXQpID0+IFByb21pc2U8VmFsdWU+IHtcbiAgbGV0IHZhbHVlUHJvbWlzZTogUHJvbWlzZTxWYWx1ZT4gfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGFzeW5jIChpbnB1dCkgPT4ge1xuICAgIGlmICh2YWx1ZVByb21pc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWVQcm9taXNlID0gZ2V0VmFsdWUoaW5wdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVByb21pc2U7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGxhenlPclZhbHVlPFZhbHVlPihnZXRWYWx1ZTogKCgpID0+IFZhbHVlKSB8IFZhbHVlKTogKCkgPT4gVmFsdWUge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIGxldCBzZXR0aW5nczogYW55ID1cbiAgICB0eXBlb2YgZ2V0VmFsdWUgPT09ICdmdW5jdGlvbicgPyB7IHR5cGU6ICdsYXp5JywgZ2V0VmFsdWUgfSA6IHsgdHlwZTogJ2V2YWx1YXRlZCcsIHZhbHVlOiBnZXRWYWx1ZSB9O1xuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09ICdsYXp5Jykge1xuICAgICAgc2V0dGluZ3MgPSB7IHR5cGU6ICdldmFsdWF0ZWQnLCB2YWx1ZTogc2V0dGluZ3MuZ2V0VmFsdWUoKSB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZXR0aW5ncy52YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2VpZ2h0ZWRBdmVyYWdlKFxuICBpbnB1dDogUmVhZG9ubHlBcnJheTx7XG4gICAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbiAgICByZWFkb25seSB3ZWlnaHQ6IEJpZ051bWJlcjtcbiAgfT4sXG4pOiBudW1iZXIge1xuICBsZXQgc3VtV2VpZ2h0ID0gbmV3IEJpZ051bWJlcigwKTtcbiAgbGV0IHN1bVZhbHVlID0gbmV3IEJpZ051bWJlcigwKTtcbiAgaW5wdXQuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICBzdW1XZWlnaHQgPSBzdW1XZWlnaHQucGx1cyh2YWx1ZS53ZWlnaHQpO1xuICAgIHN1bVZhbHVlID0gc3VtVmFsdWUucGx1cyh2YWx1ZS53ZWlnaHQudGltZXModmFsdWUudmFsdWUpKTtcbiAgfSk7XG5cbiAgaWYgKHN1bVZhbHVlLmlzRXF1YWxUbygwKSB8fCBzdW1XZWlnaHQuaXNFcXVhbFRvKDApKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gc3VtVmFsdWVcbiAgICAuZGl2KHN1bVdlaWdodClcbiAgICAuaW50ZWdlclZhbHVlKEJpZ051bWJlci5ST1VORF9GTE9PUilcbiAgICAudG9OdW1iZXIoKTtcbn1cblxuZnVuY3Rpb24gd2VpZ2h0ZWRGaWx0ZXI8VD4oXG4gIGlucHV0OiByZWFkb25seSBUW10sXG4gIHN0YXJ0SW46IG51bWJlcixcbiAgZW5kSW46IG51bWJlcixcbiAgZ2V0VmFsdWVJbjogKHZhbHVlOiBUKSA9PiBCTixcbik6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW1QsIEJpZ051bWJlcl0+IHtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgQmlnTnVtYmVyKHN0YXJ0SW4pO1xuICBjb25zdCBlbmQgPSBuZXcgQmlnTnVtYmVyKGVuZEluKTtcbiAgY29uc3QgZ2V0VmFsdWUgPSAodmFsdWU6IFQpID0+IG5ldyBCaWdOdW1iZXIoZ2V0VmFsdWVJbih2YWx1ZSkudG9TdHJpbmcoMTApKTtcbiAgY29uc3QgYW1vdW50ID0gaW5wdXQucmVkdWNlKChhY2MsIHZhbHVlKSA9PiBhY2MucGx1cyhnZXRWYWx1ZSh2YWx1ZSkpLCBuZXcgQmlnTnVtYmVyKDApKTtcblxuICBsZXQgc3VtID0gbmV3IEJpZ051bWJlcigwKTtcbiAgbGV0IGN1cnJlbnQgPSBuZXcgQmlnTnVtYmVyKDApO1xuICBjb25zdCBtdXRhYmxlUmVzdWx0OiBBcnJheTxyZWFkb25seSBbVCwgQmlnTnVtYmVyXT4gPSBbXTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgaW5wdXQpIHtcbiAgICBpZiAoY3VycmVudC5ndGUoZW5kKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCB3ZWlnaHQgPSBnZXRWYWx1ZSh2YWx1ZSk7XG4gICAgc3VtID0gc3VtLnBsdXMod2VpZ2h0KTtcbiAgICBjb25zdCBvbGQgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQgPSBzdW0uZGl2KGFtb3VudCk7XG4gICAgaWYgKGN1cnJlbnQubHRlKHN0YXJ0KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG9sZC5sdChzdGFydCkpIHtcbiAgICAgIHdlaWdodCA9IGN1cnJlbnQuZ3QoZW5kKSA/IGVuZC5taW51cyhzdGFydCkudGltZXMoYW1vdW50KSA6IGN1cnJlbnQubWludXMoc3RhcnQpLnRpbWVzKGFtb3VudCk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Lmd0KGVuZCkpIHtcbiAgICAgIHdlaWdodCA9IGVuZC5taW51cyhvbGQpLnRpbWVzKGFtb3VudCk7XG4gICAgfVxuXG4gICAgbXV0YWJsZVJlc3VsdC5wdXNoKFtcbiAgICAgIHZhbHVlLFxuICAgICAgd2VpZ2h0Lmd0ZSgwKSA/IHdlaWdodC5pbnRlZ2VyVmFsdWUoQmlnTnVtYmVyLlJPVU5EX0ZMT09SKSA6IHdlaWdodC5pbnRlZ2VyVmFsdWUoQmlnTnVtYmVyLlJPVU5EX0NFSUwpLFxuICAgIF0gYXMgY29uc3QpO1xuICB9XG5cbiAgcmV0dXJuIG11dGFibGVSZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGVxdWFsczxUPihcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueSByZWFkb25seS1hcnJheVxuICBjbGF6ejogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCxcbiAgdGhpejogVCxcbiAgZXF1YWxzRnVuYzogKG90aGVyOiBUKSA9PiBib29sZWFuLFxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4pOiAob3RoZXI6IGFueSkgPT4gYm9vbGVhbiB7XG4gIHJldHVybiAob3RoZXIpOiBib29sZWFuID0+IG90aGVyICE9IHVuZGVmaW5lZCAmJiAodGhpeiA9PT0gb3RoZXIgfHwgKG90aGVyIGluc3RhbmNlb2YgY2xhenogJiYgZXF1YWxzRnVuYyhvdGhlcikpKTtcbn1cblxuZXhwb3J0IGNvbnN0IHV0aWxzID0ge1xuICAuLi5jbGllbnRVdGlscyxcbiAgdG9BU0NJSSxcbiAgdG9VVEY4LFxuICBjYWxjdWxhdGVDbGFpbUFtb3VudCxcbiAgcmFuZG9tVUludDY0LFxuICB0b0tleVN0cmluZyxcbiAgZXF1YWxzLFxuICBsYXp5QXN5bmMsXG4gIGxhenlPclZhbHVlLFxuICB3ZWlnaHRlZEF2ZXJhZ2UsXG4gIHdlaWdodGVkRmlsdGVyLFxufTtcbiJdfQ==
|