UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

113 lines (111 loc) 17.7 kB
"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 DiagnosticCode_1 = require("../../DiagnosticCode"); const DiagnosticMessage_1 = require("../../DiagnosticMessage"); const builtins_1 = require("../builtins"); const NodeCompiler_1 = require("../NodeCompiler"); class PropertyAccessExpressionCompiler extends NodeCompiler_1.NodeCompiler { constructor() { super(...arguments); this.kind = typescript_1.default.SyntaxKind.PropertyAccessExpression; } visitNode(sb, expr, optionsIn) { const value = ts_utils_1.tsUtils.expression.getExpression(expr); const valueType = sb.context.analysis.getType(value); const name = ts_utils_1.tsUtils.node.getNameNode(expr); const nameValue = ts_utils_1.tsUtils.node.getName(expr); const handleBuiltin = (member, visited) => { if (builtins_1.isBuiltinInstanceMemberValue(member)) { member.emitValue(sb, expr, optionsIn, visited); return; } if (builtins_1.isBuiltinMemberValue(member)) { member.emitValue(sb, expr, optionsIn); return; } if (optionsIn.setValue) { sb.context.reportError(name, DiagnosticCode_1.DiagnosticCode.InvalidBuiltinModify, DiagnosticMessage_1.DiagnosticMessage.CannotModifyBuiltin); } else { sb.context.reportError(name, DiagnosticCode_1.DiagnosticCode.InvalidBuiltinReference, DiagnosticMessage_1.DiagnosticMessage.CannotReferenceBuiltinProperty); } }; const builtin = sb.context.builtins.getMember(value, name); if (builtin !== undefined) { handleBuiltin(builtin, false); return; } const throwTypeError = (innerOptions) => { sb.emitOp(expr, 'DROP'); sb.emitHelper(expr, innerOptions, sb.helpers.throwTypeError); }; const createProcessBuiltin = (valueName) => { const member = sb.context.builtins.getOnlyMember(valueName, nameValue); if (member === undefined) { return throwTypeError; } return () => { handleBuiltin(member, true); }; }; const processObject = (innerOptions) => { sb.emitPushString(name, nameValue); if (optionsIn.pushValue && optionsIn.setValue) { sb.emitOp(expr, 'OVER'); sb.emitOp(expr, 'OVER'); sb.emitPushInt(expr, 4); sb.emitOp(expr, 'ROLL'); sb.emitHelper(expr, innerOptions, sb.helpers.setPropertyObjectProperty); sb.emitHelper(expr, innerOptions, sb.helpers.getPropertyObjectProperty); } else if (optionsIn.setValue) { sb.emitOp(expr, 'ROT'); sb.emitHelper(expr, innerOptions, sb.helpers.setPropertyObjectProperty); } else { sb.emitHelper(expr, innerOptions, sb.helpers.getPropertyObjectProperty); if (!optionsIn.pushValue) { sb.emitOp(expr, 'DROP'); } } }; const options = sb.pushValueOptions(sb.noSetValueOptions(optionsIn)); sb.visit(value, options); sb.emitHelper(value, options, sb.helpers.forBuiltinType({ type: valueType, array: createProcessBuiltin('Array'), arrayStorage: createProcessBuiltin('ArrayStorage'), boolean: createProcessBuiltin('Boolean'), buffer: createProcessBuiltin('Buffer'), null: throwTypeError, number: createProcessBuiltin('Number'), object: processObject, string: createProcessBuiltin('String'), symbol: createProcessBuiltin('Symbol'), undefined: throwTypeError, map: createProcessBuiltin('Map'), mapStorage: createProcessBuiltin('MapStorage'), set: createProcessBuiltin('Set'), setStorage: createProcessBuiltin('SetStorage'), error: createProcessBuiltin('Error'), forwardValue: createProcessBuiltin('ForwardValue'), iteratorResult: createProcessBuiltin('IteratorResult'), iterable: createProcessBuiltin('Iterable'), iterableIterator: createProcessBuiltin('IterableIterator'), transaction: createProcessBuiltin('TransactionBase'), output: createProcessBuiltin('Output'), attribute: createProcessBuiltin('AttributeBase'), input: createProcessBuiltin('Input'), account: createProcessBuiltin('Account'), asset: createProcessBuiltin('Asset'), contract: createProcessBuiltin('Contract'), header: createProcessBuiltin('Header'), block: createProcessBuiltin('Block'), })); } } exports.PropertyAccessExpressionCompiler = PropertyAccessExpressionCompiler; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbkNvbXBpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUE0QztBQUM1QyxvRUFBNEI7QUFDNUIseURBQXNEO0FBQ3RELCtEQUE0RDtBQUM1RCwwQ0FBMEY7QUFDMUYsa0RBQStDO0FBSS9DLE1BQWEsZ0NBQWlDLFNBQVEsMkJBQXlDO0lBQS9GOztRQUNrQixTQUFJLEdBQUcsb0JBQUUsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUM7SUFrSWhFLENBQUM7SUFoSVEsU0FBUyxDQUFDLEVBQWlCLEVBQUUsSUFBaUMsRUFBRSxTQUF1QjtRQUM1RixNQUFNLEtBQUssR0FBRyxrQkFBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLGtCQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxrQkFBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0MsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFlLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO1lBQzFELElBQUksdUNBQTRCLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBRS9DLE9BQU87YUFDUjtZQUVELElBQUksK0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFdEMsT0FBTzthQUNSO1lBRUQsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFO2dCQUN0QixFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsK0JBQWMsQ0FBQyxvQkFBb0IsRUFBRSxxQ0FBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2FBQzFHO2lCQUFNO2dCQUNMLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUNwQixJQUFJLEVBQ0osK0JBQWMsQ0FBQyx1QkFBdUIsRUFDdEMscUNBQWlCLENBQUMsOEJBQThCLENBQ2pELENBQUM7YUFDSDtRQUNILENBQUMsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3pCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFOUIsT0FBTztTQUNSO1FBRUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxZQUEwQixFQUFFLEVBQUU7WUFHcEQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFeEIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDO1FBRUYsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRTtZQUNqRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRXZFLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDeEIsT0FBTyxjQUFjLENBQUM7YUFDdkI7WUFFRCxPQUFPLEdBQUcsRUFBRTtnQkFDVixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsWUFBMEIsRUFBRSxFQUFFO1lBQ25ELEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLElBQUksU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFO2dCQUU3QyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFeEIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBRXhCLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV4QixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFeEIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztnQkFFeEUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQzthQUN6RTtpQkFBTSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUU7Z0JBRTdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUV2QixFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2FBQ3pFO2lCQUFNO2dCQUdMLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7Z0JBRXhFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO29CQUV4QixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDekI7YUFDRjtRQUNILENBQUMsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6QixFQUFFLENBQUMsVUFBVSxDQUNYLEtBQUssRUFDTCxPQUFPLEVBQ1AsRUFBRSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDeEIsSUFBSSxFQUFFLFNBQVM7WUFDZixLQUFLLEVBQUUsb0JBQW9CLENBQUMsT0FBTyxDQUFDO1lBQ3BDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxjQUFjLENBQUM7WUFDbEQsT0FBTyxFQUFFLG9CQUFvQixDQUFDLFNBQVMsQ0FBQztZQUN4QyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDO1lBQ3RDLElBQUksRUFBRSxjQUFjO1lBQ3BCLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7WUFDdEMsTUFBTSxFQUFFLGFBQWE7WUFDckIsTUFBTSxFQUFFLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztZQUN0QyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxjQUFjO1lBQ3pCLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7WUFDaEMsVUFBVSxFQUFFLG9CQUFvQixDQUFDLFlBQVksQ0FBQztZQUM5QyxHQUFHLEVBQUUsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLENBQUM7WUFDOUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztZQUNwQyxZQUFZLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDO1lBQ2xELGNBQWMsRUFBRSxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN0RCxRQUFRLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxDQUFDO1lBQzFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDO1lBQzFELFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQztZQUNwRCxNQUFNLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxlQUFlLENBQUM7WUFDaEQsS0FBSyxFQUFFLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztZQUNwQyxPQUFPLEVBQUUsb0JBQW9CLENBQUMsU0FBUyxDQUFDO1lBQ3hDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7WUFDcEMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztZQUMxQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDO1lBQ3RDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7U0FDckMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFuSUQsNEVBbUlDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvZXhwcmVzc2lvbi9Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25Db21waWxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29kZSB9IGZyb20gJy4uLy4uL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi4vLi4vRGlhZ25vc3RpY01lc3NhZ2UnO1xuaW1wb3J0IHsgQnVpbHRpbiwgaXNCdWlsdGluSW5zdGFuY2VNZW1iZXJWYWx1ZSwgaXNCdWlsdGluTWVtYmVyVmFsdWUgfSBmcm9tICcuLi9idWlsdGlucyc7XG5pbXBvcnQgeyBOb2RlQ29tcGlsZXIgfSBmcm9tICcuLi9Ob2RlQ29tcGlsZXInO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbkNvbXBpbGVyIGV4dGVuZHMgTm9kZUNvbXBpbGVyPHRzLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9IHRzLlN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uO1xuXG4gIHB1YmxpYyB2aXNpdE5vZGUoc2I6IFNjcmlwdEJ1aWxkZXIsIGV4cHI6IHRzLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRzVXRpbHMuZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKGV4cHIpO1xuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZSh2YWx1ZSk7XG4gICAgY29uc3QgbmFtZSA9IHRzVXRpbHMubm9kZS5nZXROYW1lTm9kZShleHByKTtcbiAgICBjb25zdCBuYW1lVmFsdWUgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZShleHByKTtcblxuICAgIGNvbnN0IGhhbmRsZUJ1aWx0aW4gPSAobWVtYmVyOiBCdWlsdGluLCB2aXNpdGVkOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoaXNCdWlsdGluSW5zdGFuY2VNZW1iZXJWYWx1ZShtZW1iZXIpKSB7XG4gICAgICAgIG1lbWJlci5lbWl0VmFsdWUoc2IsIGV4cHIsIG9wdGlvbnNJbiwgdmlzaXRlZCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNCdWlsdGluTWVtYmVyVmFsdWUobWVtYmVyKSkge1xuICAgICAgICBtZW1iZXIuZW1pdFZhbHVlKHNiLCBleHByLCBvcHRpb25zSW4pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnNJbi5zZXRWYWx1ZSkge1xuICAgICAgICBzYi5jb250ZXh0LnJlcG9ydEVycm9yKG5hbWUsIERpYWdub3N0aWNDb2RlLkludmFsaWRCdWlsdGluTW9kaWZ5LCBEaWFnbm9zdGljTWVzc2FnZS5DYW5ub3RNb2RpZnlCdWlsdGluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNiLmNvbnRleHQucmVwb3J0RXJyb3IoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBEaWFnbm9zdGljQ29kZS5JbnZhbGlkQnVpbHRpblJlZmVyZW5jZSxcbiAgICAgICAgICBEaWFnbm9zdGljTWVzc2FnZS5DYW5ub3RSZWZlcmVuY2VCdWlsdGluUHJvcGVydHksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGJ1aWx0aW4gPSBzYi5jb250ZXh0LmJ1aWx0aW5zLmdldE1lbWJlcih2YWx1ZSwgbmFtZSk7XG4gICAgaWYgKGJ1aWx0aW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFuZGxlQnVpbHRpbihidWlsdGluLCBmYWxzZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0aHJvd1R5cGVFcnJvciA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgLy8gW11cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBzYi5lbWl0T3AoZXhwciwgJ0RST1AnKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBzYi5lbWl0SGVscGVyKGV4cHIsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWF0ZVByb2Nlc3NCdWlsdGluID0gKHZhbHVlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtZW1iZXIgPSBzYi5jb250ZXh0LmJ1aWx0aW5zLmdldE9ubHlNZW1iZXIodmFsdWVOYW1lLCBuYW1lVmFsdWUpO1xuXG4gICAgICBpZiAobWVtYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRocm93VHlwZUVycm9yO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBoYW5kbGVCdWlsdGluKG1lbWJlciwgdHJ1ZSk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBwcm9jZXNzT2JqZWN0ID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICBzYi5lbWl0UHVzaFN0cmluZyhuYW1lLCBuYW1lVmFsdWUpO1xuICAgICAgaWYgKG9wdGlvbnNJbi5wdXNoVmFsdWUgJiYgb3B0aW9uc0luLnNldFZhbHVlKSB7XG4gICAgICAgIC8vIFtvYmplY3RWYWwsIHN0cmluZywgb2JqZWN0VmFsLCB2YWxdXG4gICAgICAgIHNiLmVtaXRPcChleHByLCAnT1ZFUicpO1xuICAgICAgICAvLyBbc3RyaW5nLCBvYmplY3RWYWwsIHN0cmluZywgb2JqZWN0VmFsLCB2YWxdXG4gICAgICAgIHNiLmVtaXRPcChleHByLCAnT1ZFUicpO1xuICAgICAgICAvLyBbbnVtYmVyLCBzdHJpbmcsIG9iamVjdFZhbCwgc3RyaW5nLCBvYmplY3RWYWwsIHZhbF1cbiAgICAgICAgc2IuZW1pdFB1c2hJbnQoZXhwciwgNCk7XG4gICAgICAgIC8vIFt2YWwsIHN0cmluZywgb2JqZWN0VmFsLCBzdHJpbmcsIG9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdE9wKGV4cHIsICdST0xMJyk7XG4gICAgICAgIC8vIFtzdHJpbmcsIG9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuc2V0UHJvcGVydHlPYmplY3RQcm9wZXJ0eSk7XG4gICAgICAgIC8vIFt2YWxdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoZXhwciwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmdldFByb3BlcnR5T2JqZWN0UHJvcGVydHkpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zSW4uc2V0VmFsdWUpIHtcbiAgICAgICAgLy8gW3ZhbCwgc3RyaW5nLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRPcChleHByLCAnUk9UJyk7XG4gICAgICAgIC8vIFtdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIoZXhwciwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnNldFByb3BlcnR5T2JqZWN0UHJvcGVydHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIGdldHRlciBzaWRlIGVmZmVjdHNcbiAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuZ2V0UHJvcGVydHlPYmplY3RQcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zSW4ucHVzaFZhbHVlKSB7XG4gICAgICAgICAgLy8gW11cbiAgICAgICAgICBzYi5lbWl0T3AoZXhwciwgJ0RST1AnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhzYi5ub1NldFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pKTtcbiAgICAvLyBbdmFsXVxuICAgIHNiLnZpc2l0KHZhbHVlLCBvcHRpb25zKTtcbiAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgdmFsdWUsXG4gICAgICBvcHRpb25zLFxuICAgICAgc2IuaGVscGVycy5mb3JCdWlsdGluVHlwZSh7XG4gICAgICAgIHR5cGU6IHZhbHVlVHlwZSxcbiAgICAgICAgYXJyYXk6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBcnJheScpLFxuICAgICAgICBhcnJheVN0b3JhZ2U6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBcnJheVN0b3JhZ2UnKSxcbiAgICAgICAgYm9vbGVhbjogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0Jvb2xlYW4nKSxcbiAgICAgICAgYnVmZmVyOiBjcmVhdGVQcm9jZXNzQnVpbHRpbignQnVmZmVyJyksXG4gICAgICAgIG51bGw6IHRocm93VHlwZUVycm9yLFxuICAgICAgICBudW1iZXI6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdOdW1iZXInKSxcbiAgICAgICAgb2JqZWN0OiBwcm9jZXNzT2JqZWN0LFxuICAgICAgICBzdHJpbmc6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdTdHJpbmcnKSxcbiAgICAgICAgc3ltYm9sOiBjcmVhdGVQcm9jZXNzQnVpbHRpbignU3ltYm9sJyksXG4gICAgICAgIHVuZGVmaW5lZDogdGhyb3dUeXBlRXJyb3IsXG4gICAgICAgIG1hcDogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ01hcCcpLFxuICAgICAgICBtYXBTdG9yYWdlOiBjcmVhdGVQcm9jZXNzQnVpbHRpbignTWFwU3RvcmFnZScpLFxuICAgICAgICBzZXQ6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdTZXQnKSxcbiAgICAgICAgc2V0U3RvcmFnZTogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ1NldFN0b3JhZ2UnKSxcbiAgICAgICAgZXJyb3I6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdFcnJvcicpLFxuICAgICAgICBmb3J3YXJkVmFsdWU6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdGb3J3YXJkVmFsdWUnKSxcbiAgICAgICAgaXRlcmF0b3JSZXN1bHQ6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdJdGVyYXRvclJlc3VsdCcpLFxuICAgICAgICBpdGVyYWJsZTogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0l0ZXJhYmxlJyksXG4gICAgICAgIGl0ZXJhYmxlSXRlcmF0b3I6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICAgICAgIHRyYW5zYWN0aW9uOiBjcmVhdGVQcm9jZXNzQnVpbHRpbignVHJhbnNhY3Rpb25CYXNlJyksXG4gICAgICAgIG91dHB1dDogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ091dHB1dCcpLFxuICAgICAgICBhdHRyaWJ1dGU6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBdHRyaWJ1dGVCYXNlJyksXG4gICAgICAgIGlucHV0OiBjcmVhdGVQcm9jZXNzQnVpbHRpbignSW5wdXQnKSxcbiAgICAgICAgYWNjb3VudDogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0FjY291bnQnKSxcbiAgICAgICAgYXNzZXQ6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBc3NldCcpLFxuICAgICAgICBjb250cmFjdDogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0NvbnRyYWN0JyksXG4gICAgICAgIGhlYWRlcjogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0hlYWRlcicpLFxuICAgICAgICBibG9jazogY3JlYXRlUHJvY2Vzc0J1aWx0aW4oJ0Jsb2NrJyksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=