1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const ava_1 = require("ava");
|
4 | const index_1 = require("../index");
|
5 | const funcs = require("./fixtures/functions");
|
6 | const util_1 = require("./fixtures/util");
|
7 | function nodeMajorVersion() {
|
8 | const match = process.version.match(/^v(\d+)\./);
|
9 | if (match) {
|
10 | return Number(match[1]);
|
11 | }
|
12 | return 0;
|
13 | }
|
14 | async function testBasic(t, provider, options) {
|
15 | const opts = {
|
16 | timeout: 60,
|
17 | gc: "off",
|
18 | description: t.title,
|
19 | env: { faastEnvironmentVariable: "the_answer_is_42" },
|
20 | ...options
|
21 | };
|
22 | const faastModule = await (0, index_1.faast)(provider, funcs, opts);
|
23 | const remote = faastModule.functions;
|
24 | try {
|
25 | t.is(await remote.hello("Andy"), "Hello Andy!");
|
26 | t.is(await remote.identityString("你好"), "你好");
|
27 | t.is(await remote.identityNum(42), 42);
|
28 | t.is(await remote.identityNum(Infinity), Infinity);
|
29 | t.is(await remote.identityNum(-Infinity), -Infinity);
|
30 | if (nodeMajorVersion() >= 10) {
|
31 | t.is(await remote.identityNum(NaN), NaN);
|
32 | }
|
33 | t.is(await remote.empty(), undefined);
|
34 | t.is(await remote.arrow("arrow"), "arrow");
|
35 | t.is(await remote.asyncArrow("asyncArrow"), "asyncArrow");
|
36 | t.is(await remote.fact(5), 120);
|
37 | t.is(await remote.concat("abc", "def"), "abcdef");
|
38 | await t.throwsAsync(() => remote.error("hey"), {
|
39 | message: /Expected error. Arg: hey/
|
40 | });
|
41 | t.is(await remote.noargs(), "called function with no args.");
|
42 | t.is(await remote.async(), "async function: success");
|
43 | t.is(typeof (await remote.path()), "string");
|
44 | t.is(await remote.optionalArg(), "No arg");
|
45 | t.is(await remote.optionalArg("has arg"), "has arg");
|
46 | const date = new Date();
|
47 | t.deepEqual(await remote.identityDate(date), date);
|
48 | const buffer = Buffer.from("contents");
|
49 | t.deepEqual(await remote.identityBuffer(buffer), buffer);
|
50 | t.deepEqual(await remote.identityArrayNum([42, 8, 10]), [42, 8, 10]);
|
51 | const inf = [Infinity, -Infinity];
|
52 | t.deepEqual(await remote.identityArrayNum(inf), inf);
|
53 | if (nodeMajorVersion() >= 10) {
|
54 | t.deepEqual(await remote.identityArrayNum([NaN]), [NaN]);
|
55 | }
|
56 | t.deepEqual(await remote.identityArrayString(["a", "there"]), ["a", "there"]);
|
57 | t.is(await remote.identityBool(true), true);
|
58 | t.is(await remote.identityBool(false), false);
|
59 | t.is(await remote.identityUndefined(undefined), undefined);
|
60 | t.is(await remote.identityNull(null), null);
|
61 | t.deepEqual(await remote.identityObject({}), {});
|
62 | t.deepEqual(await remote.identityObject({ a: 42, b: "hello" }), {
|
63 | a: 42,
|
64 | b: "hello"
|
65 | });
|
66 | const int8 = Int8Array.of(0, -8, 42);
|
67 | t.deepEqual(await remote.identityInt8(int8), int8);
|
68 | const uint8 = Uint8Array.of(0, 8, 42);
|
69 | t.deepEqual(await remote.identityUint8(uint8), uint8);
|
70 | const uint8Clamped = Uint8ClampedArray.of(0, 8, 42);
|
71 | t.deepEqual(await remote.identityUint8Clamped(uint8Clamped), uint8Clamped);
|
72 | const int16 = Int16Array.of(0, 8, 42, -1);
|
73 | t.deepEqual(await remote.identityInt16(int16), int16);
|
74 | const uint16 = Uint16Array.of(0, 8, 42, -1);
|
75 | t.deepEqual(await remote.identityUint16(uint16), uint16);
|
76 | const int32 = Int32Array.of(0, 8, 42, -1);
|
77 | t.deepEqual(await remote.identityInt32(int32), int32);
|
78 | const uint32 = Uint32Array.of(0, 8, 42, -1);
|
79 | t.deepEqual(await remote.identityUint32(uint32), uint32);
|
80 | const float32 = Float32Array.of(0, 0.3, 100.042, -1);
|
81 | t.deepEqual(await remote.identityFloat32(float32), float32);
|
82 | const float64 = Float64Array.of(0, 0.3, 100.042, -1);
|
83 | t.deepEqual(await remote.identityFloat64(float64), float64);
|
84 | const m = new Map([
|
85 | [1, 2],
|
86 | [42, 10]
|
87 | ]);
|
88 | t.deepEqual(await remote.identityMap(m), m);
|
89 | const s = new Set([1, 42, 100]);
|
90 | t.deepEqual(await remote.identitySet(s), s);
|
91 | try {
|
92 | await remote.emptyReject();
|
93 | t.fail("remote.emptyReject() did not reject as expected");
|
94 | }
|
95 | catch (err) {
|
96 | t.is(err, undefined);
|
97 | }
|
98 | try {
|
99 | await remote.rejected();
|
100 | t.fail("remote.rejected() did not reject as expected");
|
101 | }
|
102 | catch (err) {
|
103 | t.is(err, "intentionally rejected");
|
104 | }
|
105 | try {
|
106 | await remote.customError();
|
107 | t.fail("remote.customError() did not reject as expected");
|
108 | }
|
109 | catch (err) {
|
110 | t.true(err instanceof index_1.FaastError);
|
111 | t.truthy(err.message.match(/^custom error message/));
|
112 | t.is(index_1.FaastError.info(err).custom, "custom value");
|
113 | }
|
114 | t.is(await remote.getEnv("faastEnvironmentVariable"), "the_answer_is_42");
|
115 | t.is(await remote.getEnv("faastNonexistent"), undefined);
|
116 | t.deepEqual(await remote.returnsError(), funcs.returnsError());
|
117 | const elements = ["bar", "baz"];
|
118 | t.deepEqual(await (0, util_1.toArray)(remote.generator(elements)), elements);
|
119 | t.deepEqual(await (0, util_1.toArray)(remote.asyncGenerator(elements)), elements);
|
120 | try {
|
121 | for await (const _ of remote.asyncGeneratorError("async generator failed")) {
|
122 | // ignore
|
123 | }
|
124 | t.fail(`remote.asyncGeneratorError() did not reject as expected (2)`);
|
125 | }
|
126 | catch (err) {
|
127 | t.true(err instanceof index_1.FaastError);
|
128 | t.truthy(err.message.match(/^async generator failed/));
|
129 | }
|
130 | }
|
131 | finally {
|
132 | await faastModule.cleanup();
|
133 | }
|
134 | }
|
135 | async function testBasicRequire(t, provider) {
|
136 | const requiredFuncs = require("./fixtures/functions");
|
137 | const opts = { timeout: 30, gc: "off", description: t.title };
|
138 | const faastModule = await (0, index_1.faast)(provider, requiredFuncs, opts);
|
139 | const remote = faastModule.functions;
|
140 | try {
|
141 | t.is(await remote.identityString("id"), "id");
|
142 | t.is(await remote.arrow("arrow"), "arrow");
|
143 | }
|
144 | finally {
|
145 | await faastModule.cleanup();
|
146 | }
|
147 | }
|
148 | // async function testCpuMetrics(t: ExecutionContext, provider: Provider) {
|
149 | // t.plan(4);
|
150 | // const lambda = await faast(provider, funcs, {
|
151 | // childProcess: true,
|
152 | // timeout: 90,
|
153 | // memorySize: 512,
|
154 | // maxRetries: 0,
|
155 | // gc: "off",
|
156 | // description: t.title
|
157 | // });
|
158 | // try {
|
159 | // const NSec = 4;
|
160 | // await lambda.functions.spin(NSec * 1000);
|
161 | // const usage = lambda.cpuUsage.get("spin");
|
162 | // t.truthy(usage);
|
163 | // t.true(usage!.size > 0);
|
164 | // for (const [, instance] of usage!) {
|
165 | // t.true(instance.stime instanceof Statistics);
|
166 | // t.true(instance.utime instanceof Statistics);
|
167 | // break;
|
168 | // }
|
169 | // } finally {
|
170 | // await lambda.cleanup();
|
171 | // }
|
172 | // }
|
173 | for (const provider of index_1.providers) {
|
174 | for (const config of [...util_1.configs, ...util_1.noValidateConfigs]) {
|
175 | ava_1.default.serial((0, util_1.title)(provider, `basic calls`, config), testBasic, provider, config);
|
176 | }
|
177 | // XXX Disable CPU metrics for now.
|
178 | // test(title(provider, `cpu metrics are received`), testCpuMetrics, provider);
|
179 | ava_1.default.serial((0, util_1.title)(provider, `basic calls with require`), testBasicRequire, provider);
|
180 | }
|
181 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvYmFzaWMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QztBQUM3QyxvQ0FBaUY7QUFDakYsOENBQThDO0FBQzlDLDBDQUE2RTtBQUU3RSxTQUFTLGdCQUFnQjtJQUNyQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRCxJQUFJLEtBQUssRUFBRTtRQUNQLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRUQsS0FBSyxVQUFVLFNBQVMsQ0FDcEIsQ0FBbUIsRUFDbkIsUUFBa0IsRUFDbEIsT0FBc0I7SUFFdEIsTUFBTSxJQUFJLEdBQWtCO1FBQ3hCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsRUFBRSxFQUFFLEtBQUs7UUFDVCxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUs7UUFDcEIsR0FBRyxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUU7UUFDckQsR0FBRyxPQUFPO0tBQ2IsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSxhQUFLLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBRXJDLElBQUk7UUFDQSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sTUFB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QUEwQixDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7Q0FDeEYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGVzdCwgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcImF2YVwiO1xuaW1wb3J0IHsgQ29tbW9uT3B0aW9ucywgZmFhc3QsIEZhYXN0RXJyb3IsIFByb3ZpZGVyLCBwcm92aWRlcnMgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCAqIGFzIGZ1bmNzIGZyb20gXCIuL2ZpeHR1cmVzL2Z1bmN0aW9uc1wiO1xuaW1wb3J0IHsgY29uZmlncywgbm9WYWxpZGF0ZUNvbmZpZ3MsIHRpdGxlLCB0b0FycmF5IH0gZnJvbSBcIi4vZml4dHVyZXMvdXRpbFwiO1xuXG5mdW5jdGlvbiBub2RlTWFqb3JWZXJzaW9uKCkge1xuICAgIGNvbnN0IG1hdGNoID0gcHJvY2Vzcy52ZXJzaW9uLm1hdGNoKC9edihcXGQrKVxcLi8pO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RCYXNpYyhcbiAgICB0OiBFeGVjdXRpb25Db250ZXh0LFxuICAgIHByb3ZpZGVyOiBQcm92aWRlcixcbiAgICBvcHRpb25zOiBDb21tb25PcHRpb25zXG4pIHtcbiAgICBjb25zdCBvcHRzOiBDb21tb25PcHRpb25zID0ge1xuICAgICAgICB0aW1lb3V0OiA2MCxcbiAgICAgICAgZ2M6IFwib2ZmXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0LnRpdGxlLFxuICAgICAgICBlbnY6IHsgZmFhc3RFbnZpcm9ubWVudFZhcmlhYmxlOiBcInRoZV9hbnN3ZXJfaXNfNDJcIiB9LFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIGNvbnN0IGZhYXN0TW9kdWxlID0gYXdhaXQgZmFhc3QocHJvdmlkZXIsIGZ1bmNzLCBvcHRzKTtcbiAgICBjb25zdCByZW1vdGUgPSBmYWFzdE1vZHVsZS5mdW5jdGlvbnM7XG5cbiAgICB0cnkge1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5oZWxsbyhcIkFuZHlcIiksIFwiSGVsbG8gQW5keSFcIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5U3RyaW5nKFwi5L2g5aW9XCIpLCBcIuS9oOWlvVwiKTtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlOdW0oNDIpLCA0Mik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5TnVtKEluZmluaXR5KSwgSW5maW5pdHkpO1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eU51bSgtSW5maW5pdHkpLCAtSW5maW5pdHkpO1xuICAgICAgICBpZiAobm9kZU1ham9yVmVyc2lvbigpID49IDEwKSB7XG4gICAgICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5pZGVudGl0eU51bShOYU4pLCBOYU4pO1xuICAgICAgICB9XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmVtcHR5KCksIHVuZGVmaW5lZCk7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmFycm93KFwiYXJyb3dcIiksIFwiYXJyb3dcIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmFzeW5jQXJyb3coXCJhc3luY0Fycm93XCIpLCBcImFzeW5jQXJyb3dcIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmZhY3QoNSksIDEyMCk7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmNvbmNhdChcImFiY1wiLCBcImRlZlwiKSwgXCJhYmNkZWZcIik7XG4gICAgICAgIGF3YWl0IHQudGhyb3dzQXN5bmMoKCkgPT4gcmVtb3RlLmVycm9yKFwiaGV5XCIpLCB7XG4gICAgICAgICAgICBtZXNzYWdlOiAvRXhwZWN0ZWQgZXJyb3IuIEFyZzogaGV5L1xuICAgICAgICB9KTtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUubm9hcmdzKCksIFwiY2FsbGVkIGZ1bmN0aW9uIHdpdGggbm8gYXJncy5cIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmFzeW5jKCksIFwiYXN5bmMgZnVuY3Rpb246IHN1Y2Nlc3NcIik7XG4gICAgICAgIHQuaXModHlwZW9mIChhd2FpdCByZW1vdGUucGF0aCgpKSwgXCJzdHJpbmdcIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLm9wdGlvbmFsQXJnKCksIFwiTm8gYXJnXCIpO1xuICAgICAgICB0LmlzKGF3YWl0IHJlbW90ZS5vcHRpb25hbEFyZyhcImhhcyBhcmdcIiksIFwiaGFzIGFyZ1wiKTtcblxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5RGF0ZShkYXRlKSwgZGF0ZSk7XG5cbiAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oXCJjb250ZW50c1wiKTtcbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5QnVmZmVyKGJ1ZmZlciksIGJ1ZmZlcik7XG5cbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5QXJyYXlOdW0oWzQyLCA4LCAxMF0pLCBbNDIsIDgsIDEwXSk7XG5cbiAgICAgICAgY29uc3QgaW5mID0gW0luZmluaXR5LCAtSW5maW5pdHldO1xuICAgICAgICB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlBcnJheU51bShpbmYpLCBpbmYpO1xuXG4gICAgICAgIGlmIChub2RlTWFqb3JWZXJzaW9uKCkgPj0gMTApIHtcbiAgICAgICAgICAgIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUFycmF5TnVtKFtOYU5dKSwgW05hTl0pO1xuICAgICAgICB9XG4gICAgICAgIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eUFycmF5U3RyaW5nKFtcImFcIiwgXCJ0aGVyZVwiXSksIFtcImFcIiwgXCJ0aGVyZVwiXSk7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5Qm9vbCh0cnVlKSwgdHJ1ZSk7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmlkZW50aXR5Qm9vbChmYWxzZSksIGZhbHNlKTtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlVbmRlZmluZWQodW5kZWZpbmVkKSwgdW5kZWZpbmVkKTtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlOdWxsKG51bGwpLCBudWxsKTtcbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5T2JqZWN0KHt9KSwge30pO1xuICAgICAgICB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlPYmplY3QoeyBhOiA0MiwgYjogXCJoZWxsb1wiIH0pLCB7XG4gICAgICAgICAgICBhOiA0MixcbiAgICAgICAgICAgIGI6IFwiaGVsbG9cIlxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW50OCA9IEludDhBcnJheS5vZigwLCAtOCwgNDIpO1xuICAgICAgICB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlJbnQ4KGludDgpLCBpbnQ4KTtcblxuICAgICAgICBjb25zdCB1aW50OCA9IFVpbnQ4QXJyYXkub2YoMCwgOCwgNDIpO1xuICAgICAgICB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlVaW50OCh1aW50OCksIHVpbnQ4KTtcblxuICAgICAgICBjb25zdCB1aW50OENsYW1wZWQgPSBVaW50OENsYW1wZWRBcnJheS5vZigwLCA4LCA0Mik7XG4gICAgICAgIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eVVpbnQ4Q2xhbXBlZCh1aW50OENsYW1wZWQpLCB1aW50OENsYW1wZWQpO1xuXG4gICAgICAgIGNvbnN0IGludDE2ID0gSW50MTZBcnJheS5vZigwLCA4LCA0MiwgLTEpO1xuICAgICAgICB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlJbnQxNihpbnQxNiksIGludDE2KTtcblxuICAgICAgICBjb25zdCB1aW50MTYgPSBVaW50MTZBcnJheS5vZigwLCA4LCA0MiwgLTEpO1xuICAgICAgICB0LmRlZXBFcXVhbChhd2FpdCByZW1vdGUuaWRlbnRpdHlVaW50MTYodWludDE2KSwgdWludDE2KTtcblxuICAgICAgICBjb25zdCBpbnQzMiA9IEludDMyQXJyYXkub2YoMCwgOCwgNDIsIC0xKTtcbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5SW50MzIoaW50MzIpLCBpbnQzMik7XG5cbiAgICAgICAgY29uc3QgdWludDMyID0gVWludDMyQXJyYXkub2YoMCwgOCwgNDIsIC0xKTtcbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5VWludDMyKHVpbnQzMiksIHVpbnQzMik7XG5cbiAgICAgICAgY29uc3QgZmxvYXQzMiA9IEZsb2F0MzJBcnJheS5vZigwLCAwLjMsIDEwMC4wNDIsIC0xKTtcbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5RmxvYXQzMihmbG9hdDMyKSwgZmxvYXQzMik7XG5cbiAgICAgICAgY29uc3QgZmxvYXQ2NCA9IEZsb2F0NjRBcnJheS5vZigwLCAwLjMsIDEwMC4wNDIsIC0xKTtcbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5RmxvYXQ2NChmbG9hdDY0KSwgZmxvYXQ2NCk7XG5cbiAgICAgICAgY29uc3QgbSA9IG5ldyBNYXAoW1xuICAgICAgICAgICAgWzEsIDJdLFxuICAgICAgICAgICAgWzQyLCAxMF1cbiAgICAgICAgXSk7XG4gICAgICAgIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5pZGVudGl0eU1hcChtKSwgbSk7XG5cbiAgICAgICAgY29uc3QgcyA9IG5ldyBTZXQoWzEsIDQyLCAxMDBdKTtcbiAgICAgICAgdC5kZWVwRXF1YWwoYXdhaXQgcmVtb3RlLmlkZW50aXR5U2V0KHMpLCBzKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3RlLmVtcHR5UmVqZWN0KCk7XG4gICAgICAgICAgICB0LmZhaWwoXCJyZW1vdGUuZW1wdHlSZWplY3QoKSBkaWQgbm90IHJlamVjdCBhcyBleHBlY3RlZFwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHQuaXMoZXJyLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCByZW1vdGUucmVqZWN0ZWQoKTtcbiAgICAgICAgICAgIHQuZmFpbChcInJlbW90ZS5yZWplY3RlZCgpIGRpZCBub3QgcmVqZWN0IGFzIGV4cGVjdGVkXCIpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgdC5pcyhlcnIsIFwiaW50ZW50aW9uYWxseSByZWplY3RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3RlLmN1c3RvbUVycm9yKCk7XG4gICAgICAgICAgICB0LmZhaWwoXCJyZW1vdGUuY3VzdG9tRXJyb3IoKSBkaWQgbm90IHJlamVjdCBhcyBleHBlY3RlZFwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHQudHJ1ZShlcnIgaW5zdGFuY2VvZiBGYWFzdEVycm9yKTtcbiAgICAgICAgICAgIHQudHJ1dGh5KGVyci5tZXNzYWdlLm1hdGNoKC9eY3VzdG9tIGVycm9yIG1lc3NhZ2UvKSk7XG4gICAgICAgICAgICB0LmlzKEZhYXN0RXJyb3IuaW5mbyhlcnIpLmN1c3RvbSwgXCJjdXN0b20gdmFsdWVcIik7XG4gICAgICAgIH1cbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuZ2V0RW52KFwiZmFhc3RFbnZpcm9ubWVudFZhcmlhYmxlXCIpLCBcInRoZV9hbnN3ZXJfaXNfNDJcIik7XG4gICAgICAgIHQuaXMoYXdhaXQgcmVtb3RlLmdldEVudihcImZhYXN0Tm9uZXhpc3RlbnRcIiksIHVuZGVmaW5lZCk7XG4gICAgICAgIHQuZGVlcEVxdWFsKGF3YWl0IHJlbW90ZS5yZXR1cm5zRXJyb3IoKSwgZnVuY3MucmV0dXJuc0Vycm9yKCkpO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gW1wiYmFyXCIsIFwiYmF6XCJdO1xuICAgICAgICB0LmRlZXBFcXVhbChhd2FpdCB0b0FycmF5KHJlbW90ZS5nZW5lcmF0b3IoZWxlbWVudHMpKSwgZWxlbWVudHMpO1xuICAgICAgICB0LmRlZXBFcXVhbChhd2FpdCB0b0FycmF5KHJlbW90ZS5hc3luY0dlbmVyYXRvcihlbGVtZW50cykpLCBlbGVtZW50cyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IF8gb2YgcmVtb3RlLmFzeW5jR2VuZXJhdG9yRXJyb3IoXCJhc3luYyBnZW5lcmF0b3IgZmFpbGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0LmZhaWwoYHJlbW90ZS5hc3luY0dlbmVyYXRvckVycm9yKCkgZGlkIG5vdCByZWplY3QgYXMgZXhwZWN0ZWQgKDIpYCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICB0LnRydWUoZXJyIGluc3RhbmNlb2YgRmFhc3RFcnJvcik7XG4gICAgICAgICAgICB0LnRydXRoeSgoZXJyIGFzIEZhYXN0RXJyb3IpLm1lc3NhZ2UubWF0Y2goL15hc3luYyBnZW5lcmF0b3IgZmFpbGVkLykpO1xuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZmFhc3RNb2R1bGUuY2xlYW51cCgpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdEJhc2ljUmVxdWlyZSh0OiBFeGVjdXRpb25Db250ZXh0LCBwcm92aWRlcjogUHJvdmlkZXIpIHtcbiAgICBjb25zdCByZXF1aXJlZEZ1bmNzID0gcmVxdWlyZShcIi4vZml4dHVyZXMvZnVuY3Rpb25zXCIpO1xuICAgIGNvbnN0IG9wdHM6IENvbW1vbk9wdGlvbnMgPSB7IHRpbWVvdXQ6IDMwLCBnYzogXCJvZmZcIiwgZGVzY3JpcHRpb246IHQudGl0bGUgfTtcbiAgICBjb25zdCBmYWFzdE1vZHVsZSA9IGF3YWl0IGZhYXN0KHByb3ZpZGVyLCByZXF1aXJlZEZ1bmNzLCBvcHRzKTtcbiAgICBjb25zdCByZW1vdGUgPSBmYWFzdE1vZHVsZS5mdW5jdGlvbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuaWRlbnRpdHlTdHJpbmcoXCJpZFwiKSwgXCJpZFwiKTtcbiAgICAgICAgdC5pcyhhd2FpdCByZW1vdGUuYXJyb3coXCJhcnJvd1wiKSwgXCJhcnJvd1wiKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBmYWFzdE1vZHVsZS5jbGVhbnVwKCk7XG4gICAgfVxufVxuXG4vLyBhc3luYyBmdW5jdGlvbiB0ZXN0Q3B1TWV0cmljcyh0OiBFeGVjdXRpb25Db250ZXh0LCBwcm92aWRlcjogUHJvdmlkZXIpIHtcbi8vICAgICB0LnBsYW4oNCk7XG5cbi8vICAgICBjb25zdCBsYW1iZGEgPSBhd2FpdCBmYWFzdChwcm92aWRlciwgZnVuY3MsICB7XG4vLyAgICAgICAgIGNoaWxkUHJvY2VzczogdHJ1ZSxcbi8vICAgICAgICAgdGltZW91dDogOTAsXG4vLyAgICAgICAgIG1lbW9yeVNpemU6IDUxMixcbi8vICAgICAgICAgbWF4UmV0cmllczogMCxcbi8vICAgICAgICAgZ2M6IFwib2ZmXCIsXG4vLyAgICAgICAgIGRlc2NyaXB0aW9uOiB0LnRpdGxlXG4vLyAgICAgfSk7XG5cbi8vICAgICB0cnkge1xuLy8gICAgICAgICBjb25zdCBOU2VjID0gNDtcbi8vICAgICAgICAgYXdhaXQgbGFtYmRhLmZ1bmN0aW9ucy5zcGluKE5TZWMgKiAxMDAwKTtcbi8vICAgICAgICAgY29uc3QgdXNhZ2UgPSBsYW1iZGEuY3B1VXNhZ2UuZ2V0KFwic3BpblwiKTtcbi8vICAgICAgICAgdC50cnV0aHkodXNhZ2UpO1xuLy8gICAgICAgICB0LnRydWUodXNhZ2UhLnNpemUgPiAwKTtcbi8vICAgICAgICAgZm9yIChjb25zdCBbLCBpbnN0YW5jZV0gb2YgdXNhZ2UhKSB7XG4vLyAgICAgICAgICAgICB0LnRydWUoaW5zdGFuY2Uuc3RpbWUgaW5zdGFuY2VvZiBTdGF0aXN0aWNzKTtcbi8vICAgICAgICAgICAgIHQudHJ1ZShpbnN0YW5jZS51dGltZSBpbnN0YW5jZW9mIFN0YXRpc3RpY3MpO1xuLy8gICAgICAgICAgICAgYnJlYWs7XG4vLyAgICAgICAgIH1cbi8vICAgICB9IGZpbmFsbHkge1xuLy8gICAgICAgICBhd2FpdCBsYW1iZGEuY2xlYW51cCgpO1xuLy8gICAgIH1cbi8vIH1cblxuZm9yIChjb25zdCBwcm92aWRlciBvZiBwcm92aWRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBbLi4uY29uZmlncywgLi4ubm9WYWxpZGF0ZUNvbmZpZ3NdKSB7XG4gICAgICAgIHRlc3Quc2VyaWFsKHRpdGxlKHByb3ZpZGVyLCBgYmFzaWMgY2FsbHNgLCBjb25maWcpLCB0ZXN0QmFzaWMsIHByb3ZpZGVyLCBjb25maWcpO1xuICAgIH1cbiAgICAvLyBYWFggRGlzYWJsZSBDUFUgbWV0cmljcyBmb3Igbm93LlxuICAgIC8vIHRlc3QodGl0bGUocHJvdmlkZXIsIGBjcHUgbWV0cmljcyBhcmUgcmVjZWl2ZWRgKSwgdGVzdENwdU1ldHJpY3MsIHByb3ZpZGVyKTtcbiAgICB0ZXN0LnNlcmlhbCh0aXRsZShwcm92aWRlciwgYGJhc2ljIGNhbGxzIHdpdGggcmVxdWlyZWApLCB0ZXN0QmFzaWNSZXF1aXJlLCBwcm92aWRlcik7XG59XG4iXX0= |
\ | No newline at end of file |