faastjs
Version:
Serverless batch computing made simple.
127 lines • 18.2 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNtLnRlc3QubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC9lc20udGVzdC5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUEwQixNQUFNLEtBQUssQ0FBQztBQUM3QyxPQUFPLEVBQWlCLEtBQUssRUFBWSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEUsT0FBTyxLQUFLLEtBQUssTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdFLEtBQUssVUFBVSxZQUFZLENBQ3ZCLENBQW1CLEVBQ25CLFFBQWtCLEVBQ2xCLE9BQXNCO0lBRXRCLE1BQU0sSUFBSSxHQUFrQjtRQUN4QixPQUFPLEVBQUUsRUFBRTtRQUNYLEVBQUUsRUFBRSxLQUFLO1FBQ1QsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLO1FBQ3BCLEdBQUcsRUFBRSxFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFO1FBQ3JELEdBQUcsT0FBTztLQUNiLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFFckMsSUFBSTtRQUNBLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxrQ0FBa0M7UUFDbEMsZ0RBQWdEO1FBQ2hELElBQUk7UUFDSix5Q0FBeUM7UUFDekMsOENBQThDO1FBQzlDLDZEQUE2RDtRQUM3RCxtQ0FBbUM7UUFDbkMscURBQXFEO1FBQ3JELG1EQUFtRDtRQUNuRCwwQ0FBMEM7UUFDMUMsTUFBTTtRQUNOLGdFQUFnRTtRQUNoRSx5REFBeUQ7UUFDekQsZ0RBQWdEO1FBQ2hELDhDQUE4QztRQUM5Qyx3REFBd0Q7UUFFeEQsMkJBQTJCO1FBQzNCLHNEQUFzRDtRQUV0RCwwQ0FBMEM7UUFDMUMsNERBQTREO1FBRTVELHdFQUF3RTtRQUV4RSxxQ0FBcUM7UUFDckMsd0RBQXdEO1FBRXhELGtDQUFrQztRQUNsQyxnRUFBZ0U7UUFDaEUsSUFBSTtRQUNKLGlGQUFpRjtRQUNqRiwrQ0FBK0M7UUFDL0MsaURBQWlEO1FBQ2pELDhEQUE4RDtRQUM5RCwrQ0FBK0M7UUFDL0Msb0RBQW9EO1FBQ3BELG9FQUFvRTtRQUNwRSxhQUFhO1FBQ2IsaUJBQWlCO1FBQ2pCLE1BQU07UUFDTix3Q0FBd0M7UUFDeEMsc0RBQXNEO1FBRXRELHlDQUF5QztRQUN6Qyx5REFBeUQ7UUFFekQsdURBQXVEO1FBQ3ZELDhFQUE4RTtRQUU5RSw2Q0FBNkM7UUFDN0MseURBQXlEO1FBRXpELCtDQUErQztRQUMvQyw0REFBNEQ7UUFFNUQsNkNBQTZDO1FBQzdDLHlEQUF5RDtRQUV6RCwrQ0FBK0M7UUFDL0MsNERBQTREO1FBRTVELHdEQUF3RDtRQUN4RCwrREFBK0Q7UUFFL0Qsd0RBQXdEO1FBQ3hELCtEQUErRDtRQUUvRCxzQkFBc0I7UUFDdEIsY0FBYztRQUNkLGVBQWU7UUFDZixNQUFNO1FBQ04sK0NBQStDO1FBRS9DLG1DQUFtQztRQUNuQywrQ0FBK0M7UUFFL0MsUUFBUTtRQUNSLGtDQUFrQztRQUNsQyxpRUFBaUU7UUFDakUsdUJBQXVCO1FBQ3ZCLDRCQUE0QjtRQUM1QixJQUFJO1FBQ0osUUFBUTtRQUNSLCtCQUErQjtRQUMvQiw4REFBOEQ7UUFDOUQsdUJBQXVCO1FBQ3ZCLDJDQUEyQztRQUMzQyxJQUFJO1FBQ0osUUFBUTtRQUNSLGtDQUFrQztRQUNsQyxpRUFBaUU7UUFDakUsdUJBQXVCO1FBQ3ZCLHlDQUF5QztRQUN6Qyw0REFBNEQ7UUFDNUQseURBQXlEO1FBQ3pELElBQUk7UUFDSiw2RUFBNkU7UUFDN0UsNERBQTREO1FBQzVELGtFQUFrRTtRQUVsRSxtQ0FBbUM7UUFDbkMsb0VBQW9FO1FBQ3BFLHlFQUF5RTtRQUN6RSxRQUFRO1FBQ1Isb0ZBQW9GO1FBQ3BGLG9CQUFvQjtRQUNwQixRQUFRO1FBQ1IsNkVBQTZFO1FBQzdFLHVCQUF1QjtRQUN2Qix5Q0FBeUM7UUFDekMsOEVBQThFO1FBQzlFLElBQUk7S0FDUDtZQUFTO1FBQ04sTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDL0I7QUFDTCxDQUFDO0FBRUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUU7SUFDOUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsRUFBRTtRQUNyRCxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEVBQzFDLFlBQVksRUFDWixRQUFRLEVBQ1IsTUFBTSxDQUNULENBQUM7S0FDTDtDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHRlc3QsIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJhdmFcIjtcbmltcG9ydCB7IENvbW1vbk9wdGlvbnMsIGZhYXN0LCBQcm92aWRlciwgcHJvdmlkZXJzIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyBmdW5jcyBmcm9tIFwiLi4vdGVzdC9maXh0dXJlcy9mdW5jdGlvbnMubWpzXCI7XG5pbXBvcnQgeyBjb25maWdzLCBub1ZhbGlkYXRlQ29uZmlncywgdGl0bGUgfSBmcm9tIFwiLi4vdGVzdC9maXh0dXJlcy91dGlsLmpzXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RCYXNpY0VzbShcbiAgICB0OiBFeGVjdXRpb25Db250ZXh0LFxuICAgIHByb3ZpZGVyOiBQcm92aWRlcixcbiAgICBvcHRpb25zOiBDb21tb25PcHRpb25zXG4pIHtcbiAgICBjb25zdCBvcHRzOiBDb21tb25PcHRpb25zID0ge1xuICAgICAgICB0aW1lb3V0OiA2MCxcbiAgICAgICAgZ2M6IFwib2ZmXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0LnRpdGxlLFxuICAgICAgICBlbnY6IHsgZmFhc3RFbnZpcm9ubWVudFZhcmlhYmxlOiBcInRoZV9hbnN3ZXJfaXNfNDJcIiB9LFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIGNvbnN0IGZhYXN0TW9kdWxlID0gYXdhaXQgZmFhc3QocHJvdmlkZXIsIGZ1bmNzLCBvcHRzKTtcbiAgICBjb25zdCByZW1vdGUgPSBmYWFzdE1vZHVsZS5mdW5jdGlvbnM7XG5cbiAgICB0cnkge1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5oZWxsbyhcIkFuZHlcIiksIFwiSGVsbG8gQW5keSFcIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5U3RyaW5nKFwi5L2g5aW9XCIpLCBcIuS9oOWlvVwiKTtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlOdW0oNDIpLCA0Mik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5TnVtKEluZmluaXR5KSwgSW5maW5pdHkpO1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eU51bSgtSW5maW5pdHkpLCAtSW5maW5pdHkpO1xuICAgICAgICAvLyBpZiAobm9kZU1ham9yVmVyc2lvbigpID49IDEwKSB7XG4gICAgICAgIC8vICAgICB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eU51bShOYU4pLCBOYU4pO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmVtcHR5KCksIHVuZGVmaW5lZCk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmFycm93KFwiYXJyb3dcIiksIFwiYXJyb3dcIik7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmFzeW5jQXJyb3coXCJhc3luY0Fycm93XCIpLCBcImFzeW5jQXJyb3dcIik7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmZhY3QoNSksIDEyMCk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmNvbmNhdChcImFiY1wiLCBcImRlZlwiKSwgXCJhYmNkZWZcIik7XG4gICAgICAgIC8vIGF3YWl0IHQudGhyb3dzQXN5bmMoKCkgPT4gcmVtb3RlLmVycm9yKFwiaGV5XCIpLCB7XG4gICAgICAgIC8vICAgICBtZXNzYWdlOiAvRXhwZWN0ZWQgZXJyb3IuIEFyZzogaGV5L1xuICAgICAgICAvLyB9KTtcbiAgICAgICAgLy8gdC5pcyhhd2FpdCByZW1vdGUubm9hcmdzKCksIFwiY2FsbGVkIGZ1bmN0aW9uIHdpdGggbm8gYXJncy5cIik7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmFzeW5jKCksIFwiYXN5bmMgZnVuY3Rpb246IHN1Y2Nlc3NcIik7XG4gICAgICAgIC8vIHQuaXModHlwZW9mIChhd2FpdCByZW1vdGUucGF0aCgpKSwgXCJzdHJpbmdcIik7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLm9wdGlvbmFsQXJnKCksIFwiTm8gYXJnXCIpO1xuICAgICAgICAvLyB0LmlzKGF3YWl0IHJlbW90ZS5vcHRpb25hbEFyZyhcImhhcyBhcmdcIiksIFwiaGFzIGFyZ1wiKTtcblxuICAgICAgICAvLyBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5RGF0ZShkYXRlKSwgZGF0ZSk7XG5cbiAgICAgICAgLy8gY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oXCJjb250ZW50c1wiKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5QnVmZmVyKGJ1ZmZlciksIGJ1ZmZlcik7XG5cbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5QXJyYXlOdW0oWzQyLCA4LCAxMF0pLCBbNDIsIDgsIDEwXSk7XG5cbiAgICAgICAgLy8gY29uc3QgaW5mID0gW0luZmluaXR5LCAtSW5maW5pdHldO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlBcnJheU51bShpbmYpLCBpbmYpO1xuXG4gICAgICAgIC8vIGlmIChub2RlTWFqb3JWZXJzaW9uKCkgPj0gMTApIHtcbiAgICAgICAgLy8gICAgIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUFycmF5TnVtKFtOYU5dKSwgW05hTl0pO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUFycmF5U3RyaW5nKFtcImFcIiwgXCJ0aGVyZVwiXSksIFtcImFcIiwgXCJ0aGVyZVwiXSk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5Qm9vbCh0cnVlKSwgdHJ1ZSk7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5Qm9vbChmYWxzZSksIGZhbHNlKTtcbiAgICAgICAgLy8gdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlVbmRlZmluZWQodW5kZWZpbmVkKSwgdW5kZWZpbmVkKTtcbiAgICAgICAgLy8gdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlOdWxsKG51bGwpLCBudWxsKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5T2JqZWN0KHt9KSwge30pO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlPYmplY3QoeyBhOiA0MiwgYjogXCJoZWxsb1wiIH0pLCB7XG4gICAgICAgIC8vICAgICBhOiA0MixcbiAgICAgICAgLy8gICAgIGI6IFwiaGVsbG9cIlxuICAgICAgICAvLyB9KTtcbiAgICAgICAgLy8gY29uc3QgaW50OCA9IEludDhBcnJheS5vZigwLCAtOCwgNDIpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlJbnQ4KGludDgpLCBpbnQ4KTtcblxuICAgICAgICAvLyBjb25zdCB1aW50OCA9IFVpbnQ4QXJyYXkub2YoMCwgOCwgNDIpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlVaW50OCh1aW50OCksIHVpbnQ4KTtcblxuICAgICAgICAvLyBjb25zdCB1aW50OENsYW1wZWQgPSBVaW50OENsYW1wZWRBcnJheS5vZigwLCA4LCA0Mik7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eVVpbnQ4Q2xhbXBlZCh1aW50OENsYW1wZWQpLCB1aW50OENsYW1wZWQpO1xuXG4gICAgICAgIC8vIGNvbnN0IGludDE2ID0gSW50MTZBcnJheS5vZigwLCA4LCA0MiwgLTEpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlJbnQxNihpbnQxNiksIGludDE2KTtcblxuICAgICAgICAvLyBjb25zdCB1aW50MTYgPSBVaW50MTZBcnJheS5vZigwLCA4LCA0MiwgLTEpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlVaW50MTYodWludDE2KSwgdWludDE2KTtcblxuICAgICAgICAvLyBjb25zdCBpbnQzMiA9IEludDMyQXJyYXkub2YoMCwgOCwgNDIsIC0xKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5SW50MzIoaW50MzIpLCBpbnQzMik7XG5cbiAgICAgICAgLy8gY29uc3QgdWludDMyID0gVWludDMyQXJyYXkub2YoMCwgOCwgNDIsIC0xKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5VWludDMyKHVpbnQzMiksIHVpbnQzMik7XG5cbiAgICAgICAgLy8gY29uc3QgZmxvYXQzMiA9IEZsb2F0MzJBcnJheS5vZigwLCAwLjMsIDEwMC4wNDIsIC0xKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5RmxvYXQzMihmbG9hdDMyKSwgZmxvYXQzMik7XG5cbiAgICAgICAgLy8gY29uc3QgZmxvYXQ2NCA9IEZsb2F0NjRBcnJheS5vZigwLCAwLjMsIDEwMC4wNDIsIC0xKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5RmxvYXQ2NChmbG9hdDY0KSwgZmxvYXQ2NCk7XG5cbiAgICAgICAgLy8gY29uc3QgbSA9IG5ldyBNYXAoW1xuICAgICAgICAvLyAgICAgWzEsIDJdLFxuICAgICAgICAvLyAgICAgWzQyLCAxMF1cbiAgICAgICAgLy8gXSk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eU1hcChtKSwgbSk7XG5cbiAgICAgICAgLy8gY29uc3QgcyA9IG5ldyBTZXQoWzEsIDQyLCAxMDBdKTtcbiAgICAgICAgLy8gdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5U2V0KHMpLCBzKTtcblxuICAgICAgICAvLyB0cnkge1xuICAgICAgICAvLyAgICAgYXdhaXQgcmVtb3RlLmVtcHR5UmVqZWN0KCk7XG4gICAgICAgIC8vICAgICB0LmZhaWwoXCJyZW1vdGUuZW1wdHlSZWplY3QoKSBkaWQgbm90IHJlamVjdCBhcyBleHBlY3RlZFwiKTtcbiAgICAgICAgLy8gfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgLy8gICAgIHQuaXMoZXJyLCB1bmRlZmluZWQpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIC8vICAgICBhd2FpdCByZW1vdGUucmVqZWN0ZWQoKTtcbiAgICAgICAgLy8gICAgIHQuZmFpbChcInJlbW90ZS5yZWplY3RlZCgpIGRpZCBub3QgcmVqZWN0IGFzIGV4cGVjdGVkXCIpO1xuICAgICAgICAvLyB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAvLyAgICAgdC5pcyhlcnIsIFwiaW50ZW50aW9uYWxseSByZWplY3RlZFwiKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB0cnkge1xuICAgICAgICAvLyAgICAgYXdhaXQgcmVtb3RlLmN1c3RvbUVycm9yKCk7XG4gICAgICAgIC8vICAgICB0LmZhaWwoXCJyZW1vdGUuY3VzdG9tRXJyb3IoKSBkaWQgbm90IHJlamVjdCBhcyBleHBlY3RlZFwiKTtcbiAgICAgICAgLy8gfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgLy8gICAgIHQudHJ1ZShlcnIgaW5zdGFuY2VvZiBGYWFzdEVycm9yKTtcbiAgICAgICAgLy8gICAgIHQudHJ1dGh5KGVyci5tZXNzYWdlLm1hdGNoKC9eY3VzdG9tIGVycm9yIG1lc3NhZ2UvKSk7XG4gICAgICAgIC8vICAgICB0LmlzKEZhYXN0RXJyb3IuaW5mbyhlcnIpLmN1c3RvbSwgXCJjdXN0b20gdmFsdWVcIik7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdC5pcyhhd2FpdCByZW1vdGUuZ2V0RW52KFwiZmFhc3RFbnZpcm9ubWVudFZhcmlhYmxlXCIpLCBcInRoZV9hbnN3ZXJfaXNfNDJcIik7XG4gICAgICAgIC8vIHQuaXMoYXdhaXQgcmVtb3RlLmdldEVudihcImZhYXN0Tm9uZXhpc3RlbnRcIiksIHVuZGVmaW5lZCk7XG4gICAgICAgIC8vIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5yZXR1cm5zRXJyb3IoKSwgZnVuY3MucmV0dXJuc0Vycm9yKCkpO1xuXG4gICAgICAgIC8vIGNvbnN0IGVsZW1lbnRzID0gW1wiYmFyXCIsIFwiYmF6XCJdO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCB0b0FycmF5KHJlbW90ZS5nZW5lcmF0b3IoZWxlbWVudHMpKSwgZWxlbWVudHMpO1xuICAgICAgICAvLyB0LmRlZXBFcXVhbChhd2FpdCB0b0FycmF5KHJlbW90ZS5hc3luY0dlbmVyYXRvcihlbGVtZW50cykpLCBlbGVtZW50cyk7XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIC8vICAgICBmb3IgYXdhaXQgKGNvbnN0IF8gb2YgcmVtb3RlLmFzeW5jR2VuZXJhdG9yRXJyb3IoXCJhc3luYyBnZW5lcmF0b3IgZmFpbGVkXCIpKSB7XG4gICAgICAgIC8vICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICB0LmZhaWwoYHJlbW90ZS5hc3luY0dlbmVyYXRvckVycm9yKCkgZGlkIG5vdCByZWplY3QgYXMgZXhwZWN0ZWQgKDIpYCk7XG4gICAgICAgIC8vIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIC8vICAgICB0LnRydWUoZXJyIGluc3RhbmNlb2YgRmFhc3RFcnJvcik7XG4gICAgICAgIC8vICAgICB0LnRydXRoeSgoZXJyIGFzIEZhYXN0RXJyb3IpLm1lc3NhZ2UubWF0Y2goL15hc3luYyBnZW5lcmF0b3IgZmFpbGVkLykpO1xuICAgICAgICAvLyB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZmFhc3RNb2R1bGUuY2xlYW51cCgpO1xuICAgIH1cbn1cblxuZm9yIChjb25zdCBwcm92aWRlciBvZiBwcm92aWRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBbLi4uY29uZmlncywgLi4ubm9WYWxpZGF0ZUNvbmZpZ3NdKSB7XG4gICAgICAgIHRlc3Quc2VyaWFsKFxuICAgICAgICAgICAgdGl0bGUocHJvdmlkZXIsIGBlc20gYmFzaWMgY2FsbHNgLCBjb25maWcpLFxuICAgICAgICAgICAgdGVzdEJhc2ljRXNtLFxuICAgICAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgICAgICBjb25maWdcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=