faastjs
Version:
Serverless batch computing made simple.
197 lines • 25.9 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.serializeReturnValue = exports.serializeFunctionArgs = exports.deserialize = exports.deserializeUint8Array = exports.serializeToUint8Array = exports.serialize = exports.deepCopyUndefined = void 0;
const assert_1 = require("assert");
const error_1 = require("./error");
const util_1 = require("util");
// Deep copy undefined and symbol keys from source to dest. Mainly used to see
// if the source and dest are deep equal once these differences are factored
// out.
function deepCopyUndefined(dest, source) {
const stack = [];
function isBackReference(o) {
for (const elem of stack) {
if (elem === o) {
return true;
}
}
return false;
}
function recurse(d, s) {
if (isBackReference(s) || d === undefined) {
return;
}
stack.push(s);
Object.keys(s).forEach(key => {
if (s[key] && typeof s[key] === "object") {
recurse(d[key], s[key]);
}
else if (s[key] === undefined) {
d[key] = undefined;
}
else if (typeof s[key] === "symbol") {
d[key] = s[key];
}
});
Object.getOwnPropertySymbols(s).forEach(key => {
d[key] = s[key];
});
stack.pop();
}
typeof source === "object" && recurse(dest, source);
}
exports.deepCopyUndefined = deepCopyUndefined;
const FJS_TYPE = "[faastjs type]";
function replacer(key, value) {
const orig = this[key];
const type = Object.prototype.toString.call(orig).slice(8, -1);
if (typeof orig === "object" && orig instanceof Buffer) {
return { [FJS_TYPE]: "Buffer", value };
}
switch (type) {
case "Undefined":
return { [FJS_TYPE]: type };
case "Number":
if (orig === Number.POSITIVE_INFINITY) {
return { [FJS_TYPE]: type, value: "+Infinity" };
}
else if (orig === Number.NEGATIVE_INFINITY) {
return { [FJS_TYPE]: type, value: "-Infinity" };
}
else if (Number.isNaN(orig)) {
return { [FJS_TYPE]: type, value: "NaN" };
}
return value;
case "Error": {
const errObj = {};
Object.getOwnPropertyNames(value).forEach(name => {
if (typeof value[name] === "string") {
errObj[name] = JSON.stringify(value[name], replacer);
}
});
return { [FJS_TYPE]: type, value: errObj };
}
case "Date":
return { [FJS_TYPE]: type, value };
case "Int8Array":
case "Uint8Array":
case "Uint8ClampedArray":
case "Int16Array":
case "Uint16Array":
case "Int32Array":
case "Uint32Array":
case "Float32Array":
case "Float64Array":
case "Map":
case "Set":
return { [FJS_TYPE]: type, value: [...orig] };
default:
return value;
}
}
function serialize(arg, validate = false) {
const str = JSON.stringify(arg, replacer);
if (validate) {
const deserialized = deserialize(str);
deepCopyUndefined(deserialized, arg);
(0, assert_1.deepStrictEqual)(deserialized, arg);
}
return str;
}
exports.serialize = serialize;
function serializeToUint8Array(arg, validate = false) {
const encoder = new util_1.TextEncoder();
return encoder.encode(serialize(arg, validate));
}
exports.serializeToUint8Array = serializeToUint8Array;
function reviver(_, value) {
try {
if (typeof value === "object") {
if (value.hasOwnProperty(FJS_TYPE)) {
const type = value[FJS_TYPE];
switch (type) {
case "Date":
return new Date(value["value"]);
case "Buffer":
return Buffer.from(value["value"]);
case "Error": {
const sErr = value["value"];
const err = new Error(sErr.message);
for (const key of Object.keys(sErr)) {
err[key] = JSON.parse(sErr[key], reviver);
}
return err;
}
case "Int8Array":
return new Int8Array(value["value"]);
case "Uint8Array":
return new Uint8Array(value["value"]);
case "Uint8ClampedArray":
return new Uint8ClampedArray(value["value"]);
case "Int16Array":
return new Int16Array(value["value"]);
case "Uint16Array":
return new Uint16Array(value["value"]);
case "Int32Array":
return new Int32Array(value["value"]);
case "Uint32Array":
return new Uint32Array(value["value"]);
case "Float32Array":
return new Float32Array(value["value"]);
case "Float64Array":
return new Float64Array(value["value"]);
case "Undefined":
return undefined;
case "Number": {
switch (value["value"]) {
case "+Infinity":
return Number.POSITIVE_INFINITY;
case "-Infinity":
return Number.NEGATIVE_INFINITY;
case "NaN":
return Number.NaN;
default:
return value;
}
}
case "Map":
return new Map(value["value"]);
case "Set":
return new Set(value["value"]);
}
}
}
}
catch { }
return value;
}
function deserializeUint8Array(data) {
const decoder = new util_1.TextDecoder();
return JSON.parse(decoder.decode(data), reviver);
}
exports.deserializeUint8Array = deserializeUint8Array;
function deserialize(data) {
return JSON.parse(data, reviver);
}
exports.deserialize = deserialize;
function serializeFunctionArgs(name, args, validate) {
try {
return serialize(args, validate);
}
catch (err) {
const error = new error_1.FaastError({ cause: err, name: error_1.FaastErrorNames.ESERIALIZE }, `faast: Detected '${name}' argument cannot be serialized by JSON.stringify`);
throw error;
}
}
exports.serializeFunctionArgs = serializeFunctionArgs;
function serializeReturnValue(name, returned, validate) {
try {
return serialize(returned, validate);
}
catch (err) {
const error = new error_1.FaastError({ cause: err, name: error_1.FaastErrorNames.ESERIALIZE }, `faast: Detected return value from ${name} cannot be serialized by JSON.stringify: ${(0, util_1.inspect)(returned)}`);
throw error;
}
}
exports.serializeReturnValue = serializeReturnValue;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBeUM7QUFDekMsbUNBQXNEO0FBQ3RELCtCQUF5RDtBQUV6RCw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLE9BQU87QUFDUCxTQUFnQixpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsTUFBYztJQUMxRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsU0FBUyxlQUFlLENBQUMsQ0FBUztRQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNiLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELFNBQVMsT0FBTyxDQUFDLENBQU0sRUFBRSxDQUFNO1FBQzNCLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxPQUFPO1FBQ1gsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QixDQUFDO2lCQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM5QixDQUFDLENBQUMsR0FBRyxDQUFDLEdB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QkFBZSxDQUFDLFVBQVUsRUFBRSxFQUNoRCxxQ0FBcUMsSUFBSSw0Q0FBNEMsSUFBQSxjQUFPLEVBQ3hGLFFBQVEsQ0FDWCxFQUFFLENBQ04sQ0FBQztRQUNGLE1BQU0sS0FBSyxDQUFDO0lBQ2hCLENBQUM7QUFDTCxDQUFDO0FBWkQsb0RBWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWVwU3RyaWN0RXF1YWwgfSBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBGYWFzdEVycm9yLCBGYWFzdEVycm9yTmFtZXMgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgaW5zcGVjdCwgVGV4dERlY29kZXIsIFRleHRFbmNvZGVyIH0gZnJvbSBcInV0aWxcIjtcblxuLy8gRGVlcCBjb3B5IHVuZGVmaW5lZCBhbmQgc3ltYm9sIGtleXMgZnJvbSBzb3VyY2UgdG8gZGVzdC4gTWFpbmx5IHVzZWQgdG8gc2VlXG4vLyBpZiB0aGUgc291cmNlIGFuZCBkZXN0IGFyZSBkZWVwIGVxdWFsIG9uY2UgdGhlc2UgZGlmZmVyZW5jZXMgYXJlIGZhY3RvcmVkXG4vLyBvdXQuXG5leHBvcnQgZnVuY3Rpb24gZGVlcENvcHlVbmRlZmluZWQoZGVzdDogb2JqZWN0LCBzb3VyY2U6IG9iamVjdCkge1xuICAgIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtdO1xuICAgIGZ1bmN0aW9uIGlzQmFja1JlZmVyZW5jZShvOiBvYmplY3QpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHN0YWNrKSB7XG4gICAgICAgICAgICBpZiAoZWxlbSA9PT0gbykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzZShkOiBhbnksIHM6IGFueSkge1xuICAgICAgICBpZiAoaXNCYWNrUmVmZXJlbmNlKHMpIHx8IGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0YWNrLnB1c2gocyk7XG4gICAgICAgIE9iamVjdC5rZXlzKHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChzW2tleV0gJiYgdHlwZW9mIHNba2V5XSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHJlY3Vyc2UoZFtrZXldLCBzW2tleV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNba2V5XSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgICAgICAgIGRba2V5XSA9IHNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgZFtrZXldID0gc1trZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgfVxuICAgIHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgcmVjdXJzZShkZXN0LCBzb3VyY2UpO1xufVxuXG5jb25zdCBGSlNfVFlQRSA9IFwiW2ZhYXN0anMgdHlwZV1cIjtcblxuZnVuY3Rpb24gcmVwbGFjZXIodGhpczogYW55LCBrZXk6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IG9yaWcgPSB0aGlzW2tleV07XG4gICAgY29uc3QgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcmlnKS5zbGljZSg4LCAtMSk7XG4gICAgaWYgKHR5cGVvZiBvcmlnID09PSBcIm9iamVjdFwiICYmIG9yaWcgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIHsgW0ZKU19UWVBFXTogXCJCdWZmZXJcIiwgdmFsdWUgfTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJVbmRlZmluZWRcIjpcbiAgICAgICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IHR5cGUgfTtcbiAgICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICAgICAgaWYgKG9yaWcgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IHR5cGUsIHZhbHVlOiBcIitJbmZpbml0eVwiIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWcgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IHR5cGUsIHZhbHVlOiBcIi1JbmZpbml0eVwiIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc05hTihvcmlnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IHR5cGUsIHZhbHVlOiBcIk5hTlwiIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGNhc2UgXCJFcnJvclwiOiB7XG4gICAgICAgICAgICBjb25zdCBlcnJPYmo6IGFueSA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KVtuYW1lXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBlcnJPYmpbbmFtZV0gPSBKU09OLnN0cmluZ2lmeSgodmFsdWUgYXMgYW55KVtuYW1lXSwgcmVwbGFjZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgW0ZKU19UWVBFXTogdHlwZSwgdmFsdWU6IGVyck9iaiB9O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJEYXRlXCI6XG4gICAgICAgICAgICByZXR1cm4geyBbRkpTX1RZUEVdOiB0eXBlLCB2YWx1ZSB9O1xuICAgICAgICBjYXNlIFwiSW50OEFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJVaW50OEFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJVaW50OENsYW1wZWRBcnJheVwiOlxuICAgICAgICBjYXNlIFwiSW50MTZBcnJheVwiOlxuICAgICAgICBjYXNlIFwiVWludDE2QXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIkludDMyQXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIlVpbnQzMkFycmF5XCI6XG4gICAgICAgIGNhc2UgXCJGbG9hdDMyQXJyYXlcIjpcbiAgICAgICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgICAgICBjYXNlIFwiTWFwXCI6XG4gICAgICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgICAgICAgIHJldHVybiB7IFtGSlNfVFlQRV06IHR5cGUsIHZhbHVlOiBbLi4ub3JpZ10gfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoYXJnOiBhbnksIHZhbGlkYXRlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdHIgPSBKU09OLnN0cmluZ2lmeShhcmcsIHJlcGxhY2VyKTtcbiAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gZGVzZXJpYWxpemUoc3RyKTtcbiAgICAgICAgZGVlcENvcHlVbmRlZmluZWQoZGVzZXJpYWxpemVkLCBhcmcpO1xuICAgICAgICBkZWVwU3RyaWN0RXF1YWwoZGVzZXJpYWxpemVkLCBhcmcpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVG9VaW50OEFycmF5KGFyZzogYW55LCB2YWxpZGF0ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIHJldHVybiBlbmNvZGVyLmVuY29kZShzZXJpYWxpemUoYXJnLCB2YWxpZGF0ZSkpO1xufVxuXG5mdW5jdGlvbiByZXZpdmVyKHRoaXM6IGFueSwgXzogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KEZKU19UWVBFKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZVtGSlNfVFlQRV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEYXRlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJCdWZmZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkVycm9yXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNFcnIgPSB2YWx1ZVtcInZhbHVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKHNFcnIubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIgYXMgYW55KVtrZXldID0gSlNPTi5wYXJzZShzRXJyW2tleV0sIHJldml2ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiSW50OEFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludDhBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVpbnQ4QXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVpbnQ4Q2xhbXBlZEFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiSW50MTZBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQxNkFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVWludDE2QXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDE2QXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJJbnQzMkFycmF5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVaW50MzJBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50MzJBcnJheSh2YWx1ZVtcInZhbHVlXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkZsb2F0MzJBcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJGbG9hdDY0QXJyYXlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQ2NEFycmF5KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVW5kZWZpbmVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTnVtYmVyXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWVbXCJ2YWx1ZVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIrSW5maW5pdHlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiLUluZmluaXR5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk5hTlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk5hTjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1hcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAodmFsdWVbXCJ2YWx1ZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlW1widmFsdWVcIl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gY2F0Y2gge31cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVVpbnQ4QXJyYXk8VCA9IGFueT4oZGF0YTogVWludDhBcnJheSk6IFQge1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVyLmRlY29kZShkYXRhKSwgcmV2aXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZTxUID0gYW55PihkYXRhOiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhLCByZXZpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUZ1bmN0aW9uQXJncyhuYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdLCB2YWxpZGF0ZTogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemUoYXJncywgdmFsaWRhdGUpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEZhYXN0RXJyb3IoXG4gICAgICAgICAgICB7IGNhdXNlOiBlcnIsIG5hbWU6IEZhYXN0RXJyb3JOYW1lcy5FU0VSSUFMSVpFIH0sXG4gICAgICAgICAgICBgZmFhc3Q6IERldGVjdGVkICcke25hbWV9JyBhcmd1bWVudCBjYW5ub3QgYmUgc2VyaWFsaXplZCBieSBKU09OLnN0cmluZ2lmeWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmV0dXJuVmFsdWUobmFtZTogc3RyaW5nLCByZXR1cm5lZDogYW55LCB2YWxpZGF0ZTogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemUocmV0dXJuZWQsIHZhbGlkYXRlKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBGYWFzdEVycm9yKFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyLCBuYW1lOiBGYWFzdEVycm9yTmFtZXMuRVNFUklBTElaRSB9LFxuICAgICAgICAgICAgYGZhYXN0OiBEZXRlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSAke25hbWV9IGNhbm5vdCBiZSBzZXJpYWxpemVkIGJ5IEpTT04uc3RyaW5naWZ5OiAke2luc3BlY3QoXG4gICAgICAgICAgICAgICAgcmV0dXJuZWRcbiAgICAgICAgICAgICl9YFxuICAgICAgICApO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG4iXX0=
;