UNPKG

jsoniq

Version:

JSONiq implementation for JavaScript

301 lines (299 loc) 49.7 kB
"use strict"; /// <reference path="../../typings/lodash/lodash.d.ts" /> var _ = require("lodash"); var jerr = require("../errors"); var InsertIntoObject_1 = require("./primitives/InsertIntoObject"); var InsertIntoArray_1 = require("./primitives/InsertIntoArray"); var DeleteFromObject_1 = require("./primitives/DeleteFromObject"); var DeleteFromArray_1 = require("./primitives/DeleteFromArray"); var ReplaceInObject_1 = require("./primitives/ReplaceInObject"); var ReplaceInArray_1 = require("./primitives/ReplaceInArray"); var RenameInObject_1 = require("./primitives/RenameInObject"); var Insert_1 = require("./primitives/Insert"); var Remove_1 = require("./primitives/Remove"); var UpdatePrimitives_1 = require("./UpdatePrimitives"); class PUL { constructor() { this.udps = new UpdatePrimitives_1.default(); } parse(pul) { var newPul = JSON.parse(pul); this.udps.parse(newPul.udps); return this; } serialize() { return JSON.stringify(this); } invert(transaction) { var promises = []; var pul = new PUL(); this.normalize(); this.udps.getAll().forEach((udp) => { var lPUL = new PUL(); var target; if (udp instanceof Remove_1.default) { target = transaction.get(udp.id).then((item) => { return item; }); } else if (!(udp instanceof Insert_1.default)) { target = udp.lockTarget(transaction).then(() => { return udp.getTarget(); }); } else { //TODO: remove setTimeout target = new Promise((resolve, reject) => { setTimeout(resolve, 1); }); } target.then((target) => { udp.invert(target, lPUL); lPUL.udps.insert.forEach((udp) => { pul.insert(udp.id, udp.item); }); lPUL.udps.remove.forEach((udp) => { pul.remove(udp.id); }); lPUL.udps.deleteFromArray.forEach((udp) => { pul.deleteFromArray(udp.id, udp.ordPath, udp.position); }); lPUL.udps.deleteFromObject.forEach((udp) => { pul.deleteFromObject(udp.id, udp.ordPath, udp.keys); }); lPUL.udps.insertIntoArray.forEach((udp) => { pul.insertIntoArray(udp.id, udp.ordPath, udp.position, udp.items); }); lPUL.udps.insertIntoObject.forEach((udp) => { var idx = _.findIndex(pul.udps.insertIntoObject, { id: udp.id, ordPath: udp.ordPath }); if (idx > -1) { _.merge(pul.udps.insertIntoObject[idx].pairs, udp.pairs); } else { pul.udps.insertIntoObject.push(udp); } }); }); promises.push(target); }); return Promise.all(promises).then(() => { return pul.normalize(); }); } apply(transaction) { //Normalize PUL this.normalize(); //Lock targets var promises = []; this.udps.getAll().forEach((udp) => { if (!(udp instanceof Insert_1.default) && !(udp instanceof Remove_1.default)) { var p = udp.lockTarget(transaction); promises.push(p); } }); return Promise.all(promises).then(() => { var apply = (udp) => { var id = udp.id; udp.apply(); transaction.put(id, udp.getDocument()); }; //Apply updates _.forEach(this.udps.insert, (udp) => { transaction.put(udp.id, udp.item); }); _.forEach(this.udps.remove, (udp) => { transaction.remove(udp.id); }); //1. jupd:replace-in-object _.forEach(this.udps.replaceInObject, apply); //2. jupd:delete-from-object _.forEach(this.udps.deleteFromObject, apply); //3. jupd:rename-in-object _.forEach(this.udps.renameInObject, apply); //4. jupd:insert-into-object _.forEach(this.udps.insertIntoObject, apply); //The array update primitives, furthermore, are applied right-to-left with re- gard to their index. //This obviates the problem of indexes being shifted and/or becoming invalid due to deletions or insertions. //TODO: test //5. jupd:replace-in-array _.sortBy(this.udps.replaceInArray, "position"); _.forEach(this.udps.replaceInArray, apply); //6. jupd:delete-from-array _.sortBy(this.udps.deleteFromArray, "position"); _.forEach(this.udps.deleteFromArray, apply); //7. jupd:insert-into-array _.sortBy(this.udps.insertIntoArray, "position"); _.forEach(this.udps.insertIntoArray, apply); return transaction.done(); }); } normalize() { //If there is a delete on the same (array,index) target, the replace is omitted. _.forEach(this.udps.deleteFromArray, (udp) => { _.remove(this.udps.replaceInArray, { id: udp.id, ordPath: udp.ordPath, position: udp.position }); }); //If there is a delete on the same (object,name) target, the replace is omitted. //If there is a delete on the same (object,name) target, the rename is omitted. _.forEach(this.udps.deleteFromObject, (udp) => { _.forEach(udp.keys, (key) => { _.remove(this.udps.replaceInObject, { id: udp.id, ordPath: udp.ordPath, key: key }); _.remove(this.udps.renameInObject, { id: udp.id, ordPath: udp.ordPath, key: key }); }); }); //If there is a remove primitive, all primitives with the same target are removed var handler = (udps, id) => { var idx; while ((idx = _.findIndex(udps, { id: id })) > -1) { udps.splice(idx, 1); } }; this.udps.remove.forEach(udp => { handler(this.udps.deleteFromArray, udp.id); handler(this.udps.deleteFromObject, udp.id); handler(this.udps.insertIntoArray, udp.id); handler(this.udps.insertIntoObject, udp.id); handler(this.udps.replaceInArray, udp.id); handler(this.udps.replaceInObject, udp.id); handler(this.udps.renameInObject, udp.id); handler(this.udps.insert, udp.id); }); //We remove InsertIntoObject primitives with no pairs (if they have been removed because of composition) var idx = _.findIndex(this.udps.insertIntoObject, udp => { return Object.keys(udp.pairs).length === 0; }); if (idx > -1) { this.udps.insertIntoObject.splice(idx, 1); } return this; } remove(id) { var newUdp = new Remove_1.default(id); var udp = _.find(this.udps.remove, { id: id }); if (udp === undefined) { this.udps.remove.push(newUdp); } return this; } insert(id, item) { var newUdp = new Insert_1.default(id, item); var udp = _.find(this.udps.insert, { id: id }); if (udp) { throw new jerr.JNUP0005(); } else { this.udps.insert.push(newUdp); } return this; } /* * jupd:insert-into-object($o as object(), $p as object()) * Inserts all pairs of the object $p into the object $o. */ insertIntoObject(id, ordPath, pairs) { var newUdp = new InsertIntoObject_1.default(id, ordPath, pairs); //Multiple UPs of this type with the same object target are merged into one UP with this target, //where the sources containing the pairs to insert are merged into one object. //An error jerr:JNUP0005 is raised if a collision occurs. var udp = _.find(this.udps.insertIntoObject, { id: id, ordPath: ordPath }); if (udp) { udp.merge(newUdp); } else { this.udps.insertIntoObject.push(newUdp); } return this; } /* * jupd:insert-into-array($a as array(), $i as xs:integer, $c as item()*) * Inserts all items in the sequence $c before position $i into the array $a. */ insertIntoArray(id, ordPath, position, items) { var newUdp = new InsertIntoArray_1.default(id, ordPath, position, items); //Multiple UPs of this type with the same (array,index) target are merged into one UP with this target, //where the items are merged in an implementation-dependent order. //Several inserts on the same array and selector (position) are equivalent to a unique insert on that array and selector with the content of those original inserts appended in an implementation-dependent order. var udp = _.find(this.udps.insertIntoArray, { id: id, ordPath: ordPath, position: position }); if (udp) { udp.merge(newUdp); } else { this.udps.insertIntoArray.push(newUdp); } return this; } /* * jupd:delete-from-object($o as object(), $s as xs:string*) * Removes the pairs the names of which appear in $s from the object $o. */ deleteFromObject(id, ordPath, keys) { var newUdp = new DeleteFromObject_1.default(id, ordPath, keys); //Multiple UPs of this type with the same object target are merged into one UP with this target, //where the selectors (names lists) are merged. Duplicate names are removed. var udp = _.find(this.udps.deleteFromObject, { id: id, ordPath: ordPath }); if (udp) { udp.merge(newUdp); } else { this.udps.deleteFromObject.push(newUdp); } return this; } /* * jupd:delete-from-array($a as array(), $i as xs:integer) * Removes the item at position $i from the array $a (causes all following items in the array to move one position to the left). */ deleteFromArray(id, ordPath, position) { var newUdp = new DeleteFromArray_1.default(id, ordPath, position); //Multiple UPs of this type with the same (array,index) target are merged into one UP with this target. var udp = _.find(this.udps.deleteFromArray, { id: id, ordPath: ordPath, position: position }); if (!udp) { this.udps.deleteFromArray.push(newUdp); } return this; } /* * jupd:replace-in-array($a as array(), $i as xs:integer, $v as item()) * Replaces the item at position $i in the array $a with the item $v (do nothing if $i is not comprised between 1 and jdm:size($a)). */ replaceInArray(id, ordPath, position, item) { var newUdp = new ReplaceInArray_1.default(id, ordPath, position, item); //The presence of multiple UPs of this type with the same (array,index) target raises an error. var udp = _.find(this.udps.replaceInArray, { id: id, ordPath: ordPath, position: position }); if (udp) { throw new jerr.JNUP0009(); } else { this.udps.replaceInArray.push(newUdp); } return this; } /* * jupd:replace-in-object($o as object(), $n as xs:string, $v as item()) * Replaces the value of the pair named $n in the object $o with the item $v (do nothing if there is no such pair). */ replaceInObject(id, ordPath, key, item) { var newUdp = new ReplaceInObject_1.default(id, ordPath, key, item); //The presence of multiple UPs of this type with the same (array,index) target raises an error. var udp = _.find(this.udps.replaceInObject, { id: id, ordPath: ordPath, key: key }); if (udp) { throw new jerr.JNUP0009(); } else { this.udps.replaceInObject.push(newUdp); } return this; } /* * jupd:rename-in-object($o as object(), $n as xs:string, $p as xs:string) * Renames the pair originally named $n in the object $o as $p (do nothing if there is no such pair). */ renameInObject(id, ordPath, key, newKey) { var newUdp = new RenameInObject_1.default(id, ordPath, key, newKey); //The presence of multiple UPs of this type with the same (object,name) target raises an error. //If there is a delete on the same (object,name) target, the rename is omitted. var udp = _.find(this.udps.renameInObject, { id: id, ordPath: ordPath, key: key }); if (udp) { throw new jerr.JNUP0009(); } else { this.udps.renameInObject.push(newUdp); } return this; } } exports.default = PUL; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91cGRhdGVzL1BVTC50cyJdLCJuYW1lcyI6WyJQVUwiLCJQVUwuY29uc3RydWN0b3IiLCJQVUwucGFyc2UiLCJQVUwuc2VyaWFsaXplIiwiUFVMLmludmVydCIsIlBVTC5hcHBseSIsIlBVTC5ub3JtYWxpemUiLCJQVUwucmVtb3ZlIiwiUFVMLmluc2VydCIsIlBVTC5pbnNlcnRJbnRvT2JqZWN0IiwiUFVMLmluc2VydEludG9BcnJheSIsIlBVTC5kZWxldGVGcm9tT2JqZWN0IiwiUFVMLmRlbGV0ZUZyb21BcnJheSIsIlBVTC5yZXBsYWNlSW5BcnJheSIsIlBVTC5yZXBsYWNlSW5PYmplY3QiLCJQVUwucmVuYW1lSW5PYmplY3QiXSwibWFwcGluZ3MiOiI7QUFBQSx5REFBeUQ7QUFDekQsSUFBWSxDQUFDLFdBQU0sUUFBUSxDQUFDLENBQUE7QUFFNUIsSUFBWSxJQUFJLFdBQU0sV0FBVyxDQUFDLENBQUE7QUFHbEMsaUNBQTZCLCtCQUErQixDQUFDLENBQUE7QUFDN0QsZ0NBQTZCLDhCQUE4QixDQUFDLENBQUE7QUFDNUQsaUNBQTZCLCtCQUErQixDQUFDLENBQUE7QUFDN0QsZ0NBQTZCLDhCQUE4QixDQUFDLENBQUE7QUFDNUQsZ0NBQTZCLDhCQUE4QixDQUFDLENBQUE7QUFDNUQsK0JBQTZCLDZCQUE2QixDQUFDLENBQUE7QUFDM0QsK0JBQTZCLDZCQUE2QixDQUFDLENBQUE7QUFDM0QsdUJBQTZCLHFCQUFxQixDQUFDLENBQUE7QUFDbkQsdUJBQTZCLHFCQUFxQixDQUFDLENBQUE7QUFFbkQsaUNBQTZCLG9CQUFvQixDQUFDLENBQUE7QUFLbEQ7SUFBQUE7UUFFSUMsU0FBSUEsR0FBR0EsSUFBSUEsMEJBQWdCQSxFQUFFQSxDQUFDQTtJQTBTbENBLENBQUNBO0lBeFNHRCxLQUFLQSxDQUFDQSxHQUFXQTtRQUNiRSxJQUFJQSxNQUFNQSxHQUFPQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtRQUNqQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0lBQ2hCQSxDQUFDQTtJQUVERixTQUFTQTtRQUNMRyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7SUFFREgsTUFBTUEsQ0FBQ0EsV0FBeUJBO1FBQzVCSSxJQUFJQSxRQUFRQSxHQUFHQSxFQUFFQSxDQUFDQTtRQUNsQkEsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0E7UUFDcEJBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO1FBQ2pCQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQTtZQUMzQkEsSUFBSUEsSUFBSUEsR0FBR0EsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0E7WUFDckJBLElBQUlBLE1BQU1BLENBQUNBO1lBQ1hBLEVBQUVBLENBQUFBLENBQUNBLEdBQUdBLFlBQVlBLGdCQUFNQSxDQUFDQSxDQUFDQSxDQUFDQTtnQkFDdkJBLE1BQU1BLEdBQUdBLFdBQVdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLE9BQU9BLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1lBQ3RFQSxDQUFDQTtZQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFBQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxZQUFZQSxnQkFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7Z0JBQ2pDQSxNQUFNQSxHQUFHQSxHQUFHQSxDQUFDQSxVQUFVQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUNqRkEsQ0FBQ0E7WUFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7Z0JBQ2xCQSx5QkFBeUJBO2dCQUNYQSxNQUFNQSxHQUFHQSxJQUFJQSxPQUFPQSxDQUFDQSxDQUFDQSxPQUFPQSxFQUFFQSxNQUFNQSxPQUFPQSxVQUFVQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUMzRUEsQ0FBQ0E7WUFDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsTUFBTUE7Z0JBQ2ZBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLE1BQU1BLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO2dCQUN6QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBR0E7b0JBQ3pCQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtnQkFDakNBLENBQUNBLENBQUNBLENBQUNBO2dCQUNIQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQTtvQkFDekJBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO2dCQUN2QkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7Z0JBQ0hBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBO29CQUNsQ0EsR0FBR0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsRUFBRUEsR0FBR0EsQ0FBQ0EsT0FBT0EsRUFBRUEsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQzNEQSxDQUFDQSxDQUFDQSxDQUFDQTtnQkFDSEEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQTtvQkFDbkNBLEdBQUdBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsRUFBRUEsR0FBR0EsQ0FBQ0EsT0FBT0EsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7Z0JBQ3hEQSxDQUFDQSxDQUFDQSxDQUFDQTtnQkFDSEEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBR0E7b0JBQ2xDQSxHQUFHQSxDQUFDQSxlQUFlQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFHQSxDQUFDQSxPQUFPQSxFQUFFQSxHQUFHQSxDQUFDQSxRQUFRQSxFQUFFQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtnQkFDdEVBLENBQUNBLENBQUNBLENBQUNBO2dCQUNIQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBO29CQUNuQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQSxFQUFFQSxPQUFPQSxFQUFFQSxHQUFHQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQSxDQUFDQTtvQkFDdkZBLEVBQUVBLENBQUFBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3dCQUNWQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEtBQUtBLEVBQUVBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO29CQUM3REEsQ0FBQ0E7b0JBQUNBLElBQUlBLENBQUNBLENBQUNBO3dCQUNKQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO29CQUN4Q0EsQ0FBQ0E7Z0JBQ0xBLENBQUNBLENBQUNBLENBQUNBO1lBQ1BBLENBQUNBLENBQUNBLENBQUNBO1lBQ0hBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQzFCQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNIQSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQTtZQUM5QkEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7UUFDM0JBLENBQUNBLENBQUNBLENBQUNBO0lBQ1BBLENBQUNBO0lBRURKLEtBQUtBLENBQUNBLFdBQXlCQTtRQUMzQkssZUFBZUE7UUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7UUFFakJBLGNBQWNBO1FBQ2RBLElBQUlBLFFBQVFBLEdBQUdBLEVBQUVBLENBQUNBO1FBQ2xCQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQTtZQUMzQkEsRUFBRUEsQ0FBQUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsWUFBWUEsZ0JBQU1BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLFlBQVlBLGdCQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtnQkFDdERBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLFVBQVVBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO2dCQUNwQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDckJBLENBQUNBO1FBQ0xBLENBQUNBLENBQUNBLENBQUNBO1FBRUhBLE1BQU1BLENBQUNBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLElBQUlBLENBQUNBO1lBRTlCQSxJQUFJQSxLQUFLQSxHQUFHQSxDQUFDQSxHQUFvQkE7Z0JBQzdCQSxJQUFJQSxFQUFFQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtnQkFDaEJBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBO2dCQUNaQSxXQUFXQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFHQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQSxDQUFDQTtZQUMzQ0EsQ0FBQ0EsQ0FBQ0E7WUFFRkEsZUFBZUE7WUFDZkEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsR0FBR0E7Z0JBQzVCQSxXQUFXQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUN0Q0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFFSEEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsR0FBR0E7Z0JBQzVCQSxXQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtZQUMvQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFFSEEsMkJBQTJCQTtZQUMzQkEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7WUFFNUNBLDRCQUE0QkE7WUFDNUJBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7WUFFN0NBLDBCQUEwQkE7WUFDMUJBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLEVBQUVBLEtBQUtBLENB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UkEsT0FBTUEsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7Z0JBQy9DQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUN4QkEsQ0FBQ0E7UUFDTEEsQ0FBQ0EsQ0FBQ0E7UUFDRkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0E7WUFDeEJBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1lBQzNDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEVBQUVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1lBQzVDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtZQUMzQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtZQUM1Q0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7WUFDMUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1lBQzNDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtZQUMxQ0EsT0FBT0Es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T0EsRUFBRUEsT0FBT0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDbkZBLEVBQUVBLENBQUFBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1lBQ0xBLE1BQU1BLElBQUlBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO1FBQzlCQSxDQUFDQTtRQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNKQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtRQUMxQ0EsQ0FBQ0E7UUFDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFDaEJBLENBQUNBO0FBQ0xmLENBQUNBO3NCQUFBIiwiZmlsZSI6ImxpYi91cGRhdGVzL1BVTC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi90eXBpbmdzL2xvZGFzaC9sb2Rhc2guZC50c1wiIC8+XG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcblxuaW1wb3J0ICogYXMgamVyciBmcm9tIFwiLi4vZXJyb3JzXCI7XG5cbmltcG9ydCBVcGRhdGVQcmltaXRpdmUgIGZyb20gXCIuL3ByaW1pdGl2ZXMvVXBkYXRlUHJpbWl0aXZlXCI7XG5pbXBvcnQgSW5zZXJ0SW50b09iamVjdCBmcm9tIFwiLi9wcmltaXRpdmVzL0luc2VydEludG9PYmplY3RcIjtcbmltcG9ydCBJbnNlcnRJbnRvQXJyYXkgIGZyb20gXCIuL3ByaW1pdGl2ZXMvSW5zZXJ0SW50b0FycmF5XCI7XG5pbXBvcnQgRGVsZXRlRnJvbU9iamVjdCBmcm9tIFwiLi9wcmltaXRpdmVzL0RlbGV0ZUZyb21PYmplY3RcIjtcbmltcG9ydCBEZWxldGVGcm9tQXJyYXkgIGZyb20gXCIuL3ByaW1pdGl2ZXMvRGVsZXRlRnJvbUFycmF5XCI7XG5pbXBvcnQgUmVwbGFjZUluT2JqZWN0ICBmcm9tIFwiLi9wcmltaXRpdmVzL1JlcGxhY2VJbk9iamVjdFwiO1xuaW1wb3J0IFJlcGxhY2VJbkFycmF5ICAgZnJvbSBcIi4vcHJpbWl0aXZlcy9SZXBsYWNlSW5BcnJheVwiO1xuaW1wb3J0IFJlbmFtZUluT2JqZWN0ICAgZnJvbSBcIi4vcHJpbWl0aXZlcy9SZW5hbWVJbk9iamVjdFwiO1xuaW1wb3J0IEluc2VydCAgICAgICAgICAgZnJvbSBcIi4vcHJpbWl0aXZlcy9JbnNlcnRcIjtcbmltcG9ydCBSZW1vdmUgICAgICAgICAgIGZyb20gXCIuL3ByaW1pdGl2ZXMvUmVtb3ZlXCI7XG5cbmltcG9ydCBVcGRhdGVQcmltaXRpdmVzIGZyb20gXCIuL1VwZGF0ZVByaW1pdGl2ZXNcIjtcbmltcG9ydCB7IElQVUwgfSAgICAgICAgICAgIGZyb20gXCIuL0lQVUxcIjtcblxuaW1wb3J0IHsgSVRyYW5zYWN0aW9uIH0gZnJvbSBcIi4uL3N0b3Jlcy9JVHJhbnNhY3Rpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUFVMIGltcGxlbWVudHMgSVBVTCB7XG5cbiAgICB1ZHBzID0gbmV3IFVwZGF0ZVByaW1pdGl2ZXMoKTtcblxuICAgIHBhcnNlKHB1bDogc3RyaW5nKTogUFVMIHtcbiAgICAgICAgdmFyIG5ld1B1bDpQVUwgPSBKU09OLnBhcnNlKHB1bCk7XG4gICAgICAgIHRoaXMudWRwcy5wYXJzZShuZXdQdWwudWRwcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgfVxuXG4gICAgaW52ZXJ0KHRyYW5zYWN0aW9uOiBJVHJhbnNhY3Rpb24pOiBQcm9taXNlPFBVTD4ge1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoKTtcbiAgICAgICAgdGhpcy51ZHBzLmdldEFsbCgpLmZvckVhY2goKHVkcCkgPT4ge1xuICAgICAgICAgICAgdmFyIGxQVUwgPSBuZXcgUFVMKCk7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0O1xuICAgICAgICAgICAgaWYodWRwIGluc3RhbmNlb2YgUmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdHJhbnNhY3Rpb24uZ2V0KHVkcC5pZCkudGhlbigoaXRlbSkgPT4geyByZXR1cm4gaXRlbTsgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYoISh1ZHAgaW5zdGFuY2VvZiBJbnNlcnQpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdWRwLmxvY2tUYXJnZXQodHJhbnNhY3Rpb24pLnRoZW4oKCkgPT4geyByZXR1cm4gdWRwLmdldFRhcmdldCgpOyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG5cdFx0Ly9UT0RPOiByZW1vdmUgc2V0VGltZW91dFxuICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgc2V0VGltZW91dChyZXNvbHZlLCAxKTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQudGhlbigodGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICAgICAgdWRwLmludmVydCh0YXJnZXQsIGxQVUwpO1xuICAgICAgICAgICAgICAgIGxQVUwudWRwcy5pbnNlcnQuZm9yRWFjaCgodWRwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHB1bC5pbnNlcnQodWRwLmlkLCB1ZHAuaXRlbSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbFBVTC51ZHBzLnJlbW92ZS5mb3JFYWNoKCh1ZHApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHVsLnJlbW92ZSh1ZHAuaWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxQVUwudWRwcy5kZWxldGVGcm9tQXJyYXkuZm9yRWFjaCgodWRwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHB1bC5kZWxldGVGcm9tQXJyYXkodWRwLmlkLCB1ZHAub3JkUGF0aCwgdWRwLnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsUFVMLnVkcHMuZGVsZXRlRnJvbU9iamVjdC5mb3JFYWNoKCh1ZHApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHVsLmRlbGV0ZUZyb21PYmplY3QodWRwLmlkLCB1ZHAub3JkUGF0aCwgdWRwLmtleXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxQVUwudWRwcy5pbnNlcnRJbnRvQXJyYXkuZm9yRWFjaCgodWRwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHB1bC5pbnNlcnRJbnRvQXJyYXkodWRwLmlkLCB1ZHAub3JkUGF0aCwgdWRwLnBvc2l0aW9uLCB1ZHAuaXRlbXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxQVUwudWRwcy5pbnNlcnRJbnRvT2JqZWN0LmZvckVhY2goKHVkcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gXy5maW5kSW5kZXgocHVsLnVkcHMuaW5zZXJ0SW50b09iamVjdCwgeyBpZDogdWRwLmlkLCBvcmRQYXRoOiB1ZHAub3JkUGF0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYoaWR4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ubWVyZ2UocHVsLnVkcHMuaW5zZXJ0SW50b09iamVjdFtpZHhdLnBhaXJzLCB1ZHAucGFpcnMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVsLnVkcHMuaW5zZXJ0SW50b09iamVjdC5wdXNoKHVkcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwdWwubm9ybWFsaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFwcGx5KHRyYW5zYWN0aW9uOiBJVHJhbnNhY3Rpb24pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICAvL05vcm1hbGl6ZSBQVUxcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoKTtcblxuICAgICAgICAvL0xvY2sgdGFyZ2V0c1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy51ZHBzLmdldEFsbCgpLmZvckVhY2goKHVkcCkgPT4ge1xuICAgICAgICAgICAgaWYoISh1ZHAgaW5zdGFuY2VvZiBJbnNlcnQpICYmICEodWRwIGluc3RhbmNlb2YgUmVtb3ZlKSkge1xuICAgICAgICAgICAgICAgIHZhciBwID0gdWRwLmxvY2tUYXJnZXQodHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIHZhciBhcHBseSA9ICh1ZHA6IFVwZGF0ZVByaW1pdGl2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBpZCA9IHVkcC5pZDtcbiAgICAgICAgICAgICAgICB1ZHAuYXBwbHkoKTtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5wdXQoaWQsIHVkcC5nZXREb2N1bWVudCgpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vQXBwbHkgdXBkYXRlc1xuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMudWRwcy5pbnNlcnQsICh1ZHApID0+IHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5wdXQodWRwLmlkLCB1ZHAuaXRlbSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMudWRwcy5yZW1vdmUsICh1ZHApID0+IHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5yZW1vdmUodWRwLmlkKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLzEuIGp1cGQ6cmVwbGFjZS1pbi1vYmplY3RcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnVkcHMucmVwbGFjZUluT2JqZWN0LCBhcHBseSk7XG5cbiAgICAgICAgICAgIC8vMi4ganVwZDpkZWxldGUtZnJvbS1vYmplY3RcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnVkcHMuZGVsZXRlRnJvbU9iamVjdCwgYXBwbHkpO1xuXG4gICAgICAgICAgICAvLzMuIGp1cGQ6cmVuYW1lLWluLW9iamVjdFxuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMudWRwcy5yZW5hbWVJbk9iamVjdCwgYXBwbHkpO1xuXG4gICAgICAgICAgICAvLzQuIGp1cGQ6aW5zZXJ0LWludG8tb2JqZWN0XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy51ZHBzLmluc2VydEludG9PYmplY3QsIGFwcGx5KTtcblxuICAgICAgICAgICAgLy9UaGUgYXJyYXkgdXBkYXRlIHByaW1pdGl2ZXMsIGZ1cnRoZXJtb3JlLCBhcmUgYXBwbGllZCByaWdodC10by1sZWZ0IHdpdGggcmUtIGdhcmQgdG8gdGhlaXIgaW5kZXguXG4gICAgICAgICAgICAvL1RoaXMgb2J2aWF0ZXMgdGhlIHByb2JsZW0gb2YgaW5kZXhlcyBiZWluZyBzaGlmdGVkIGFuZC9vciBiZWNvbWluZyBpbnZhbGlkIGR1ZSB0byBkZWxldGlvbnMgb3IgaW5zZXJ0aW9ucy5cbiAgICAgICAgICAgIC8vVE9ETzogdGVzdFxuICAgICAgICAgICAgLy81LiBqdXBkOnJlcGxhY2UtaW4tYXJyYXlcbiAgICAgICAgICAgIF8uc29ydEJ5KHRoaXMudWRwcy5yZXBsYWNlSW5BcnJheSwgXCJwb3NpdGlvblwiKTtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnVkcHMucmVwbGFjZUluQXJyYXksIGFwcGx5KTtcblxuICAgICAgICAgICAgLy82LiBqdXBkOmRlbGV0ZS1mcm9tLWFycmF5XG4gICAgICAgICAgICBfLnNvcnRCeSh0aGlzLnVkcHMuZGVsZXRlRnJvbUFycmF5LCBcInBvc2l0aW9uXCIpO1xuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMudWRwcy5kZWxldGVGcm9tQXJyYXksIGFwcGx5KTtcblxuICAgICAgICAgICAgLy83LiBqdXBkOmluc2VydC1pbnRvLWFycmF5XG4gICAgICAgICAgICBfLnNvcnRCeSh0aGlzLnVkcHMuaW5zZXJ0SW50b0FycmF5LCBcInBvc2l0aW9uXCIpO1xuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMudWRwcy5pbnNlcnRJbnRvQXJyYXksIGFwcGx5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uLmRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplKCk6IFBVTCB7XG4gICAgICAgIC8vSWYgdGhlcmUgaXMgYSBkZWxldGUgb24gdGhlIHNhbWUgKGFycmF5LGluZGV4KSB0YXJnZXQsIHRoZSByZXBsYWNlIGlzIG9taXR0ZWQuXG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLnVkcHMuZGVsZXRlRnJvbUFycmF5LCAodWRwOiBEZWxldGVGcm9tQXJyYXkpID0+IHtcbiAgICAgICAgICAgIDxSZXBsYWNlSW5BcnJheVtdPl8ucmVtb3ZlKHRoaXMudWRwcy5yZXBsYWNlSW5BcnJheSwgeyBpZDogdWRwLmlkLCBvcmRQYXRoOiB1ZHAub3JkUGF0aCwgcG9zaXRpb246IHVkcC5wb3NpdGlvbiB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vSWYgdGhlcmUgaXMgYSBkZWxldGUgb24gdGhlIHNhbWUgKG9iamVjdCxuYW1lKSB0YXJnZXQsIHRoZSByZXBsYWNlIGlzIG9taXR0ZWQuXG4gICAgICAgIC8vSWYgdGhlcmUgaXMgYSBkZWxldGUgb24gdGhlIHNhbWUgKG9iamVjdCxuYW1lKSB0YXJnZXQsIHRoZSByZW5hbWUgaXMgb21pdHRlZC5cbiAgICAgICAgXy5mb3JFYWNoKHRoaXMudWRwcy5kZWxldGVGcm9tT2JqZWN0LCAodWRwOiBEZWxldGVGcm9tT2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2godWRwLmtleXMsIChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIDxSZXBsYWNlSW5PYmplY3RbXT5fLnJlbW92ZSh0aGlzLnVkcHMucmVwbGFjZUluT2JqZWN0LCB7IGlkOiB1ZHAuaWQsIG9yZFBhdGg6IHVkcC5vcmRQYXRoLCBrZXk6IGtleSB9KTtcbiAgICAgICAgICAgICAgICA8UmVuYW1lSW5PYmplY3RbXT5fLnJlbW92ZSh0aGlzLnVkcHMucmVuYW1lSW5PYmplY3QsIHsgaWQ6IHVkcC5pZCwgb3JkUGF0aDogdWRwLm9yZFBhdGgsIGtleToga2V5IH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvL0lmIHRoZXJlIGlzIGEgcmVtb3ZlIHByaW1pdGl2ZSwgYWxsIHByaW1pdGl2ZXMgd2l0aCB0aGUgc2FtZSB0YXJnZXQgYXJlIHJlbW92ZWRcbiAgICAgICAgdmFyIGhhbmRsZXIgPSAodWRwcywgaWQpID0+IHtcbiAgICAgICAgICAgIHZhciBpZHg7XG4gICAgICAgICAgICB3aGlsZSgoaWR4ID0gXy5maW5kSW5kZXgodWRwcywgeyBpZDogaWQgfSkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICB1ZHBzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnVkcHMucmVtb3ZlLmZvckVhY2godWRwID0+IHtcbiAgICAgICAgICAgIGhhbmRsZXIodGhpcy51ZHBzLmRlbGV0ZUZyb21BcnJheSwgdWRwLmlkKTtcbiAgICAgICAgICAgIGhhbmRsZXIodGhpcy51ZHBzLmRlbGV0ZUZyb21PYmplY3QsIHVkcC5pZCk7XG4gICAgICAgICAgICBoYW5kbGVyKHRoaXMudWRwcy5pbnNlcnRJbnRvQXJyYXksIHVkcC5pZCk7XG4gICAgICAgICAgICBoYW5kbGVyKHRoaXMudWRwcy5pbnNlcnRJbnRvT2JqZWN0LCB1ZHAuaWQpO1xuICAgICAgICAgICAgaGFuZGxlcih0aGlzLnVkcHMucmVwbGFjZUluQXJyYXksIHVkcC5pZCk7XG4gICAgICAgICAgICBoYW5kbGVyKHRoaXMudWRwcy5yZXBsYWNlSW5PYmplY3QsIHVkcC5pZCk7XG4gICAgICAgICAgICBoYW5kbGVyKHRoaXMudWRwcy5yZW5hbWVJbk9iamVjdCwgdWRwLmlkKTtcbiAgICAgICAgICAgIGhhbmRsZXIodGhpcy51ZHBzLmluc2VydCwgdWRwLmlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy9XZSByZW1vdmUgSW5zZXJ0SW50b09iamVjdCBwcmltaXRpdmVzIHdpdGggbm8gcGFpcnMgKGlmIHRoZXkgaGF2ZSBiZWVuIHJlbW92ZWQgYmVjYXVzZSBvZiBjb21wb3NpdGlvbilcbiAgICAgICAgdmFyIGlkeCA9IF8uZmluZEluZGV4KHRoaXMudWRwcy5pbnNlcnRJbnRvT2JqZWN0LCB1ZHAgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHVkcC5wYWlycykubGVuZ3RoID09PSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYoaWR4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudWRwcy5pbnNlcnRJbnRvT2JqZWN0LnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVtb3ZlKGlkOiBzdHJpbmcpOiBQVUwge1xuICAgICAgICB2YXIgbmV3VWRwID0gbmV3IFJlbW92ZShpZCk7XG4gICAgICAgIHZhciB1ZHAgPSBfLmZpbmQodGhpcy51ZHBzLnJlbW92ZSwgeyBpZDogaWQgfSk7XG4gICAgICAgIGlmKHVkcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnVkcHMucmVtb3ZlLnB1c2gobmV3VWRwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpbnNlcnQoaWQ6IHN0cmluZywgaXRlbTogYW55KTogUFVMIHtcbiAgICAgICAgdmFyIG5ld1VkcCA9IG5ldyBJbnNlcnQoaWQsIGl0ZW0pO1xuICAgICAgICB2YXIgdWRwID0gXy5maW5kKHRoaXMudWRwcy5pbnNlcnQsIHsgaWQ6IGlkIH0pO1xuICAgICAgICBpZih1ZHApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBqZXJyLkpOVVAwMDA1KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVkcHMuaW5zZXJ0LnB1c2gobmV3VWRwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGp1cGQ6aW5zZXJ0LWludG8tb2JqZWN0KCRvIGFzIG9iamVjdCgpLCAkcCBhcyBvYmplY3QoKSlcbiAgICAgKiBJbnNlcnRzIGFsbCBwYWlycyBvZiB0aGUgb2JqZWN0ICRwIGludG8gdGhlIG9iamVjdCAkby5cbiAgICAgKi9cbiAgICBpbnNlcnRJbnRvT2JqZWN0KGlkOiBzdHJpbmcsIG9yZFBhdGg6IHN0cmluZ1tdLCBwYWlyczoge30pOiBQVUwge1xuICAgICAgICB2YXIgbmV3VWRwID0gbmV3IEluc2VydEludG9PYmplY3QoaWQsIG9yZFBhdGgsIHBhaXJzKTtcbiAgICAgICAgLy9NdWx0aXBsZSBVUHMgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNhbWUgb2JqZWN0IHRhcmdldCBhcmUgbWVyZ2VkIGludG8gb25lIFVQIHdpdGggdGhpcyB0YXJnZXQsXG4gICAgICAgIC8vd2hlcmUgdGhlIHNvdXJjZXMgY29udGFpbmluZyB0aGUgcGFpcnMgdG8gaW5zZXJ0IGFyZSBtZXJnZWQgaW50byBvbmUgb2JqZWN0LlxuICAgICAgICAvL0FuIGVycm9yIGplcnI6Sk5VUDAwMDUgaXMgcmFpc2VkIGlmIGEgY29sbGlzaW9uIG9jY3Vycy5cbiAgICAgICAgdmFyIHVkcCA9IF8uZmluZCh0aGlzLnVkcHMuaW5zZXJ0SW50b09iamVjdCwgeyBpZDogaWQsIG9yZFBhdGg6IG9yZFBhdGggfSk7XG4gICAgICAgIGlmKHVkcCkge1xuICAgICAgICAgICAgdWRwLm1lcmdlKG5ld1VkcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVkcHMuaW5zZXJ0SW50b09iamVjdC5wdXNoKG5ld1VkcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBqdXBkOmluc2VydC1pbnRvLWFycmF5KCRhIGFzIGFycmF5KCksICRpIGFzIHhzOmludGVnZXIsICRjIGFzIGl0ZW0oKSopXG4gICAgICogSW5zZXJ0cyBhbGwgaXRlbXMgaW4gdGhlIHNlcXVlbmNlICRjIGJlZm9yZSBwb3NpdGlvbiAkaSBpbnRvIHRoZSBhcnJheSAkYS5cbiAgICAgKi9cbiAgICBpbnNlcnRJbnRvQXJyYXkoaWQ6IHN0cmluZywgb3JkUGF0aDogc3RyaW5nW10sIHBvc2l0aW9uOiBudW1iZXIsIGl0ZW1zOiBhbnlbXSk6IFBVTCB7XG4gICAgICAgIHZhciBuZXdVZHAgPSBuZXcgSW5zZXJ0SW50b0FycmF5KGlkLCBvcmRQYXRoLCBwb3NpdGlvbiwgaXRlbXMpO1xuICAgICAgICAvL011bHRpcGxlIFVQcyBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc2FtZSAoYXJyYXksaW5kZXgpIHRhcmdldCBhcmUgbWVyZ2VkIGludG8gb25lIFVQIHdpdGggdGhpcyB0YXJnZXQsXG4gICAgICAgIC8vd2hlcmUgdGhlIGl0ZW1zIGFyZSBtZXJnZWQgaW4gYW4gaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IG9yZGVyLlxuICAgICAgICAvL1NldmVyYWwgaW5zZXJ0cyBvbiB0aGUgc2FtZSBhcnJheSBhbmQgc2VsZWN0b3IgKHBvc2l0aW9uKSBhcmUgZXF1aXZhbGVudCB0byBhIHVuaXF1ZSBpbnNlcnQgb24gdGhhdCBhcnJheSBhbmQgc2VsZWN0b3Igd2l0aCB0aGUgY29udGVudCBvZiB0aG9zZSBvcmlnaW5hbCBpbnNlcnRzIGFwcGVuZGVkIGluIGFuIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBvcmRlci5cbiAgICAgICAgdmFyIHVkcCA9IF8uZmluZCh0aGlzLnVkcHMuaW5zZXJ0SW50b0FycmF5LCB7IGlkOiBpZCwgb3JkUGF0aDogb3JkUGF0aCwgcG9zaXRpb246IHBvc2l0aW9uIH0pO1xuICAgICAgICBpZih1ZHApIHtcbiAgICAgICAgICAgIHVkcC5tZXJnZShuZXdVZHApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51ZHBzLmluc2VydEludG9BcnJheS5wdXNoKG5ld1VkcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBqdXBkOmRlbGV0ZS1mcm9tLW9iamVjdCgkbyBhcyBvYmplY3QoKSwgJHMgYXMgeHM6c3RyaW5nKilcbiAgICAgKiBSZW1vdmVzIHRoZSBwYWlycyB0aGUgbmFtZXMgb2Ygd2hpY2ggYXBwZWFyIGluICRzIGZyb20gdGhlIG9iamVjdCAkby5cbiAgICAgKi9cbiAgICBkZWxldGVGcm9tT2JqZWN0KGlkOiBzdHJpbmcsIG9yZFBhdGg6IHN0cmluZ1tdLCBrZXlzOiBBcnJheTxzdHJpbmc+KTogUFVMIHtcbiAgICAgICAgdmFyIG5ld1VkcCA9IG5ldyBEZWxldGVGcm9tT2JqZWN0KGlkLCBvcmRQYXRoLCBrZXlzKTtcbiAgICAgICAgLy9NdWx0aXBsZSBVUHMgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNhbWUgb2JqZWN0IHRhcmdldCBhcmUgbWVyZ2VkIGludG8gb25lIFVQIHdpdGggdGhpcyB0YXJnZXQsXG4gICAgICAgIC8vd2hlcmUgdGhlIHNlbGVjdG9ycyAobmFtZXMgbGlzdHMpIGFyZSBtZXJnZWQuIER1cGxpY2F0ZSBuYW1lcyBhcmUgcmVtb3ZlZC5cbiAgICAgICAgdmFyIHVkcCA9IF8uZmluZCh0aGlzLnVkcHMuZGVsZXRlRnJvbU9iamVjdCwgeyBpZDogaWQsIG9yZFBhdGg6IG9yZFBhdGggfSk7XG4gICAgICAgIGlmKHVkcCkge1xuICAgICAgICAgICAgdWRwLm1lcmdlKG5ld1VkcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVkcHMuZGVsZXRlRnJvbU9iamVjdC5wdXNoKG5ld1VkcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBqdXBkOmRlbGV0ZS1mcm9tLWFycmF5KCRhIGFzIGFycmF5KCksICRpIGFzIHhzOmludGVnZXIpXG4gICAgICogUmVtb3ZlcyB0aGUgaXRlbSBhdCBwb3NpdGlvbiAkaSBmcm9tIHRoZSBhcnJheSAkYSAoY2F1c2VzIGFsbCBmb2xsb3dpbmcgaXRlbXMgaW4gdGhlIGFycmF5IHRvIG1vdmUgb25lIHBvc2l0aW9uIHRvIHRoZSBsZWZ0KS5cbiAgICAgKi9cbiAgICBkZWxldGVGcm9tQXJyYXkoaWQ6IHN0cmluZywgb3JkUGF0aDogc3RyaW5nW10sIHBvc2l0aW9uOiBudW1iZXIpOiBQVUwge1xuICAgICAgICB2YXIgbmV3VWRwID0gbmV3IERlbGV0ZUZyb21BcnJheShpZCwgb3JkUGF0aCwgcG9zaXRpb24pO1xuICAgICAgICAvL011bHRpcGxlIFVQcyBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc2FtZSAoYXJyYXksaW5kZXgpIHRhcmdldCBhcmUgbWVyZ2VkIGludG8gb25lIFVQIHdpdGggdGhpcyB0YXJnZXQuXG4gICAgICAgIHZhciB1ZHAgPSBfLmZpbmQodGhpcy51ZHBzLmRlbGV0ZUZyb21BcnJheSwgeyBpZDogaWQsIG9yZFBhdGg6IG9yZFBhdGgsIHBvc2l0aW9uOiBwb3NpdGlvbiB9KTtcbiAgICAgICAgaWYoIXVkcCkge1xuICAgICAgICAgICAgdGhpcy51ZHBzLmRlbGV0ZUZyb21BcnJheS5wdXNoKG5ld1VkcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBqdXBkOnJlcGxhY2UtaW4tYXJyYXkoJGEgYXMgYXJyYXkoKSwgJGkgYXMgeHM6aW50ZWdlciwgJHYgYXMgaXRlbSgpKVxuICAgICAqIFJlcGxhY2VzIHRoZSBpdGVtIGF0IHBvc2l0aW9uICRpIGluIHRoZSBhcnJheSAkYSB3aXRoIHRoZSBpdGVtICR2IChkbyBub3RoaW5nIGlmICRpIGlzIG5vdCBjb21wcmlzZWQgYmV0d2VlbiAxIGFuZCBqZG06c2l6ZSgkYSkpLlxuICAgICAqL1xuICAgIHJlcGxhY2VJbkFycmF5KGlkOiBzdHJpbmcsIG9yZFBhdGg6IHN0cmluZ1tdLCBwb3NpdGlvbjogbnVtYmVyLCBpdGVtOiBhbnkpOiBQVUwge1xuICAgICAgICB2YXIgbmV3VWRwID0gbmV3IFJlcGxhY2VJbkFycmF5KGlkLCBvcmRQYXRoLCBwb3NpdGlvbiwgaXRlbSk7XG4gICAgICAgIC8vVGhlIHByZXNlbmNlIG9mIG11bHRpcGxlIFVQcyBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgc2FtZSAoYXJyYXksaW5kZXgpIHRhcmdldCByYWlzZXMgYW4gZXJyb3IuXG4gICAgICAgIHZhciB1ZHAgPSBfLmZpbmQodGhpcy51ZHBzLnJlcGxhY2VJbkFycmF5LCB7IGlkOiBpZCwgb3JkUGF0aDogb3JkUGF0aCwgcG9zaXRpb246IHBvc2l0aW9uIH0pO1xuICAgICAgICBpZih1ZHApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBqZXJyLkpOVVAwMDA5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVkcHMucmVwbGFjZUluQXJyYXkucHVzaChuZXdVZHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qXG4gICAgICoganVwZDpyZXBsYWNlLWluLW9iamVjdCgkbyBhcyBvYmplY3QoKSwgJG4gYXMgeHM6c3RyaW5nLCAkdiBhcyBpdGVtKCkpXG4gICAgICogUmVwbGFjZXMgdGhlIHZhbHVlIG9mIHRoZSBwYWlyIG5hbWVkICRuIGluIHRoZSBvYmplY3QgJG8gd2l0aCB0aGUgaXRlbSAkdiAoZG8gbm90aGluZyBpZiB0aGVyZSBpcyBubyBzdWNoIHBhaXIpLlxuICAgICAqL1xuICAgIHJlcGxhY2VJbk9iamVjdChpZDogc3RyaW5nLCBvcmRQYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW06IGFueSk6IFBVTCB7XG4gICAgICAgIHZhciBuZXdVZHAgPSBuZXcgUmVwbGFjZUluT2JqZWN0KGlkLCBvcmRQYXRoLCBrZXksIGl0ZW0pO1xuICAgICAgICAvL1RoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBVUHMgb2YgdGhpcyB0eXBlIHdpdGggdGhlIHNhbWUgKGFycmF5LGluZGV4KSB0YXJnZXQgcmFpc2VzIGFuIGVycm9yLlxuICAgICAgICB2YXIgdWRwID0gXy5maW5kKHRoaXMudWRwcy5yZXBsYWNlSW5PYmplY3QsIHsgaWQ6IGlkLCBvcmRQYXRoOiBvcmRQYXRoLCBrZXk6IGtleSB9KTtcbiAgICAgICAgaWYodWRwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgamVyci5KTlVQMDAwOSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51ZHBzLnJlcGxhY2VJbk9iamVjdC5wdXNoKG5ld1VkcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBqdXBkOnJlbmFtZS1pbi1vYmplY3QoJG8gYXMgb2JqZWN0KCksICRuIGFzIHhzOnN0cmluZywgJHAgYXMgeHM6c3RyaW5nKVxuICAgICAqIFJlbmFtZXMgdGhlIHBhaXIgb3JpZ2luYWxseSBuYW1lZCAkbiBpbiB0aGUgb2JqZWN0ICRvIGFzICRwIChkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcGFpcikuXG4gICAgICovXG4gICAgcmVuYW1lSW5PYmplY3QoaWQ6IHN0cmluZywgb3JkUGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBuZXdLZXk6IHN0cmluZyk6IFBVTCB7XG4gICAgICAgIHZhciBuZXdVZHAgPSBuZXcgUmVuYW1lSW5PYmplY3QoaWQsIG9yZFBhdGgsIGtleSwgbmV3S2V5KTtcbiAgICAgICAgLy9UaGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgVVBzIG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBzYW1lIChvYmplY3QsbmFtZSkgdGFyZ2V0IHJhaXNlcyBhbiBlcnJvci5cbiAgICAgICAgLy9JZiB0aGVyZSBpcyBhIGRlbGV0ZSBvbiB0aGUgc2FtZSAob2JqZWN0LG5hbWUpIHRhcmdldCwgdGhlIHJlbmFtZSBpcyBvbWl0dGVkLlxuICAgICAgICB2YXIgdWRwID0gXy5maW5kKHRoaXMudWRwcy5yZW5hbWVJbk9iamVjdCwgeyBpZDogaWQsIG9yZFBhdGg6IG9yZFBhdGgsIGtleToga2V5IH0pO1xuICAgICAgICBpZih1ZHApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBqZXJyLkpOVVAwMDA5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVkcHMucmVuYW1lSW5PYmplY3QucHVzaChuZXdVZHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==