@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
171 lines (169 loc) • 27.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const entries_1 = require("../builtins/array/entries");
const constants_1 = require("../constants");
const NodeCompiler_1 = require("../NodeCompiler");
class ForOfStatementCompiler extends NodeCompiler_1.NodeCompiler {
constructor() {
super(...arguments);
this.kind = typescript_1.default.SyntaxKind.ForOfStatement;
}
visitNode(sb, node, optionsIn) {
const options = sb.pushValueOptions(optionsIn);
const initializer = ts_utils_1.tsUtils.statement.getInitializer(node);
if (!typescript_1.default.isVariableDeclarationList(initializer)) {
sb.context.reportUnsupported(initializer);
return;
}
const variables = ts_utils_1.tsUtils.variable.getDeclarations(initializer);
if (variables.length !== 1) {
sb.context.reportUnsupported(initializer);
return;
}
const variable = variables[0];
const nameNode = ts_utils_1.tsUtils.node.getNameNode(variable);
const variableType = sb.context.analysis.getType(nameNode);
const expression = ts_utils_1.tsUtils.expression.getExpression(node);
const statement = ts_utils_1.tsUtils.statement.getStatement(node);
const each = (innerOptions) => {
if (typescript_1.default.isIdentifier(nameNode)) {
sb.scope.add(ts_utils_1.tsUtils.node.getText(nameNode));
sb.scope.set(sb, nameNode, innerOptions, ts_utils_1.tsUtils.node.getText(nameNode));
}
else if (typescript_1.default.isArrayBindingPattern(nameNode)) {
sb.emitHelper(nameNode, innerOptions, sb.helpers.arrayBinding({ type: variableType }));
}
else {
sb.emitHelper(nameNode, innerOptions, sb.helpers.objectBinding({ type: variableType }));
}
sb.visit(statement, sb.noPushValueOptions(innerOptions));
};
const handleOther = (innerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
};
const handleArray = (innerOptions, withIndex = false, arrEach = each) => {
sb.emitHelper(expression, innerOptions, sb.helpers.unwrapArray);
sb.emitHelper(node, innerOptions, sb.helpers.arrForEach({
withIndex,
each: arrEach,
}));
};
const handleArrayStorage = (innerOptions) => {
sb.emitHelper(node, sb.noPushValueOptions(innerOptions), sb.helpers.forEachValStructuredStorage({
type: constants_1.Types.ArrayStorage,
each,
}));
};
const handleMap = (innerOptions) => {
sb.emitHelper(expression, innerOptions, sb.helpers.unwrapMap);
sb.emitSysCall(expression, 'Neo.Iterator.Create');
sb.emitHelper(node, innerOptions, sb.helpers.rawIteratorForEach({
each: (innerInnerOptionsIn) => {
const innerInnerOptions = sb.pushValueOptions(innerInnerOptionsIn);
sb.emitPushInt(node, 2);
sb.emitOp(node, 'PACK');
sb.emitHelper(node, innerInnerOptions, sb.helpers.wrapArray);
each(innerInnerOptions);
},
}));
};
const handleMapStorage = (innerOptions) => {
sb.emitHelper(node, sb.noPushValueOptions(innerOptions), sb.helpers.forEachStructuredStorage({
type: constants_1.Types.MapStorage,
each: (innerInnerOptionsIn) => {
const innerInnerOptions = sb.pushValueOptions(innerInnerOptionsIn);
sb.emitPushInt(node, 2);
sb.emitOp(node, 'PACK');
sb.emitHelper(node, innerInnerOptions, sb.helpers.wrapArray);
each(innerInnerOptions);
},
}));
};
const handleSet = (innerOptions) => {
sb.emitHelper(expression, innerOptions, sb.helpers.unwrapSet);
sb.emitSysCall(expression, 'Neo.Iterator.Create');
sb.emitHelper(node, innerOptions, sb.helpers.rawIteratorForEachKey({ each }));
};
const handleSetStorage = (innerOptions) => {
sb.emitHelper(node, sb.noPushValueOptions(innerOptions), sb.helpers.forEachKeyStructuredStorage({
type: constants_1.Types.SetStorage,
each,
}));
};
const handleIterableIterator = (innerOptions) => {
sb.emitHelper(node, sb.noPushValueOptions(innerOptions), sb.helpers.iterableIteratorForEach({
each,
}));
};
const handleIterable = (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.forIterableType({
array: handleArray,
map: handleMap,
set: handleSet,
arrayStorage: handleArrayStorage,
mapStorage: handleMapStorage,
setStorage: handleSetStorage,
iterableIterator: handleIterableIterator,
defaultCase: handleOther,
}));
};
if (typescript_1.default.isCallExpression(expression)) {
const valueExpression = ts_utils_1.tsUtils.expression.getExpression(expression);
if (typescript_1.default.isPropertyAccessExpression(valueExpression)) {
const value = ts_utils_1.tsUtils.expression.getExpression(valueExpression);
const name = ts_utils_1.tsUtils.node.getNameNode(valueExpression);
const builtinProp = sb.context.builtins.getMember(value, name);
if (builtinProp !== undefined && builtinProp instanceof entries_1.ArrayEntries) {
sb.visit(value, options);
handleArray(options, true, (innerOptions) => {
sb.emitOp(variable, 'SWAP');
sb.emitHelper(variable, sb.pushValueOptions(innerOptions), sb.helpers.wrapNumber);
sb.emitPushInt(variable, 2);
sb.emitOp(variable, 'PACK');
sb.emitHelper(variable, sb.pushValueOptions(innerOptions), sb.helpers.wrapArray);
each(innerOptions);
});
return;
}
}
}
sb.visit(expression, options);
sb.emitHelper(node, options, sb.helpers.forBuiltinType({
type: sb.context.analysis.getType(expression),
array: handleArray,
arrayStorage: handleArrayStorage,
boolean: handleOther,
buffer: handleOther,
null: handleOther,
number: handleOther,
object: handleOther,
string: handleOther,
symbol: handleOther,
undefined: handleOther,
map: handleMap,
mapStorage: handleMapStorage,
set: handleSet,
setStorage: handleSetStorage,
error: handleOther,
forwardValue: handleOther,
iteratorResult: handleOther,
iterable: handleIterable,
iterableIterator: handleIterableIterator,
transaction: handleOther,
output: handleOther,
attribute: handleOther,
input: handleOther,
account: handleOther,
asset: handleOther,
contract: handleOther,
header: handleOther,
block: handleOther,
}));
}
}
exports.ForOfStatementCompiler = ForOfStatementCompiler;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFFLFdBQVc7WUFDeEIsTUFBTSxFQUFFLFdBQVc7WUFDbkIsU0FBUyxFQUFFLFdBQVc7WUFDdEIsS0FBSyxFQUFFLFdBQVc7WUFDbEIsT0FBTyxFQUFFLFdBQVc7WUFDcEIsS0FBSyxFQUFFLFdBQVc7WUFDbEIsUUFBUSxFQUFFLFdBQVc7WUFDckIsTUFBTSxFQUFFLFdBQVc7WUFDbkIsS0FBSyxFQUFFLFdBQVc7U0FDbkIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF4T0Qsd0RBd09DIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvc3RhdGVtZW50L0Zvck9mU3RhdGVtZW50Q29tcGlsZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgQXJyYXlFbnRyaWVzIH0gZnJvbSAnLi4vYnVpbHRpbnMvYXJyYXkvZW50cmllcyc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOb2RlQ29tcGlsZXIgfSBmcm9tICcuLi9Ob2RlQ29tcGlsZXInO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEZvck9mU3RhdGVtZW50Q29tcGlsZXIgZXh0ZW5kcyBOb2RlQ29tcGlsZXI8dHMuRm9yT2ZTdGF0ZW1lbnQ+IHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSB0cy5TeW50YXhLaW5kLkZvck9mU3RhdGVtZW50O1xuXG4gIHB1YmxpYyB2aXNpdE5vZGUoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLkZvck9mU3RhdGVtZW50LCBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBzYi5wdXNoVmFsdWVPcHRpb25zKG9wdGlvbnNJbik7XG4gICAgY29uc3QgaW5pdGlhbGl6ZXIgPSB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbml0aWFsaXplcihub2RlKTtcbiAgICBpZiAoIXRzLmlzVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoaW5pdGlhbGl6ZXIpKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgc2IuY29udGV4dC5yZXBvcnRVbnN1cHBvcnRlZChpbml0aWFsaXplcik7XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVzID0gdHNVdGlscy52YXJpYWJsZS5nZXREZWNsYXJhdGlvbnMoaW5pdGlhbGl6ZXIpO1xuICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgc2IuY29udGV4dC5yZXBvcnRVbnN1cHBvcnRlZChpbml0aWFsaXplcik7XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGUgPSB2YXJpYWJsZXNbMF07XG4gICAgY29uc3QgbmFtZU5vZGUgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZU5vZGUodmFyaWFibGUpO1xuICAgIGNvbnN0IHZhcmlhYmxlVHlwZSA9IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZShuYW1lTm9kZSk7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRzVXRpbHMuZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKG5vZGUpO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IHRzVXRpbHMuc3RhdGVtZW50LmdldFN0YXRlbWVudChub2RlKTtcblxuICAgIGNvbnN0IGVhY2ggPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobmFtZU5vZGUpKSB7XG4gICAgICAgIHNiLnNjb3BlLmFkZCh0c1V0aWxzLm5vZGUuZ2V0VGV4dChuYW1lTm9kZSkpO1xuICAgICAgICBzYi5zY29wZS5zZXQoc2IsIG5hbWVOb2RlLCBpbm5lck9wdGlvbnMsIHRzVXRpbHMubm9kZS5nZXRUZXh0KG5hbWVOb2RlKSk7XG4gICAgICB9IGVsc2UgaWYgKHRzLmlzQXJyYXlCaW5kaW5nUGF0dGVybihuYW1lTm9kZSkpIHtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihuYW1lTm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmFycmF5QmluZGluZyh7IHR5cGU6IHZhcmlhYmxlVHlwZSB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzYi5lbWl0SGVscGVyKG5hbWVOb2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMub2JqZWN0QmluZGluZyh7IHR5cGU6IHZhcmlhYmxlVHlwZSB9KSk7XG4gICAgICB9XG4gICAgICBzYi52aXNpdChzdGF0ZW1lbnQsIHNiLm5vUHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlT3RoZXIgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudGhyb3dUeXBlRXJyb3IpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVBcnJheSA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucywgd2l0aEluZGV4ID0gZmFsc2UsIGFyckVhY2ggPSBlYWNoKSA9PiB7XG4gICAgICAvLyBbYXJyXVxuICAgICAgc2IuZW1pdEhlbHBlcihleHByZXNzaW9uLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwQXJyYXkpO1xuICAgICAgLy8gW11cbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgc2IuaGVscGVycy5hcnJGb3JFYWNoKHtcbiAgICAgICAgICB3aXRoSW5kZXgsXG4gICAgICAgICAgZWFjaDogYXJyRWFjaCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVBcnJheVN0b3JhZ2UgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHNiLm5vUHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpLFxuICAgICAgICBzYi5oZWxwZXJzLmZvckVhY2hWYWxTdHJ1Y3R1cmVkU3RvcmFnZSh7XG4gICAgICAgICAgdHlwZTogVHlwZXMuQXJyYXlTdG9yYWdlLFxuICAgICAgICAgIGVhY2gsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTWFwID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAvLyBbbWFwXVxuICAgICAgc2IuZW1pdEhlbHBlcihleHByZXNzaW9uLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwTWFwKTtcbiAgICAgIC8vIFtpdGVyYXRvcl1cbiAgICAgIHNiLmVtaXRTeXNDYWxsKGV4cHJlc3Npb24sICdOZW8uSXRlcmF0b3IuQ3JlYXRlJyk7XG4gICAgICAvLyBbXVxuICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgbm9kZSxcbiAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICBzYi5oZWxwZXJzLnJhd0l0ZXJhdG9yRm9yRWFjaCh7XG4gICAgICAgICAgZWFjaDogKGlubmVySW5uZXJPcHRpb25zSW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVySW5uZXJPcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lcklubmVyT3B0aW9uc0luKTtcbiAgICAgICAgICAgIC8vIFsyLCBrZXksIHZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDIpO1xuICAgICAgICAgICAgLy8gW2Fycl1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnUEFDSycpO1xuICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJJbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcEFycmF5KTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBlYWNoKGlubmVySW5uZXJPcHRpb25zKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1hcFN0b3JhZ2UgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHNiLm5vUHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpLFxuICAgICAgICBzYi5oZWxwZXJzLmZvckVhY2hTdHJ1Y3R1cmVkU3RvcmFnZSh7XG4gICAgICAgICAgdHlwZTogVHlwZXMuTWFwU3RvcmFnZSxcbiAgICAgICAgICBlYWNoOiAoaW5uZXJJbm5lck9wdGlvbnNJbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJJbm5lck9wdGlvbnMgPSBzYi5wdXNoVmFsdWVPcHRpb25zKGlubmVySW5uZXJPcHRpb25zSW4pO1xuICAgICAgICAgICAgLy8gW251bWJlciwga2V5VmFsLCB2YWx1ZVZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDIpO1xuICAgICAgICAgICAgLy8gW2Fycl1cbiAgICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnUEFDSycpO1xuICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJJbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcEFycmF5KTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBlYWNoKGlubmVySW5uZXJPcHRpb25zKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVNldCA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgLy8gW21hcF1cbiAgICAgIHNiLmVtaXRIZWxwZXIoZXhwcmVzc2lvbiwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcFNldCk7XG4gICAgICAvLyBbaXRlcmF0b3JdXG4gICAgICBzYi5lbWl0U3lzQ2FsbChleHByZXNzaW9uLCAnTmVvLkl0ZXJhdG9yLkNyZWF0ZScpO1xuICAgICAgLy8gW11cbiAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnJhd0l0ZXJhdG9yRm9yRWFjaEtleSh7IGVhY2ggfSkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVTZXRTdG9yYWdlID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICBub2RlLFxuICAgICAgICBzYi5ub1B1c2hWYWx1ZU9wdGlvbnMoaW5uZXJPcHRpb25zKSxcbiAgICAgICAgc2IuaGVscGVycy5mb3JFYWNoS2V5U3RydWN0dXJlZFN0b3JhZ2Uoe1xuICAgICAgICAgIHR5cGU6IFR5cGVzLlNldFN0b3JhZ2UsXG4gICAgICAgICAgZWFjaCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVJdGVyYWJsZUl0ZXJhdG9yID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICBub2RlLFxuICAgICAgICBzYi5ub1B1c2hWYWx1ZU9wdGlvbnMoaW5uZXJPcHRpb25zKSxcbiAgICAgICAgc2IuaGVscGVycy5pdGVyYWJsZUl0ZXJhdG9yRm9yRWFjaCh7XG4gICAgICAgICAgZWFjaCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVJdGVyYWJsZSA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgbm9kZSxcbiAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICBzYi5oZWxwZXJzLmZvckl0ZXJhYmxlVHlwZSh7XG4gICAgICAgICAgYXJyYXk6IGhhbmRsZUFycmF5LFxuICAgICAgICAgIG1hcDogaGFuZGxlTWFwLFxuICAgICAgICAgIHNldDogaGFuZGxlU2V0LFxuICAgICAgICAgIGFycmF5U3RvcmFnZTogaGFuZGxlQXJyYXlTdG9yYWdlLFxuICAgICAgICAgIG1hcFN0b3JhZ2U6IGhhbmRsZU1hcFN0b3JhZ2UsXG4gICAgICAgICAgc2V0U3RvcmFnZTogaGFuZGxlU2V0U3RvcmFnZSxcbiAgICAgICAgICBpdGVyYWJsZUl0ZXJhdG9yOiBoYW5kbGVJdGVyYWJsZUl0ZXJhdG9yLFxuICAgICAgICAgIGRlZmF1bHRDYXNlOiBoYW5kbGVPdGhlcixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgY29uc3QgdmFsdWVFeHByZXNzaW9uID0gdHNVdGlscy5leHByZXNzaW9uLmdldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgICBpZiAodHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24odmFsdWVFeHByZXNzaW9uKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRzVXRpbHMuZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKHZhbHVlRXhwcmVzc2lvbik7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZU5vZGUodmFsdWVFeHByZXNzaW9uKTtcblxuICAgICAgICBjb25zdCBidWlsdGluUHJvcCA9IHNiLmNvbnRleHQuYnVpbHRpbnMuZ2V0TWVtYmVyKHZhbHVlLCBuYW1lKTtcbiAgICAgICAgaWYgKGJ1aWx0aW5Qcm9wICE9PSB1bmRlZmluZWQgJiYgYnVpbHRpblByb3AgaW5zdGFuY2VvZiBBcnJheUVudHJpZXMpIHtcbiAgICAgICAgICAvLyBbdmFsXVxuICAgICAgICAgIHNiLnZpc2l0KHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgICBoYW5kbGVBcnJheShvcHRpb25zLCB0cnVlLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAvLyBbaWR4LCB2YWxdXG4gICAgICAgICAgICBzYi5lbWl0T3AodmFyaWFibGUsICdTV0FQJyk7XG4gICAgICAgICAgICAvLyBbaWR4VmFsLCB2YWxdXG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKHZhcmlhYmxlLCBzYi5wdXNoVmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucyksIHNiLmhlbHBlcnMud3JhcE51bWJlcik7XG4gICAgICAgICAgICAvLyBbMiwgaWR4VmFsLCB2YWxdXG4gICAgICAgICAgICBzYi5lbWl0UHVzaEludCh2YXJpYWJsZSwgMik7XG4gICAgICAgICAgICAvLyBbYXJyXVxuICAgICAgICAgICAgc2IuZW1pdE9wKHZhcmlhYmxlLCAnUEFDSycpO1xuICAgICAgICAgICAgLy8gW2FycmF5VmFsXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcih2YXJpYWJsZSwgc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpLCBzYi5oZWxwZXJzLndyYXBBcnJheSk7XG4gICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgZWFjaChpbm5lck9wdGlvbnMpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gW3ZhbF1cbiAgICBzYi52aXNpdChleHByZXNzaW9uLCBvcHRpb25zKTtcbiAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgbm9kZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzYi5oZWxwZXJzLmZvckJ1aWx0aW5UeXBlKHtcbiAgICAgICAgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKGV4cHJlc3Npb24pLFxuICAgICAgICBhcnJheTogaGFuZGxlQXJyYXksXG4gICAgICAgIGFycmF5U3RvcmFnZTogaGFuZGxlQXJyYXlTdG9yYWdlLFxuICAgICAgICBib29sZWFuOiBoYW5kbGVPdGhlcixcbiAgICAgICAgYnVmZmVyOiBoYW5kbGVPdGhlcixcbiAgICAgICAgbnVsbDogaGFuZGxlT3RoZXIsXG4gICAgICAgIG51bWJlcjogaGFuZGxlT3RoZXIsXG4gICAgICAgIG9iamVjdDogaGFuZGxlT3RoZXIsXG4gICAgICAgIHN0cmluZzogaGFuZGxlT3RoZXIsXG4gICAgICAgIHN5bWJvbDogaGFuZGxlT3RoZXIsXG4gICAgICAgIHVuZGVmaW5lZDogaGFuZGxlT3RoZXIsXG4gICAgICAgIG1hcDogaGFuZGxlTWFwLFxuICAgICAgICBtYXBTdG9yYWdlOiBoYW5kbGVNYXBTdG9yYWdlLFxuICAgICAgICBzZXQ6IGhhbmRsZVNldCxcbiAgICAgICAgc2V0U3RvcmFnZTogaGFuZGxlU2V0U3RvcmFnZSxcbiAgICAgICAgZXJyb3I6IGhhbmRsZU90aGVyLFxuICAgICAgICBmb3J3YXJkVmFsdWU6IGhhbmRsZU90aGVyLFxuICAgICAgICBpdGVyYXRvclJlc3VsdDogaGFuZGxlT3RoZXIsXG4gICAgICAgIGl0ZXJhYmxlOiBoYW5kbGVJdGVyYWJsZSxcbiAgICAgICAgaXRlcmFibGVJdGVyYXRvcjogaGFuZGxlSXRlcmFibGVJdGVyYXRvcixcbiAgICAgICAgdHJhbnNhY3Rpb246IGhhbmRsZU90aGVyLFxuICAgICAgICBvdXRwdXQ6IGhhbmRsZU90aGVyLFxuICAgICAgICBhdHRyaWJ1dGU6IGhhbmRsZU90aGVyLFxuICAgICAgICBpbnB1dDogaGFuZGxlT3RoZXIsXG4gICAgICAgIGFjY291bnQ6IGhhbmRsZU90aGVyLFxuICAgICAgICBhc3NldDogaGFuZGxlT3RoZXIsXG4gICAgICAgIGNvbnRyYWN0OiBoYW5kbGVPdGhlcixcbiAgICAgICAgaGVhZGVyOiBoYW5kbGVPdGhlcixcbiAgICAgICAgYmxvY2s6IGhhbmRsZU90aGVyLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIl19