jsoniq
Version:
JSONiq implementation for JavaScript
241 lines (239 loc) • 36.2 kB
JavaScript
"use strict";
/// <reference path="../../../typings/tsd.d.ts" />
require("jasmine2-pit");
var PUL_1 = require("../../../lib/updates/PUL");
var jerr = require("../../../lib/errors");
var MemoryStore_1 = require("../../../lib/stores/memory/MemoryStore");
describe("Memory Store", () => {
it("simple test", () => {
var store = new MemoryStore_1.default();
expect(() => {
store.get("a");
}).toThrow();
var object = {
a: [1, 2],
b: 2
};
var id = store.put(object);
var obj = store.get(id);
expect(obj).toEqual(object);
});
pit("Insert & delete", () => {
var obj = { a: 1, b: { c: 1 } };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul.insert("hello", { z: 1 });
pul.remove(id);
return store.commitWith(pul).then(() => {
expect(store.get("hello")).toEqual({ z: 1 });
expect(() => { store.get(id); }).toThrow();
});
});
pit("simple update (1)", () => {
var obj = { a: 1, b: { c: 1 } };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul
.insertIntoObject(id, ["b"], { d: 1 })
.deleteFromObject(id, ["b"], ["c"]);
expect(obj.b["d"]).toBe(undefined);
expect(obj.b.c).toBe(1);
var serializedPUL = pul.serialize();
return store.commitWith(pul).then(() => {
obj = store.get(id);
expect(obj.b["d"]).toBe(1);
expect(obj.b.c).toBe(undefined);
obj = { a: 1, b: { c: 1 } };
store = new MemoryStore_1.default();
store.put(obj, id);
pul = new PUL_1.default();
pul.parse(serializedPUL);
return store.commitWith(pul).then(() => {
obj = store.get(id);
expect(obj.b["d"]).toBe(1);
expect(obj.b.c).toBe(undefined);
//done();
});
});
});
pit("simple update (2)", () => {
var obj = { a: 1, b: { c: 1 } };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul.renameInObject(id, [], "a", "z");
return store.commitWith(pul).then(() => {
obj = store.get(id);
expect(obj["z"]).toBe(1);
expect(obj.a).toBe(undefined);
});
});
pit("simple update (3)", () => {
var obj = { a: 1, b: { c: 1 } };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul.renameInObject(id, [], "a", "z")
.insertIntoObject(id, [], { a: 2 });
return store.commitWith(pul).then(() => {
obj = store.get(id);
expect(obj.a).toBe(2);
expect(obj["z"]).toBe(1);
});
});
pit("simple update (4)", () => {
var obj = { a: 1, b: { c: 1 } };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul.insertIntoObject(id, [], { z: 1 })
.insertIntoObject(id, [], { a: 2 });
//throws [JNUP0006] "a": pair to insert already exists in object
return store.commitWith(pul).catch(e => {
expect(e instanceof jerr.JNUP0006).toBe(true);
//"An individual function may create an invalid JSON instance;
// however, an updating query must produce a valid JSON instance once the entire query is evaluated,
// or an error is raised and the entire update fails, leaving the instance in its original state."
obj = store.get(id);
expect(obj.a).toBe(1);
expect(obj["z"]).toBe(undefined);
});
});
//http://try.zorba.io/queries/xquery/YLem0q2eDKwF7Yb9GyBKIwdUA20%3D
//http://try.zorba.io/queries/xquery/J5QX9GgI64MnJlJ3IJ9vCUcCG8o%3D
pit("example", () => {
var todos = [{
id: 0,
title: "Write thesis",
complete: false
}];
var store = new MemoryStore_1.default();
var id = store.put(todos);
var pul = new PUL_1.default();
pul
.insertIntoArray(id, [], 1, [{ id: 1 }])
.replaceInObject(id, ["0"], "complete", true)
.renameInObject(id, ["0"], "complete", "completed")
.insertIntoObject(id, ["0"], { title: "More figures" })
.deleteFromObject(id, ["0"], ["title"]);
return store.commitWith(pul).then(() => {
todos = store.get(id);
expect(todos[0]["completed"]).toBe(true);
expect(todos[0].complete).toBe(undefined);
expect(todos[0].id).toBe(0);
expect(todos[0].title).toBe("More figures");
expect(todos[1].id).toBe(1);
});
});
pit("JNUP0008", () => {
var obj = { a: 1, b: {} };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul.insertIntoObject(id, ["c"], { a: 1 });
return store.commitWith(pul).catch(e => {
expect(e instanceof jerr.JNUP0008).toBe(true);
});
});
//http://try.zorba.io/queries/xquery/ggGUhCUEuOUaVmfxjTOJ4ygDdas%3D
pit("rename & insert (1)", () => {
var obj = { a: 1, b: {} };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul
.insertIntoObject(id, ["b"], { a: 1 })
.renameInObject(id, [], "b", "z");
return store.commitWith(pul).then(() => {
obj = store.get(id);
expect(obj["z"]["a"]).toBe(1);
});
});
//http://try.zorba.io/queries/xquery/HdaN8mUvpAIlifs1CgBmz8gZhQo=
pit("rename & insert (2)", () => {
var obj = { a: 1 };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul
.insertIntoObject(id, [], { a: 1 })
.renameInObject(id, [], "a", "b")
.insert("myID", { z: 1 });
return store.commitWith(pul).then(() => {
obj = store.get(id);
expect(obj.a).toBe(1);
expect(obj["b"]).toBe(1);
obj = store.get("myID");
expect(obj["z"]).toBe(1);
});
});
//http://try.zorba.io/queries/xquery/D4xY%2FX8P10C1bTKtz6ZNnVRIwWs%3D
pit("[JNUP0016] selector cannot be resolved against supplied object", () => {
var obj = { completed: true };
var store = new MemoryStore_1.default();
var id = store.put(obj);
var pul = new PUL_1.default();
pul.renameInObject(id, [], "completed", "complete");
pul.replaceInObject(id, [], "complete", false);
return store.commitWith(pul).catch(e => {
expect(e instanceof jerr.JNUP0016).toBe(true);
});
});
//http://try.zorba.io/queries/xquery/tzcZsn7c8sI82o45LJUo3SgkENM%3D
pit("[JNUP0006] b: pair to insert already exists in object", () => {
var d0 = new PUL_1.default();
d0.insertIntoObject("1", [], { a: 1, b: 1 });
var d1 = new PUL_1.default();
d1.renameInObject("1", [], "a", "b");
var store = new MemoryStore_1.default();
store.put({}, "1");
return store.commitWith(d0).then(() => {
return store.commitWith(d1);
}).catch(e => {
expect(e instanceof jerr.JNUP0006).toBe(true);
});
});
it("ReplaceInObject (1)", () => {
var d0 = new PUL_1.default();
d0.replaceInObject("1", [], "a", { b: 1 });
var d1 = new PUL_1.default();
d1.renameInObject("1", ["a"], "b", "c");
var store = new MemoryStore_1.default();
store.put({ a: {} }, "1");
return store.commitWith(d0).then(() => {
return store.commitWith(d1);
}).then(() => {
expect(_.isEqual(store.snapshot, {
"1": {
"a": {
"c": 1
}
}
})).toBe(true);
});
});
pit("RenameInObject (2)", () => {
var d0 = new PUL_1.default();
d0.replaceInObject("1", ["a"], "b", { c: 1 });
var d1 = new PUL_1.default();
d1.renameInObject("1", ["a", "b"], "c", "d");
var store = new MemoryStore_1.default();
store.put({ a: { b: { c: 1 } } }, "1");
return store.commitWith(d0).then(() => {
return store.commitWith(d1);
}).then(() => {
expect(store.snapshot).toEqual({
"1": {
"a": {
"b": {
d: 1
}
}
}
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3RzL25vZGUvdXBkYXRlcy9NZW1vcnlTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsa0RBQWtEO0FBQ2xELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN4QixvQkFBZ0IsMEJBQTBCLENBQUMsQ0FBQTtBQUMzQyxJQUFZLElBQUksV0FBTSxxQkFBcUIsQ0FBQyxDQUFBO0FBQzVDLDRCQUF3Qix3Q0FBd0MsQ0FBQyxDQUFBO0FBSWpFLFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFFckIsRUFBRSxDQUFDLGFBQWEsRUFBRTtRQUNkLElBQUksS0FBSyxHQUFHLElBQUkscUJBQVcsRUFBRSxDQUFDO1FBRTlCLE1BQU0sQ0FBQztZQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixJQUFJLE1BQU0sR0FBRztZQUNULENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVCxDQUFDLEVBQUUsQ0FBQztTQUNQLENBQUM7UUFFRixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxpQkFBaUIsRUFBRTtRQUNuQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDaEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV4QixJQUFJLEdBQUcsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBRUgsR0FBRyxDQUFDLG1CQUFtQixFQUFFO1FBQ3JCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhCLElBQUksR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDcEIsR0FBRzthQUNFLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2FBQ3JDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEIsSUFBSSxhQUFhLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM5QixHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixLQUFLLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkIsR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzlCLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoQyxTQUFTO1lBQ2IsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBRUgsR0FBRyxDQUFDLG1CQUFtQixFQUFFO1FBQ3JCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhCLElBQUksR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDcEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDOUIsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBRUgsR0FBRyxDQUFDLG1CQUFtQixFQUFFO1FBQ3JCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhCLElBQUksR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDcEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7YUFDL0IsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM5QixHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsbUJBQW1CLEVBQUU7UUFDckIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLElBQUksS0FBSyxHQUFHLElBQUkscUJBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUNwQixHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNqQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFeEMsZ0VBQWdFO1FBQ2hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5Qyw4REFBOEQ7WUFDOUQsb0dBQW9HO1lBQ3BHLGtHQUFrRztZQUNsRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxtRUFBbUU7SUFDbkUsbUVBQW1FO0lBQ25FLEdBQUcsQ0FBQyxTQUFTLEVBQUU7UUFDWCxJQUFJLEtBQUssR0FBRyxDQUFDO2dCQUNULEVBQUUsRUFBRSxDQUFDO2dCQUNMLEtBQUssRUFBRSxjQUFjO2dCQUNyQixRQUFRLEVBQUUsS0FBSzthQUNsQixDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDcEIsR0FBRzthQUNFLGVBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDdkMsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUM7YUFDNUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUM7YUFDbEQsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7YUFDdEQsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM5QixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsVUFBVSxFQUFFO1FBQ1osSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUUxQixJQUFJLEtBQUssR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhCLElBQUksR0FBRyxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDcEIsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFMUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxtRUFBbUU7SUFDbkUsR0FBRyxDQUFDLHFCQUFxQixFQUFFO1FBQ3ZCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDMUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLEdBQUcsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO1FBQ3BCLEdBQUc7YUFDRSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNyQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzlCLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILGlFQUFpRTtJQUNqRSxHQUFHLENBQUMscUJBQXFCLEVBQUU7UUFDdkIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFbkIsSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLEdBQUcsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO1FBQ3BCLEdBQUc7YUFDRSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2FBQ2xDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7YUFDaEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM5QixHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXpCLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILHFFQUFxRTtJQUNyRSxHQUFHLENBQUMsZ0VBQWdFLEVBQUU7UUFDbEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLEdBQUcsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEQsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUvQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILG1FQUFtRTtJQUNuRSxHQUFHLENBQUMsdURBQXVELEVBQUU7UUFDekQsSUFBSSxFQUFFLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUNuQixFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFN0MsSUFBSSxFQUFFLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUNuQixFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXJDLElBQUksS0FBSyxHQUFHLElBQUkscUJBQVcsRUFBRSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNOLE1BQU0sQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFCQUFxQixFQUFFO1FBQ3RCLElBQUksRUFBRSxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDbkIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNDLElBQUksRUFBRSxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDbkIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFeEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7UUFDOUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ0osTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDN0IsR0FBRyxFQUFFO29CQUNELEdBQUcsRUFBRTt3QkFDRCxHQUFHLEVBQUUsQ0FBQztxQkFDVDtpQkFDSjthQUNKLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBRUgsR0FBRyxDQUFDLG9CQUFvQixFQUFFO1FBQ3RCLElBQUksRUFBRSxHQUFHLElBQUksYUFBRyxFQUFFLENBQUM7UUFDbkIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU5QyxJQUFJLEVBQUUsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUU3QyxJQUFJLEtBQUssR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUM5QixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ0osTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQzNCLEdBQUcsRUFBRTtvQkFDRCxHQUFHLEVBQUU7d0JBQ0QsR0FBRyxFQUFFOzRCQUNELENBQUMsRUFBRSxDQUFDO3lCQUNQO3FCQUNKO2lCQUNKO2FBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3RzL25vZGUvdXBkYXRlcy9NZW1vcnlTdG9yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi90eXBpbmdzL3RzZC5kLnRzXCIgLz5cbnJlcXVpcmUoXCJqYXNtaW5lMi1waXRcIik7XG5pbXBvcnQgUFVMIGZyb20gXCIuLi8uLi8uLi9saWIvdXBkYXRlcy9QVUxcIjtcbmltcG9ydCAqIGFzIGplcnIgZnJvbSBcIi4uLy4uLy4uL2xpYi9lcnJvcnNcIjtcbmltcG9ydCBNZW1vcnlTdG9yZSBmcm9tIFwiLi4vLi4vLi4vbGliL3N0b3Jlcy9tZW1vcnkvTWVtb3J5U3RvcmVcIjtcblxuZGVjbGFyZSBmdW5jdGlvbiBwaXQoZXhwZWN0YXRpb246IHN0cmluZywgYXNzZXJ0aW9uPzogKGRvbmU6ICgpID0+IHZvaWQpID0+IGFueSk6IHZvaWQ7XG5cbmRlc2NyaWJlKFwiTWVtb3J5IFN0b3JlXCIsICgpID0+IHtcblxuICAgIGl0KFwic2ltcGxlIHRlc3RcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcblxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmUuZ2V0KFwiYVwiKTtcbiAgICAgICAgfSkudG9UaHJvdygpO1xuXG4gICAgICAgIHZhciBvYmplY3QgPSB7XG4gICAgICAgICAgICBhOiBbMSwgMl0sXG4gICAgICAgICAgICBiOiAyXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iamVjdCk7XG4gICAgICAgIHZhciBvYmogPSBzdG9yZS5nZXQoaWQpO1xuICAgICAgICBleHBlY3Qob2JqKS50b0VxdWFsKG9iamVjdCk7XG4gICAgfSk7XG5cbiAgICBwaXQoXCJJbnNlcnQgJiBkZWxldGVcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgb2JqID0geyBhOiAxLCBiOiB7IGM6IDEgfSB9O1xuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iaik7XG5cbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgcHVsLmluc2VydChcImhlbGxvXCIsIHsgejogMSB9KTtcbiAgICAgICAgcHVsLnJlbW92ZShpZCk7XG4gICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKHB1bCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBleHBlY3Qoc3RvcmUuZ2V0KFwiaGVsbG9cIikpLnRvRXF1YWwoeyB6OiAxIH0pO1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHsgc3RvcmUuZ2V0KGlkKTsgfSkudG9UaHJvdygpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHBpdChcInNpbXBsZSB1cGRhdGUgKDEpXCIsICgpID0+IHtcbiAgICAgICAgdmFyIG9iaiA9IHsgYTogMSwgYjogeyBjOiAxIH0gfTtcbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHZhciBpZCA9IHN0b3JlLnB1dChvYmopO1xuXG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bFxuICAgICAgICAgICAgLmluc2VydEludG9PYmplY3QoaWQsIFtcImJcIl0sIHsgZDogMSB9KVxuICAgICAgICAgICAgLmRlbGV0ZUZyb21PYmplY3QoaWQsIFtcImJcIl0sIFtcImNcIl0pO1xuICAgICAgICBleHBlY3Qob2JqLmJbXCJkXCJdKS50b0JlKHVuZGVmaW5lZCk7XG4gICAgICAgIGV4cGVjdChvYmouYi5jKS50b0JlKDEpO1xuXG4gICAgICAgIHZhciBzZXJpYWxpemVkUFVMID0gcHVsLnNlcmlhbGl6ZSgpO1xuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChwdWwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmouYltcImRcIl0pLnRvQmUoMSk7XG4gICAgICAgICAgICBleHBlY3Qob2JqLmIuYykudG9CZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgb2JqID0geyBhOiAxLCBiOiB7IGM6IDEgfSB9O1xuICAgICAgICAgICAgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgICAgIHN0b3JlLnB1dChvYmosIGlkKTtcbiAgICAgICAgICAgIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgICAgIHB1bC5wYXJzZShzZXJpYWxpemVkUFVMKTtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKHB1bCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qob2JqLmJbXCJkXCJdKS50b0JlKDEpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChvYmouYi5jKS50b0JlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgLy9kb25lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwaXQoXCJzaW1wbGUgdXBkYXRlICgyKVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBvYmogPSB7IGE6IDEsIGI6IHsgYzogMSB9IH07XG4gICAgICAgIHZhciBzdG9yZSA9IG5ldyBNZW1vcnlTdG9yZSgpO1xuICAgICAgICB2YXIgaWQgPSBzdG9yZS5wdXQob2JqKTtcblxuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwucmVuYW1lSW5PYmplY3QoaWQsIFtdLCBcImFcIiwgXCJ6XCIpO1xuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChwdWwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmpbXCJ6XCJdKS50b0JlKDEpO1xuICAgICAgICAgICAgZXhwZWN0KG9iai5hKS50b0JlKHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcGl0KFwic2ltcGxlIHVwZGF0ZSAoMylcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgb2JqID0geyBhOiAxLCBiOiB7IGM6IDEgfSB9O1xuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iaik7XG5cbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgcHVsLnJlbmFtZUluT2JqZWN0KGlkLCBbXSwgXCJhXCIsIFwielwiKVxuICAgICAgICAgICAgLmluc2VydEludG9PYmplY3QoaWQsIFtdLCB7IGE6IDIgfSk7XG5cbiAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgocHVsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIG9iaiA9IHN0b3JlLmdldChpZCk7XG4gICAgICAgICAgICBleHBlY3Qob2JqLmEpLnRvQmUoMik7XG4gICAgICAgICAgICBleHBlY3Qob2JqW1wielwiXSkudG9CZSgxKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwaXQoXCJzaW1wbGUgdXBkYXRlICg0KVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBvYmogPSB7IGE6IDEsIGI6IHsgYzogMSB9IH07XG4gICAgICAgIHZhciBzdG9yZSA9IG5ldyBNZW1vcnlTdG9yZSgpO1xuICAgICAgICB2YXIgaWQgPSBzdG9yZS5wdXQob2JqKTtcblxuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwuaW5zZXJ0SW50b09iamVjdChpZCwgW10sIHsgejogMSB9KVxuICAgICAgICAgICAgLmluc2VydEludG9PYmplY3QoaWQsIFtdLCB7IGE6IDIgfSk7XG5cbiAgICAgICAgLy90aHJvd3MgW0pOVVAwMDA2XSBcImFcIjogcGFpciB0byBpbnNlcnQgYWxyZWFkeSBleGlzdHMgaW4gb2JqZWN0XG4gICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKHB1bCkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICBleHBlY3QoZSBpbnN0YW5jZW9mIGplcnIuSk5VUDAwMDYpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgICAvL1wiQW4gaW5kaXZpZHVhbCBmdW5jdGlvbiBtYXkgY3JlYXRlIGFuIGludmFsaWQgSlNPTiBpbnN0YW5jZTtcbiAgICAgICAgICAgIC8vIGhvd2V2ZXIsIGFuIHVwZGF0aW5nIHF1ZXJ5IG11c3QgcHJvZHVjZSBhIHZhbGlkIEpTT04gaW5zdGFuY2Ugb25jZSB0aGUgZW50aXJlIHF1ZXJ5IGlzIGV2YWx1YXRlZCxcbiAgICAgICAgICAgIC8vIG9yIGFuIGVycm9yIGlzIHJhaXNlZCBhbmQgdGhlIGVudGlyZSB1cGRhdGUgZmFpbHMsIGxlYXZpbmcgdGhlIGluc3RhbmNlIGluIGl0cyBvcmlnaW5hbCBzdGF0ZS5cIlxuICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmouYSkudG9CZSgxKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmpbXCJ6XCJdKS50b0JlKHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy9odHRwOi8vdHJ5LnpvcmJhLmlvL3F1ZXJpZXMveHF1ZXJ5L1lMZW0wcTJlREt3RjdZYjlHeUJLSXdkVUEyMCUzRFxuICAgIC8vaHR0cDovL3RyeS56b3JiYS5pby9xdWVyaWVzL3hxdWVyeS9KNVFYOUdnSTY0TW5KbEozSUo5dkNVY0NHOG8lM0RcbiAgICBwaXQoXCJleGFtcGxlXCIsICgpID0+IHtcbiAgICAgICAgdmFyIHRvZG9zID0gW3tcbiAgICAgICAgICAgIGlkOiAwLFxuICAgICAgICAgICAgdGl0bGU6IFwiV3JpdGUgdGhlc2lzXCIsXG4gICAgICAgICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICAgICAgfV07XG5cbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHZhciBpZCA9IHN0b3JlLnB1dCh0b2Rvcyk7XG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bFxuICAgICAgICAgICAgLmluc2VydEludG9BcnJheShpZCwgW10sIDEsIFt7IGlkOiAxIH1dKVxuICAgICAgICAgICAgLnJlcGxhY2VJbk9iamVjdChpZCwgW1wiMFwiXSwgXCJjb21wbGV0ZVwiLCB0cnVlKVxuICAgICAgICAgICAgLnJlbmFtZUluT2JqZWN0KGlkLCBbXCIwXCJdLCBcImNvbXBsZXRlXCIsIFwiY29tcGxldGVkXCIpXG4gICAgICAgICAgICAuaW5zZXJ0SW50b09iamVjdChpZCwgW1wiMFwiXSwgeyB0aXRsZTogXCJNb3JlIGZpZ3VyZXNcIiB9KVxuICAgICAgICAgICAgLmRlbGV0ZUZyb21PYmplY3QoaWQsIFtcIjBcIl0sIFtcInRpdGxlXCJdKTtcbiAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgocHVsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRvZG9zID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdCh0b2Rvc1swXVtcImNvbXBsZXRlZFwiXSkudG9CZSh0cnVlKTtcbiAgICAgICAgICAgIGV4cGVjdCh0b2Rvc1swXS5jb21wbGV0ZSkudG9CZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgZXhwZWN0KHRvZG9zWzBdLmlkKS50b0JlKDApO1xuICAgICAgICAgICAgZXhwZWN0KHRvZG9zWzBdLnRpdGxlKS50b0JlKFwiTW9yZSBmaWd1cmVzXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHRvZG9zWzFdLmlkKS50b0JlKDEpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHBpdChcIkpOVVAwMDA4XCIsICgpID0+IHtcbiAgICAgICAgdmFyIG9iaiA9IHsgYTogMSwgYjoge30gfTtcblxuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iaik7XG5cbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgcHVsLmluc2VydEludG9PYmplY3QoaWQsIFtcImNcIl0sIHsgYTogMSB9KTtcblxuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChwdWwpLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGUgaW5zdGFuY2VvZiBqZXJyLkpOVVAwMDA4KS50b0JlKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vaHR0cDovL3RyeS56b3JiYS5pby9xdWVyaWVzL3hxdWVyeS9nZ0dVaENVRXVPVWFWbWZ4alRPSjR5Z0RkYXMlM0RcbiAgICBwaXQoXCJyZW5hbWUgJiBpbnNlcnQgKDEpXCIsICgpID0+IHtcbiAgICAgICAgdmFyIG9iaiA9IHsgYTogMSwgYjoge30gfTtcbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHZhciBpZCA9IHN0b3JlLnB1dChvYmopO1xuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWxcbiAgICAgICAgICAgIC5pbnNlcnRJbnRvT2JqZWN0KGlkLCBbXCJiXCJdLCB7IGE6IDEgfSlcbiAgICAgICAgICAgIC5yZW5hbWVJbk9iamVjdChpZCwgW10sIFwiYlwiLCBcInpcIik7XG4gICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKHB1bCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBvYmogPSBzdG9yZS5nZXQoaWQpO1xuICAgICAgICAgICAgZXhwZWN0KG9ialtcInpcIl1bXCJhXCJdKS50b0JlKDEpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vaHR0cDovL3RyeS56b3JiYS5pby9xdWVyaWVzL3hxdWVyeS9IZGFOOG1VdnBBSWxpZnMxQ2dCbXo4Z1poUW89XG4gICAgcGl0KFwicmVuYW1lICYgaW5zZXJ0ICgyKVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBvYmogPSB7IGE6IDEgfTtcblxuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iaik7XG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bFxuICAgICAgICAgICAgLmluc2VydEludG9PYmplY3QoaWQsIFtdLCB7IGE6IDEgfSlcbiAgICAgICAgICAgIC5yZW5hbWVJbk9iamVjdChpZCwgW10sIFwiYVwiLCBcImJcIilcbiAgICAgICAgICAgIC5pbnNlcnQoXCJteUlEXCIsIHsgejogMSB9KTtcblxuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChwdWwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmouYSkudG9CZSgxKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmpbXCJiXCJdKS50b0JlKDEpO1xuXG4gICAgICAgICAgICBvYmogPSBzdG9yZS5nZXQoXCJteUlEXCIpO1xuICAgICAgICAgICAgZXhwZWN0KG9ialtcInpcIl0pLnRvQmUoMSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy9odHRwOi8vdHJ5LnpvcmJhLmlvL3F1ZXJpZXMveHF1ZXJ5L0Q0eFklMkZYOFAxMEMxYlRLdHo2Wk5uVlJJd1dzJTNEXG4gICAgcGl0KFwiW0pOVVAwMDE2XSBzZWxlY3RvciBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBzdXBwbGllZCBvYmplY3RcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgb2JqID0geyBjb21wbGV0ZWQ6IHRydWUgfTtcbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHZhciBpZCA9IHN0b3JlLnB1dChvYmopO1xuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwucmVuYW1lSW5PYmplY3QoaWQsIFtdLCBcImNvbXBsZXRlZFwiLCBcImNvbXBsZXRlXCIpO1xuICAgICAgICBwdWwucmVwbGFjZUluT2JqZWN0KGlkLCBbXSwgXCJjb21wbGV0ZVwiLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgocHVsKS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChlIGluc3RhbmNlb2YgamVyci5KTlVQMDAxNikudG9CZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvL2h0dHA6Ly90cnkuem9yYmEuaW8vcXVlcmllcy94cXVlcnkvdHpjWnNuN2M4c0k4Mm80NUxKVW8zU2drRU5NJTNEXG4gICAgcGl0KFwiW0pOVVAwMDA2XSBiOiBwYWlyIHRvIGluc2VydCBhbHJlYWR5IGV4aXN0cyBpbiBvYmplY3RcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgZDAgPSBuZXcgUFVMKCk7XG4gICAgICAgIGQwLmluc2VydEludG9PYmplY3QoXCIxXCIsIFtdLCB7IGE6IDEsIGI6IDEgfSk7XG5cbiAgICAgICAgdmFyIGQxID0gbmV3IFBVTCgpO1xuICAgICAgICBkMS5yZW5hbWVJbk9iamVjdChcIjFcIiwgW10sIFwiYVwiLCBcImJcIik7XG5cbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHN0b3JlLnB1dCh7fSwgXCIxXCIpO1xuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChkMCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChkMSk7XG4gICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGUgaW5zdGFuY2VvZiBqZXJyLkpOVVAwMDA2KS50b0JlKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwiUmVwbGFjZUluT2JqZWN0ICgxKVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBkMCA9IG5ldyBQVUwoKTtcbiAgICAgICAgZDAucmVwbGFjZUluT2JqZWN0KFwiMVwiLCBbXSwgXCJhXCIsIHsgYjogMSB9KTtcblxuICAgICAgICB2YXIgZDEgPSBuZXcgUFVMKCk7XG4gICAgICAgIGQxLnJlbmFtZUluT2JqZWN0KFwiMVwiLCBbXCJhXCJdLCBcImJcIiwgXCJjXCIpO1xuXG4gICAgICAgIHZhciBzdG9yZSA9IG5ldyBNZW1vcnlTdG9yZSgpO1xuICAgICAgICBzdG9yZS5wdXQoeyBhOiB7fSB9LCBcIjFcIik7XG4gICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKGQwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKGQxKTtcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBleHBlY3QoXy5pc0VxdWFsKHN0b3JlLnNuYXBzaG90LCB7XG4gICAgICAgICAgICAgICAgXCIxXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY1wiOiAxXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSkudG9CZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwaXQoXCJSZW5hbWVJbk9iamVjdCAoMilcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgZDAgPSBuZXcgUFVMKCk7XG4gICAgICAgIGQwLnJlcGxhY2VJbk9iamVjdChcIjFcIiwgW1wiYVwiXSwgXCJiXCIsIHsgYzogMSB9KTtcblxuICAgICAgICB2YXIgZDEgPSBuZXcgUFVMKCk7XG4gICAgICAgIGQxLnJlbmFtZUluT2JqZWN0KFwiMVwiLCBbXCJhXCIsIFwiYlwiXSwgXCJjXCIsIFwiZFwiKTtcblxuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgc3RvcmUucHV0KHsgYTogeyBiOiB7IGM6IDEgfSB9IH0sIFwiMVwiKTtcbiAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgoZDApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgoZDEpO1xuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChzdG9yZS5zbmFwc2hvdCkudG9FcXVhbCh7XG4gICAgICAgICAgICAgICAgXCIxXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYlwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDogMVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=