UNPKG

faastjs

Version:

Serverless batch computing made simple.

127 lines 18.3 kB
import test from "ava"; import { faast, providers } from "../index.js"; import * as funcs from "../test/fixtures/functions.mjs"; import { configs, noValidateConfigs, title } from "../test/fixtures/util.js"; async function testBasicEsm(t, provider, options) { const opts = { timeout: 60, gc: "off", description: t.title, env: { faastEnvironmentVariable: "the_answer_is_42" }, ...options }; const faastModule = await faast(provider, funcs, opts); const remote = faastModule.functions; try { t.is(await remote.hello("Andy"), "Hello Andy!"); t.is(await remote.identityString("你好"), "你好"); t.is(await remote.identityNum(42), 42); t.is(await remote.identityNum(Infinity), Infinity); t.is(await remote.identityNum(-Infinity), -Infinity); // if (nodeMajorVersion() >= 10) { // t.is(await remote.identityNum(NaN), NaN); // } // t.is(await remote.empty(), undefined); // t.is(await remote.arrow("arrow"), "arrow"); // t.is(await remote.asyncArrow("asyncArrow"), "asyncArrow"); // t.is(await remote.fact(5), 120); // t.is(await remote.concat("abc", "def"), "abcdef"); // await t.throwsAsync(() => remote.error("hey"), { // message: /Expected error. Arg: hey/ // }); // t.is(await remote.noargs(), "called function with no args."); // t.is(await remote.async(), "async function: success"); // t.is(typeof (await remote.path()), "string"); // t.is(await remote.optionalArg(), "No arg"); // t.is(await remote.optionalArg("has arg"), "has arg"); // const date = new Date(); // t.deepEqual(await remote.identityDate(date), date); // const buffer = Buffer.from("contents"); // t.deepEqual(await remote.identityBuffer(buffer), buffer); // t.deepEqual(await remote.identityArrayNum([42, 8, 10]), [42, 8, 10]); // const inf = [Infinity, -Infinity]; // t.deepEqual(await remote.identityArrayNum(inf), inf); // if (nodeMajorVersion() >= 10) { // t.deepEqual(await remote.identityArrayNum([NaN]), [NaN]); // } // t.deepEqual(await remote.identityArrayString(["a", "there"]), ["a", "there"]); // t.is(await remote.identityBool(true), true); // t.is(await remote.identityBool(false), false); // t.is(await remote.identityUndefined(undefined), undefined); // t.is(await remote.identityNull(null), null); // t.deepEqual(await remote.identityObject({}), {}); // t.deepEqual(await remote.identityObject({ a: 42, b: "hello" }), { // a: 42, // b: "hello" // }); // const int8 = Int8Array.of(0, -8, 42); // t.deepEqual(await remote.identityInt8(int8), int8); // const uint8 = Uint8Array.of(0, 8, 42); // t.deepEqual(await remote.identityUint8(uint8), uint8); // const uint8Clamped = Uint8ClampedArray.of(0, 8, 42); // t.deepEqual(await remote.identityUint8Clamped(uint8Clamped), uint8Clamped); // const int16 = Int16Array.of(0, 8, 42, -1); // t.deepEqual(await remote.identityInt16(int16), int16); // const uint16 = Uint16Array.of(0, 8, 42, -1); // t.deepEqual(await remote.identityUint16(uint16), uint16); // const int32 = Int32Array.of(0, 8, 42, -1); // t.deepEqual(await remote.identityInt32(int32), int32); // const uint32 = Uint32Array.of(0, 8, 42, -1); // t.deepEqual(await remote.identityUint32(uint32), uint32); // const float32 = Float32Array.of(0, 0.3, 100.042, -1); // t.deepEqual(await remote.identityFloat32(float32), float32); // const float64 = Float64Array.of(0, 0.3, 100.042, -1); // t.deepEqual(await remote.identityFloat64(float64), float64); // const m = new Map([ // [1, 2], // [42, 10] // ]); // t.deepEqual(await remote.identityMap(m), m); // const s = new Set([1, 42, 100]); // t.deepEqual(await remote.identitySet(s), s); // try { // await remote.emptyReject(); // t.fail("remote.emptyReject() did not reject as expected"); // } catch (err: any) { // t.is(err, undefined); // } // try { // await remote.rejected(); // t.fail("remote.rejected() did not reject as expected"); // } catch (err: any) { // t.is(err, "intentionally rejected"); // } // try { // await remote.customError(); // t.fail("remote.customError() did not reject as expected"); // } catch (err: any) { // t.true(err instanceof FaastError); // t.truthy(err.message.match(/^custom error message/)); // t.is(FaastError.info(err).custom, "custom value"); // } // t.is(await remote.getEnv("faastEnvironmentVariable"), "the_answer_is_42"); // t.is(await remote.getEnv("faastNonexistent"), undefined); // t.deepEqual(await remote.returnsError(), funcs.returnsError()); // const elements = ["bar", "baz"]; // t.deepEqual(await toArray(remote.generator(elements)), elements); // t.deepEqual(await toArray(remote.asyncGenerator(elements)), elements); // try { // for await (const _ of remote.asyncGeneratorError("async generator failed")) { // // ignore // } // t.fail(`remote.asyncGeneratorError() did not reject as expected (2)`); // } catch (err: any) { // t.true(err instanceof FaastError); // t.truthy((err as FaastError).message.match(/^async generator failed/)); // } } finally { await faastModule.cleanup(); } } for (const provider of providers) { for (const config of [...configs, ...noValidateConfigs]) { test.serial(title(provider, `esm basic calls`, config), testBasicEsm, provider, config); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNtLnRlc3QubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC9lc20udGVzdC5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUEwQixNQUFNLEtBQUssQ0FBQztBQUM3QyxPQUFPLEVBQWlCLEtBQUssRUFBWSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEUsT0FBTyxLQUFLLEtBQUssTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdFLEtBQUssVUFBVSxZQUFZLENBQ3ZCLENBQW1CLEVBQ25CLFFBQWtCLEVBQ2xCLE9BQXNCO0lBRXRCLE1BQU0sSUFBSSxHQUFrQjtRQUN4QixPQUFPLEVBQUUsRUFBRTtRQUNYLEVBQUUsRUFBRSxLQUFLO1FBQ1QsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLO1FBQ3BCLEdBQUcsRUFBRSxFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFO1FBQ3JELEdBQUcsT0FBTztLQUNiLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFFckMsSUFBSSxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELGtDQUFrQztRQUNsQyxnREFBZ0Q7UUFDaEQsSUFBSTtRQUNKLHlDQUF5QztRQUN6Qyw4Q0FBOEM7UUFDOUMsNkRBQTZEO1FBQzdELG1DQUFtQztRQUNuQyxxREFBcUQ7UUFDckQsbURBQW1EO1FBQ25ELDBDQUEwQztRQUMxQyxNQUFNO1FBQ04sZ0VBQWdFO1FBQ2hFLHlEQUF5RDtRQUN6RCxnREFBZ0Q7UUFDaEQsOENBQThDO1FBQzlDLHdEQUF3RDtRQUV4RCwyQkFBMkI7UUFDM0Isc0RBQXNEO1FBRXRELDBDQUEwQztRQUMxQyw0REFBNEQ7UUFFNUQsd0VBQXdFO1FBRXhFLHFDQUFxQztRQUNyQyx3REFBd0Q7UUFFeEQsa0NBQWtDO1FBQ2xDLGdFQUFnRTtRQUNoRSxJQUFJO1FBQ0osaUZBQWlGO1FBQ2pGLCtDQUErQztRQUMvQyxpREFBaUQ7UUFDakQsOERBQThEO1FBQzlELCtDQUErQztRQUMvQyxvREFBb0Q7UUFDcEQsb0VBQW9FO1FBQ3BFLGFBQWE7UUFDYixpQkFBaUI7UUFDakIsTUFBTTtRQUNOLHdDQUF3QztRQUN4QyxzREFBc0Q7UUFFdEQseUNBQXlDO1FBQ3pDLHlEQUF5RDtRQUV6RCx1REFBdUQ7UUFDdkQsOEVBQThFO1FBRTlFLDZDQUE2QztRQUM3Qyx5REFBeUQ7UUFFekQsK0NBQStDO1FBQy9DLDREQUE0RDtRQUU1RCw2Q0FBNkM7UUFDN0MseURBQXlEO1FBRXpELCtDQUErQztRQUMvQyw0REFBNEQ7UUFFNUQsd0RBQXdEO1FBQ3hELCtEQUErRDtRQUUvRCx3REFBd0Q7UUFDeEQsK0RBQStEO1FBRS9ELHNCQUFzQjtRQUN0QixjQUFjO1FBQ2QsZUFBZTtRQUNmLE1BQU07UUFDTiwrQ0FBK0M7UUFFL0MsbUNBQW1DO1FBQ25DLCtDQUErQztRQUUvQyxRQUFRO1FBQ1Isa0NBQWtDO1FBQ2xDLGlFQUFpRTtRQUNqRSx1QkFBdUI7UUFDdkIsNEJBQTRCO1FBQzVCLElBQUk7UUFDSixRQUFRO1FBQ1IsK0JBQStCO1FBQy9CLDhEQUE4RDtRQUM5RCx1QkFBdUI7UUFDdkIsMkNBQTJDO1FBQzNDLElBQUk7UUFDSixRQUFRO1FBQ1Isa0NBQWtDO1FBQ2xDLGlFQUFpRTtRQUNqRSx1QkFBdUI7UUFDdkIseUNBQXlDO1FBQ3pDLDREQUE0RDtRQUM1RCx5REFBeUQ7UUFDekQsSUFBSTtRQUNKLDZFQUE2RTtRQUM3RSw0REFBNEQ7UUFDNUQsa0VBQWtFO1FBRWxFLG1DQUFtQztRQUNuQyxvRUFBb0U7UUFDcEUseUVBQXlFO1FBQ3pFLFFBQVE7UUFDUixvRkFBb0Y7UUFDcEYsb0JBQW9CO1FBQ3BCLFFBQVE7UUFDUiw2RUFBNkU7UUFDN0UsdUJBQXVCO1FBQ3ZCLHlDQUF5QztRQUN6Qyw4RUFBOEU7UUFDOUUsSUFBSTtJQUNSLENBQUM7WUFBUyxDQUFDO1FBQ1AsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQy9CLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEVBQzFDLFlBQVksRUFDWixRQUFRLEVBQ1IsTUFBTSxDQUNULENBQUM7SUFDTixDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0ZXN0LCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiYXZhXCI7XG5pbXBvcnQgeyBDb21tb25PcHRpb25zLCBmYWFzdCwgUHJvdmlkZXIsIHByb3ZpZGVycyB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0ICogYXMgZnVuY3MgZnJvbSBcIi4uL3Rlc3QvZml4dHVyZXMvZnVuY3Rpb25zLm1qc1wiO1xuaW1wb3J0IHsgY29uZmlncywgbm9WYWxpZGF0ZUNvbmZpZ3MsIHRpdGxlIH0gZnJvbSBcIi4uL3Rlc3QvZml4dHVyZXMvdXRpbC5qc1wiO1xuXG5hc3luYyBmdW5jdGlvbiB0ZXN0QmFzaWNFc20oXG4gICAgdDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICBwcm92aWRlcjogUHJvdmlkZXIsXG4gICAgb3B0aW9uczogQ29tbW9uT3B0aW9uc1xuKSB7XG4gICAgY29uc3Qgb3B0czogQ29tbW9uT3B0aW9ucyA9IHtcbiAgICAgICAgdGltZW91dDogNjAsXG4gICAgICAgIGdjOiBcIm9mZlwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogdC50aXRsZSxcbiAgICAgICAgZW52OiB7IGZhYXN0RW52aXJvbm1lbnRWYXJpYWJsZTogXCJ0aGVfYW5zd2VyX2lzXzQyXCIgfSxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICBjb25zdCBmYWFzdE1vZHVsZSA9IGF3YWl0IGZhYXN0KHByb3ZpZGVyLCBmdW5jcywgb3B0cyk7XG4gICAgY29uc3QgcmVtb3RlID0gZmFhc3RNb2R1bGUuZnVuY3Rpb25zO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaGVsbG8oXCJBbmR5XCIpLCBcIkhlbGxvIEFuZHkhXCIpO1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eVN0cmluZyhcIuS9oOWlvVwiKSwgXCLkvaDlpb1cIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5TnVtKDQyKSwgNDIpO1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eU51bShJbmZpbml0eSksIEluZmluaXR5KTtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlOdW0oLUluZmluaXR5KSwgLUluZmluaXR5KTtcbiAgICAgICAgLy8gaWYgKG5vZGVNYWpvclZlcnNpb24oKSA+PSAxMCkge1xuICAgICAgICAvLyAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlOdW0oTmFOKSwgTmFOKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5lbXB0eSgpLCB1bmRlZmluZWQpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5hcnJvdyhcImFycm93XCIpLCBcImFycm93XCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5hc3luY0Fycm93KFwiYXN5bmNBcnJvd1wiKSwgXCJhc3luY0Fycm93XCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5mYWN0KDUpLCAxMjApO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5jb25jYXQoXCJhYmNcIiwgXCJkZWZcIiksIFwiYWJjZGVmXCIpO1xuICAgICAgICAvLyBhd2FpdCB0LnRocm93c0FzeW5jKCgpID0+IHJlbW90ZS5lcnJvcihcImhleVwiKSwge1xuICAgICAgICAvLyAgICAgbWVzc2FnZTogL0V4cGVjdGVkIGVycm9yLiBBcmc6IGhleS9cbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLm5vYXJncygpLCBcImNhbGxlZCBmdW5jdGlvbiB3aXRoIG5vIGFyZ3MuXCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5hc3luYygpLCBcImFzeW5jIGZ1bmN0aW9uOiBzdWNjZXNzXCIpO1xuICAgICAgICAvLyB0LmlzKHR5cGVvZiAoYXdhaXQgcmVtb3RlLnBhdGgoKSksIFwic3RyaW5nXCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5vcHRpb25hbEFyZygpLCBcIk5vIGFyZ1wiKTtcbiAgICAgICAgLy8gdC5pcyhhd2FpdCByZW1vdGUub3B0aW9uYWxBcmcoXCJoYXMgYXJnXCIpLCBcImhhcyBhcmdcIik7XG5cbiAgICAgICAgLy8gY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eURhdGUoZGF0ZSksIGRhdGUpO1xuXG4gICAgICAgIC8vIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFwiY29udGVudHNcIik7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUJ1ZmZlcihidWZmZXIpLCBidWZmZXIpO1xuXG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUFycmF5TnVtKFs0MiwgOCwgMTBdKSwgWzQyLCA4LCAxMF0pO1xuXG4gICAgICAgIC8vIGNvbnN0IGluZiA9IFtJbmZpbml0eSwgLUluZmluaXR5XTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5QXJyYXlOdW0oaW5mKSwgaW5mKTtcblxuICAgICAgICAvLyBpZiAobm9kZU1ham9yVmVyc2lvbigpID49IDEwKSB7XG4gICAgICAgIC8vICAgICB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlBcnJheU51bShbTmFOXSksIFtOYU5dKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlBcnJheVN0cmluZyhbXCJhXCIsIFwidGhlcmVcIl0pLCBbXCJhXCIsIFwidGhlcmVcIl0pO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eUJvb2wodHJ1ZSksIHRydWUpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eUJvb2woZmFsc2UpLCBmYWxzZSk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5VW5kZWZpbmVkKHVuZGVmaW5lZCksIHVuZGVmaW5lZCk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5TnVsbChudWxsKSwgbnVsbCk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eU9iamVjdCh7fSksIHt9KTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5T2JqZWN0KHsgYTogNDIsIGI6IFwiaGVsbG9cIiB9KSwge1xuICAgICAgICAvLyAgICAgYTogNDIsXG4gICAgICAgIC8vICAgICBiOiBcImhlbGxvXCJcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnN0IGludDggPSBJbnQ4QXJyYXkub2YoMCwgLTgsIDQyKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5SW50OChpbnQ4KSwgaW50OCk7XG5cbiAgICAgICAgLy8gY29uc3QgdWludDggPSBVaW50OEFycmF5Lm9mKDAsIDgsIDQyKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5VWludDgodWludDgpLCB1aW50OCk7XG5cbiAgICAgICAgLy8gY29uc3QgdWludDhDbGFtcGVkID0gVWludDhDbGFtcGVkQXJyYXkub2YoMCwgOCwgNDIpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlVaW50OENsYW1wZWQodWludDhDbGFtcGVkKSwgdWludDhDbGFtcGVkKTtcblxuICAgICAgICAvLyBjb25zdCBpbnQxNiA9IEludDE2QXJyYXkub2YoMCwgOCwgNDIsIC0xKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5SW50MTYoaW50MTYpLCBpbnQxNik7XG5cbiAgICAgICAgLy8gY29uc3QgdWludDE2ID0gVWludDE2QXJyYXkub2YoMCwgOCwgNDIsIC0xKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5VWludDE2KHVpbnQxNiksIHVpbnQxNik7XG5cbiAgICAgICAgLy8gY29uc3QgaW50MzIgPSBJbnQzMkFycmF5Lm9mKDAsIDgsIDQyLCAtMSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUludDMyKGludDMyKSwgaW50MzIpO1xuXG4gICAgICAgIC8vIGNvbnN0IHVpbnQzMiA9IFVpbnQzMkFycmF5Lm9mKDAsIDgsIDQyLCAtMSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eVVpbnQzMih1aW50MzIpLCB1aW50MzIpO1xuXG4gICAgICAgIC8vIGNvbnN0IGZsb2F0MzIgPSBGbG9hdDMyQXJyYXkub2YoMCwgMC4zLCAxMDAuMDQyLCAtMSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUZsb2F0MzIoZmxvYXQzMiksIGZsb2F0MzIpO1xuXG4gICAgICAgIC8vIGNvbnN0IGZsb2F0NjQgPSBGbG9hdDY0QXJyYXkub2YoMCwgMC4zLCAxMDAuMDQyLCAtMSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUZsb2F0NjQoZmxvYXQ2NCksIGZsb2F0NjQpO1xuXG4gICAgICAgIC8vIGNvbnN0IG0gPSBuZXcgTWFwKFtcbiAgICAgICAgLy8gICAgIFsxLCAyXSxcbiAgICAgICAgLy8gICAgIFs0MiwgMTBdXG4gICAgICAgIC8vIF0pO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlNYXAobSksIG0pO1xuXG4gICAgICAgIC8vIGNvbnN0IHMgPSBuZXcgU2V0KFsxLCA0MiwgMTAwXSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eVNldChzKSwgcyk7XG5cbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgLy8gICAgIGF3YWl0IHJlbW90ZS5lbXB0eVJlamVjdCgpO1xuICAgICAgICAvLyAgICAgdC5mYWlsKFwicmVtb3RlLmVtcHR5UmVqZWN0KCkgZGlkIG5vdCByZWplY3QgYXMgZXhwZWN0ZWRcIik7XG4gICAgICAgIC8vIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIC8vICAgICB0LmlzKGVyciwgdW5kZWZpbmVkKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB0cnkge1xuICAgICAgICAvLyAgICAgYXdhaXQgcmVtb3RlLnJlamVjdGVkKCk7XG4gICAgICAgIC8vICAgICB0LmZhaWwoXCJyZW1vdGUucmVqZWN0ZWQoKSBkaWQgbm90IHJlamVjdCBhcyBleHBlY3RlZFwiKTtcbiAgICAgICAgLy8gfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgLy8gICAgIHQuaXMoZXJyLCBcImludGVudGlvbmFsbHkgcmVqZWN0ZWRcIik7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgLy8gICAgIGF3YWl0IHJlbW90ZS5jdXN0b21FcnJvcigpO1xuICAgICAgICAvLyAgICAgdC5mYWlsKFwicmVtb3RlLmN1c3RvbUVycm9yKCkgZGlkIG5vdCByZWplY3QgYXMgZXhwZWN0ZWRcIik7XG4gICAgICAgIC8vIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIC8vICAgICB0LnRydWUoZXJyIGluc3RhbmNlb2YgRmFhc3RFcnJvcik7XG4gICAgICAgIC8vICAgICB0LnRydXRoeShlcnIubWVzc2FnZS5tYXRjaCgvXmN1c3RvbSBlcnJvciBtZXNzYWdlLykpO1xuICAgICAgICAvLyAgICAgdC5pcyhGYWFzdEVycm9yLmluZm8oZXJyKS5jdXN0b20sIFwiY3VzdG9tIHZhbHVlXCIpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmdldEVudihcImZhYXN0RW52aXJvbm1lbnRWYXJpYWJsZVwiKSwgXCJ0aGVfYW5zd2VyX2lzXzQyXCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5nZXRFbnYoXCJmYWFzdE5vbmV4aXN0ZW50XCIpLCB1bmRlZmluZWQpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUucmV0dXJuc0Vycm9yKCksIGZ1bmNzLnJldHVybnNFcnJvcigpKTtcblxuICAgICAgICAvLyBjb25zdCBlbGVtZW50cyA9IFtcImJhclwiLCBcImJhelwiXTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgdG9BcnJheShyZW1vdGUuZ2VuZXJhdG9yKGVsZW1lbnRzKSksIGVsZW1lbnRzKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgdG9BcnJheShyZW1vdGUuYXN5bmNHZW5lcmF0b3IoZWxlbWVudHMpKSwgZWxlbWVudHMpO1xuICAgICAgICAvLyB0cnkge1xuICAgICAgICAvLyAgICAgZm9yIGF3YWl0IChjb25zdCBfIG9mIHJlbW90ZS5hc3luY0dlbmVyYXRvckVycm9yKFwiYXN5bmMgZ2VuZXJhdG9yIGZhaWxlZFwiKSkge1xuICAgICAgICAvLyAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdC5mYWlsKGByZW1vdGUuYXN5bmNHZW5lcmF0b3JFcnJvcigpIGRpZCBub3QgcmVqZWN0IGFzIGV4cGVjdGVkICgyKWApO1xuICAgICAgICAvLyB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAvLyAgICAgdC50cnVlKGVyciBpbnN0YW5jZW9mIEZhYXN0RXJyb3IpO1xuICAgICAgICAvLyAgICAgdC50cnV0aHkoKGVyciBhcyBGYWFzdEVycm9yKS5tZXNzYWdlLm1hdGNoKC9eYXN5bmMgZ2VuZXJhdG9yIGZhaWxlZC8pKTtcbiAgICAgICAgLy8gfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IGZhYXN0TW9kdWxlLmNsZWFudXAoKTtcbiAgICB9XG59XG5cbmZvciAoY29uc3QgcHJvdmlkZXIgb2YgcHJvdmlkZXJzKSB7XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgWy4uLmNvbmZpZ3MsIC4uLm5vVmFsaWRhdGVDb25maWdzXSkge1xuICAgICAgICB0ZXN0LnNlcmlhbChcbiAgICAgICAgICAgIHRpdGxlKHByb3ZpZGVyLCBgZXNtIGJhc2ljIGNhbGxzYCwgY29uZmlnKSxcbiAgICAgICAgICAgIHRlc3RCYXNpY0VzbSxcbiAgICAgICAgICAgIHByb3ZpZGVyLFxuICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19