ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
210 lines (207 loc) • 22.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.IteratorSynchronizer = exports.ReferenceIterator = exports.IterationArtifacts = exports.ListItem = undefined;
var _util = require("@glimmer/util");
class ListItem extends _util.ListNode {
constructor(iterable, result) {
super(iterable.valueReferenceFor(result));
this.retained = false;
this.seen = false;
this.key = result.key;
this.iterable = iterable;
this.memo = iterable.memoReferenceFor(result);
}
update(item) {
this.retained = true;
this.iterable.updateValueReference(this.value, item);
this.iterable.updateMemoReference(this.memo, item);
}
shouldRemove() {
return !this.retained;
}
reset() {
this.retained = false;
this.seen = false;
}
}
exports.ListItem = ListItem;
class IterationArtifacts {
constructor(iterable) {
this.map = (0, _util.dict)();
this.list = new _util.LinkedList();
this.tag = iterable.tag;
this.iterable = iterable;
}
isEmpty() {
let iterator = this.iterator = this.iterable.iterate();
return iterator.isEmpty();
}
iterate() {
let iterator = this.iterator || this.iterable.iterate();
this.iterator = null;
return iterator;
}
has(key) {
return !!this.map[key];
}
get(key) {
return this.map[key];
}
wasSeen(key) {
let node = this.map[key];
return node && node.seen;
}
append(item) {
let { map, list, iterable } = this;
let node = map[item.key] = new ListItem(iterable, item);
list.append(node);
return node;
}
insertBefore(item, reference) {
let { map, list, iterable } = this;
let node = map[item.key] = new ListItem(iterable, item);
node.retained = true;
list.insertBefore(node, reference);
return node;
}
move(item, reference) {
let { list } = this;
item.retained = true;
list.remove(item);
list.insertBefore(item, reference);
}
remove(item) {
let { list } = this;
list.remove(item);
delete this.map[item.key];
}
nextNode(item) {
return this.list.nextNode(item);
}
head() {
return this.list.head();
}
}
exports.IterationArtifacts = IterationArtifacts;
class ReferenceIterator {
// if anyone needs to construct this object with something other than
// an iterable, let @wycats know.
constructor(iterable) {
this.iterator = null;
let artifacts = new IterationArtifacts(iterable);
this.artifacts = artifacts;
}
next() {
let { artifacts } = this;
let iterator = this.iterator = this.iterator || artifacts.iterate();
let item = iterator.next();
if (!item) return null;
return artifacts.append(item);
}
}
exports.ReferenceIterator = ReferenceIterator;
var Phase;
(function (Phase) {
Phase[Phase["Append"] = 0] = "Append";
Phase[Phase["Prune"] = 1] = "Prune";
Phase[Phase["Done"] = 2] = "Done";
})(Phase || (Phase = {}));
class IteratorSynchronizer {
constructor({ target, artifacts }) {
this.target = target;
this.artifacts = artifacts;
this.iterator = artifacts.iterate();
this.current = artifacts.head();
}
sync() {
let phase = Phase.Append;
while (true) {
switch (phase) {
case Phase.Append:
phase = this.nextAppend();
break;
case Phase.Prune:
phase = this.nextPrune();
break;
case Phase.Done:
this.nextDone();
return;
}
}
}
advanceToKey(key) {
let { current, artifacts } = this;
let seek = current;
while (seek && seek.key !== key) {
seek.seen = true;
seek = artifacts.nextNode(seek);
}
this.current = seek && artifacts.nextNode(seek);
}
nextAppend() {
let { iterator, current, artifacts } = this;
let item = iterator.next();
if (item === null) {
return this.startPrune();
}
let { key } = item;
if (current && current.key === key) {
this.nextRetain(item);
} else if (artifacts.has(key)) {
this.nextMove(item);
} else {
this.nextInsert(item);
}
return Phase.Append;
}
nextRetain(item) {
let { artifacts, current } = this;
current = (0, _util.expect)(current, 'BUG: current is empty');
current.update(item);
this.current = artifacts.nextNode(current);
this.target.retain(item.key, current.value, current.memo);
}
nextMove(item) {
let { current, artifacts, target } = this;
let { key } = item;
let found = artifacts.get(item.key);
found.update(item);
if (artifacts.wasSeen(item.key)) {
artifacts.move(found, current);
target.move(found.key, found.value, found.memo, current ? current.key : null);
} else {
this.advanceToKey(key);
}
}
nextInsert(item) {
let { artifacts, target, current } = this;
let node = artifacts.insertBefore(item, current);
target.insert(node.key, node.value, node.memo, current ? current.key : null);
}
startPrune() {
this.current = this.artifacts.head();
return Phase.Prune;
}
nextPrune() {
let { artifacts, target, current } = this;
if (current === null) {
return Phase.Done;
}
let node = current;
this.current = artifacts.nextNode(node);
if (node.shouldRemove()) {
artifacts.remove(node);
target.delete(node.key);
} else {
node.reset();
}
return Phase.Prune;
}
nextDone() {
this.target.done();
}
}
exports.IteratorSynchronizer = IteratorSynchronizer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pdGVyYWJsZS5qcyJdLCJuYW1lcyI6WyJMaXN0SXRlbSIsImNvbnN0cnVjdG9yIiwiaXRlcmFibGUiLCJyZXN1bHQiLCJ2YWx1ZVJlZmVyZW5jZUZvciIsInJldGFpbmVkIiwic2VlbiIsImtleSIsIm1lbW8iLCJtZW1vUmVmZXJlbmNlRm9yIiwidXBkYXRlIiwiaXRlbSIsInVwZGF0ZVZhbHVlUmVmZXJlbmNlIiwidmFsdWUiLCJ1cGRhdGVNZW1vUmVmZXJlbmNlIiwic2hvdWxkUmVtb3ZlIiwicmVzZXQiLCJJdGVyYXRpb25BcnRpZmFjdHMiLCJtYXAiLCJsaXN0IiwidGFnIiwiaXNFbXB0eSIsIml0ZXJhdG9yIiwiaXRlcmF0ZSIsImhhcyIsImdldCIsIndhc1NlZW4iLCJub2RlIiwiYXBwZW5kIiwiaW5zZXJ0QmVmb3JlIiwicmVmZXJlbmNlIiwibW92ZSIsInJlbW92ZSIsIm5leHROb2RlIiwiaGVhZCIsIlJlZmVyZW5jZUl0ZXJhdG9yIiwiYXJ0aWZhY3RzIiwibmV4dCIsIlBoYXNlIiwiSXRlcmF0b3JTeW5jaHJvbml6ZXIiLCJ0YXJnZXQiLCJjdXJyZW50Iiwic3luYyIsInBoYXNlIiwiQXBwZW5kIiwibmV4dEFwcGVuZCIsIlBydW5lIiwibmV4dFBydW5lIiwiRG9uZSIsIm5leHREb25lIiwiYWR2YW5jZVRvS2V5Iiwic2VlayIsInN0YXJ0UHJ1bmUiLCJuZXh0UmV0YWluIiwibmV4dE1vdmUiLCJuZXh0SW5zZXJ0IiwicmV0YWluIiwiZm91bmQiLCJpbnNlcnQiLCJkZWxldGUiLCJkb25lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ08sTUFBTUEsUUFBTix3QkFBZ0M7QUFDbkNDLGdCQUFZQyxRQUFaLEVBQXNCQyxNQUF0QixFQUE4QjtBQUMxQixjQUFNRCxTQUFTRSxpQkFBVCxDQUEyQkQsTUFBM0IsQ0FBTjtBQUNBLGFBQUtFLFFBQUwsR0FBZ0IsS0FBaEI7QUFDQSxhQUFLQyxJQUFMLEdBQVksS0FBWjtBQUNBLGFBQUtDLEdBQUwsR0FBV0osT0FBT0ksR0FBbEI7QUFDQSxhQUFLTCxRQUFMLEdBQWdCQSxRQUFoQjtBQUNBLGFBQUtNLElBQUwsR0FBWU4sU0FBU08sZ0JBQVQsQ0FBMEJOLE1BQTFCLENBQVo7QUFDSDtBQUNETyxXQUFPQyxJQUFQLEVBQWE7QUFDVCxhQUFLTixRQUFMLEdBQWdCLElBQWhCO0FBQ0EsYUFBS0gsUUFBTCxDQUFjVSxvQkFBZCxDQUFtQyxLQUFLQyxLQUF4QyxFQUErQ0YsSUFBL0M7QUFDQSxhQUFLVCxRQUFMLENBQWNZLG1CQUFkLENBQWtDLEtBQUtOLElBQXZDLEVBQTZDRyxJQUE3QztBQUNIO0FBQ0RJLG1CQUFlO0FBQ1gsZUFBTyxDQUFDLEtBQUtWLFFBQWI7QUFDSDtBQUNEVyxZQUFRO0FBQ0osYUFBS1gsUUFBTCxHQUFnQixLQUFoQjtBQUNBLGFBQUtDLElBQUwsR0FBWSxLQUFaO0FBQ0g7QUFwQmtDO1FBQTFCTixRLEdBQUFBLFE7QUFzQk4sTUFBTWlCLGtCQUFOLENBQXlCO0FBQzVCaEIsZ0JBQVlDLFFBQVosRUFBc0I7QUFDbEIsYUFBS2dCLEdBQUwsR0FBVyxpQkFBWDtBQUNBLGFBQUtDLElBQUwsR0FBWSxzQkFBWjtBQUNBLGFBQUtDLEdBQUwsR0FBV2xCLFNBQVNrQixHQUFwQjtBQUNBLGFBQUtsQixRQUFMLEdBQWdCQSxRQUFoQjtBQUNIO0FBQ0RtQixjQUFVO0FBQ04sWUFBSUMsV0FBVyxLQUFLQSxRQUFMLEdBQWdCLEtBQUtwQixRQUFMLENBQWNxQixPQUFkLEVBQS9CO0FBQ0EsZUFBT0QsU0FBU0QsT0FBVCxFQUFQO0FBQ0g7QUFDREUsY0FBVTtBQUNOLFlBQUlELFdBQVcsS0FBS0EsUUFBTCxJQUFpQixLQUFLcEIsUUFBTCxDQUFjcUIsT0FBZCxFQUFoQztBQUNBLGFBQUtELFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxlQUFPQSxRQUFQO0FBQ0g7QUFDREUsUUFBSWpCLEdBQUosRUFBUztBQUNMLGVBQU8sQ0FBQyxDQUFDLEtBQUtXLEdBQUwsQ0FBU1gsR0FBVCxDQUFUO0FBQ0g7QUFDRGtCLFFBQUlsQixHQUFKLEVBQVM7QUFDTCxlQUFPLEtBQUtXLEdBQUwsQ0FBU1gsR0FBVCxDQUFQO0FBQ0g7QUFDRG1CLFlBQVFuQixHQUFSLEVBQWE7QUFDVCxZQUFJb0IsT0FBTyxLQUFLVCxHQUFMLENBQVNYLEdBQVQsQ0FBWDtBQUNBLGVBQU9vQixRQUFRQSxLQUFLckIsSUFBcEI7QUFDSDtBQUNEc0IsV0FBT2pCLElBQVAsRUFBYTtBQUNULFlBQUksRUFBRU8sR0FBRixFQUFPQyxJQUFQLEVBQWFqQixRQUFiLEtBQTBCLElBQTlCO0FBQ0EsWUFBSXlCLE9BQU9ULElBQUlQLEtBQUtKLEdBQVQsSUFBZ0IsSUFBSVAsUUFBSixDQUFhRSxRQUFiLEVBQXVCUyxJQUF2QixDQUEzQjtBQUNBUSxhQUFLUyxNQUFMLENBQVlELElBQVo7QUFDQSxlQUFPQSxJQUFQO0FBQ0g7QUFDREUsaUJBQWFsQixJQUFiLEVBQW1CbUIsU0FBbkIsRUFBOEI7QUFDMUIsWUFBSSxFQUFFWixHQUFGLEVBQU9DLElBQVAsRUFBYWpCLFFBQWIsS0FBMEIsSUFBOUI7QUFDQSxZQUFJeUIsT0FBT1QsSUFBSVAsS0FBS0osR0FBVCxJQUFnQixJQUFJUCxRQUFKLENBQWFFLFFBQWIsRUFBdUJTLElBQXZCLENBQTNCO0FBQ0FnQixhQUFLdEIsUUFBTCxHQUFnQixJQUFoQjtBQUNBYyxhQUFLVSxZQUFMLENBQWtCRixJQUFsQixFQUF3QkcsU0FBeEI7QUFDQSxlQUFPSCxJQUFQO0FBQ0g7QUFDREksU0FBS3BCLElBQUwsRUFBV21CLFNBQVgsRUFBc0I7QUFDbEIsWUFBSSxFQUFFWCxJQUFGLEtBQVcsSUFBZjtBQUNBUixhQUFLTixRQUFMLEdBQWdCLElBQWhCO0FBQ0FjLGFBQUthLE1BQUwsQ0FBWXJCLElBQVo7QUFDQVEsYUFBS1UsWUFBTCxDQUFrQmxCLElBQWxCLEVBQXdCbUIsU0FBeEI7QUFDSDtBQUNERSxXQUFPckIsSUFBUCxFQUFhO0FBQ1QsWUFBSSxFQUFFUSxJQUFGLEtBQVcsSUFBZjtBQUNBQSxhQUFLYSxNQUFMLENBQVlyQixJQUFaO0FBQ0EsZUFBTyxLQUFLTyxHQUFMLENBQVNQLEtBQUtKLEdBQWQsQ0FBUDtBQUNIO0FBQ0QwQixhQUFTdEIsSUFBVCxFQUFlO0FBQ1gsZUFBTyxLQUFLUSxJQUFMLENBQVVjLFFBQVYsQ0FBbUJ0QixJQUFuQixDQUFQO0FBQ0g7QUFDRHVCLFdBQU87QUFDSCxlQUFPLEtBQUtmLElBQUwsQ0FBVWUsSUFBVixFQUFQO0FBQ0g7QUF2RDJCO1FBQW5CakIsa0IsR0FBQUEsa0I7QUF5RE4sTUFBTWtCLGlCQUFOLENBQXdCO0FBQzNCO0FBQ0E7QUFDQWxDLGdCQUFZQyxRQUFaLEVBQXNCO0FBQ2xCLGFBQUtvQixRQUFMLEdBQWdCLElBQWhCO0FBQ0EsWUFBSWMsWUFBWSxJQUFJbkIsa0JBQUosQ0FBdUJmLFFBQXZCLENBQWhCO0FBQ0EsYUFBS2tDLFNBQUwsR0FBaUJBLFNBQWpCO0FBQ0g7QUFDREMsV0FBTztBQUNILFlBQUksRUFBRUQsU0FBRixLQUFnQixJQUFwQjtBQUNBLFlBQUlkLFdBQVcsS0FBS0EsUUFBTCxHQUFnQixLQUFLQSxRQUFMLElBQWlCYyxVQUFVYixPQUFWLEVBQWhEO0FBQ0EsWUFBSVosT0FBT1csU0FBU2UsSUFBVCxFQUFYO0FBQ0EsWUFBSSxDQUFDMUIsSUFBTCxFQUFXLE9BQU8sSUFBUDtBQUNYLGVBQU95QixVQUFVUixNQUFWLENBQWlCakIsSUFBakIsQ0FBUDtBQUNIO0FBZDBCO1FBQWxCd0IsaUIsR0FBQUEsaUI7QUFnQmIsSUFBSUcsS0FBSjtBQUNBLENBQUMsVUFBVUEsS0FBVixFQUFpQjtBQUNkQSxVQUFNQSxNQUFNLFFBQU4sSUFBa0IsQ0FBeEIsSUFBNkIsUUFBN0I7QUFDQUEsVUFBTUEsTUFBTSxPQUFOLElBQWlCLENBQXZCLElBQTRCLE9BQTVCO0FBQ0FBLFVBQU1BLE1BQU0sTUFBTixJQUFnQixDQUF0QixJQUEyQixNQUEzQjtBQUNILENBSkQsRUFJR0EsVUFBVUEsUUFBUSxFQUFsQixDQUpIO0FBS08sTUFBTUMsb0JBQU4sQ0FBMkI7QUFDOUJ0QyxnQkFBWSxFQUFFdUMsTUFBRixFQUFVSixTQUFWLEVBQVosRUFBbUM7QUFDL0IsYUFBS0ksTUFBTCxHQUFjQSxNQUFkO0FBQ0EsYUFBS0osU0FBTCxHQUFpQkEsU0FBakI7QUFDQSxhQUFLZCxRQUFMLEdBQWdCYyxVQUFVYixPQUFWLEVBQWhCO0FBQ0EsYUFBS2tCLE9BQUwsR0FBZUwsVUFBVUYsSUFBVixFQUFmO0FBQ0g7QUFDRFEsV0FBTztBQUNILFlBQUlDLFFBQVFMLE1BQU1NLE1BQWxCO0FBQ0EsZUFBTyxJQUFQLEVBQWE7QUFDVCxvQkFBUUQsS0FBUjtBQUNJLHFCQUFLTCxNQUFNTSxNQUFYO0FBQ0lELDRCQUFRLEtBQUtFLFVBQUwsRUFBUjtBQUNBO0FBQ0oscUJBQUtQLE1BQU1RLEtBQVg7QUFDSUgsNEJBQVEsS0FBS0ksU0FBTCxFQUFSO0FBQ0E7QUFDSixxQkFBS1QsTUFBTVUsSUFBWDtBQUNJLHlCQUFLQyxRQUFMO0FBQ0E7QUFUUjtBQVdIO0FBQ0o7QUFDREMsaUJBQWEzQyxHQUFiLEVBQWtCO0FBQ2QsWUFBSSxFQUFFa0MsT0FBRixFQUFXTCxTQUFYLEtBQXlCLElBQTdCO0FBQ0EsWUFBSWUsT0FBT1YsT0FBWDtBQUNBLGVBQU9VLFFBQVFBLEtBQUs1QyxHQUFMLEtBQWFBLEdBQTVCLEVBQWlDO0FBQzdCNEMsaUJBQUs3QyxJQUFMLEdBQVksSUFBWjtBQUNBNkMsbUJBQU9mLFVBQVVILFFBQVYsQ0FBbUJrQixJQUFuQixDQUFQO0FBQ0g7QUFDRCxhQUFLVixPQUFMLEdBQWVVLFFBQVFmLFVBQVVILFFBQVYsQ0FBbUJrQixJQUFuQixDQUF2QjtBQUNIO0FBQ0ROLGlCQUFhO0FBQ1QsWUFBSSxFQUFFdkIsUUFBRixFQUFZbUIsT0FBWixFQUFxQkwsU0FBckIsS0FBbUMsSUFBdkM7QUFDQSxZQUFJekIsT0FBT1csU0FBU2UsSUFBVCxFQUFYO0FBQ0EsWUFBSTFCLFNBQVMsSUFBYixFQUFtQjtBQUNmLG1CQUFPLEtBQUt5QyxVQUFMLEVBQVA7QUFDSDtBQUNELFlBQUksRUFBRTdDLEdBQUYsS0FBVUksSUFBZDtBQUNBLFlBQUk4QixXQUFXQSxRQUFRbEMsR0FBUixLQUFnQkEsR0FBL0IsRUFBb0M7QUFDaEMsaUJBQUs4QyxVQUFMLENBQWdCMUMsSUFBaEI7QUFDSCxTQUZELE1BRU8sSUFBSXlCLFVBQVVaLEdBQVYsQ0FBY2pCLEdBQWQsQ0FBSixFQUF3QjtBQUMzQixpQkFBSytDLFFBQUwsQ0FBYzNDLElBQWQ7QUFDSCxTQUZNLE1BRUE7QUFDSCxpQkFBSzRDLFVBQUwsQ0FBZ0I1QyxJQUFoQjtBQUNIO0FBQ0QsZUFBTzJCLE1BQU1NLE1BQWI7QUFDSDtBQUNEUyxlQUFXMUMsSUFBWCxFQUFpQjtBQUNiLFlBQUksRUFBRXlCLFNBQUYsRUFBYUssT0FBYixLQUF5QixJQUE3QjtBQUNBQSxrQkFBVSxrQkFBT0EsT0FBUCxFQUFnQix1QkFBaEIsQ0FBVjtBQUNBQSxnQkFBUS9CLE1BQVIsQ0FBZUMsSUFBZjtBQUNBLGFBQUs4QixPQUFMLEdBQWVMLFVBQVVILFFBQVYsQ0FBbUJRLE9BQW5CLENBQWY7QUFDQSxhQUFLRCxNQUFMLENBQVlnQixNQUFaLENBQW1CN0MsS0FBS0osR0FBeEIsRUFBNkJrQyxRQUFRNUIsS0FBckMsRUFBNEM0QixRQUFRakMsSUFBcEQ7QUFDSDtBQUNEOEMsYUFBUzNDLElBQVQsRUFBZTtBQUNYLFlBQUksRUFBRThCLE9BQUYsRUFBV0wsU0FBWCxFQUFzQkksTUFBdEIsS0FBaUMsSUFBckM7QUFDQSxZQUFJLEVBQUVqQyxHQUFGLEtBQVVJLElBQWQ7QUFDQSxZQUFJOEMsUUFBUXJCLFVBQVVYLEdBQVYsQ0FBY2QsS0FBS0osR0FBbkIsQ0FBWjtBQUNBa0QsY0FBTS9DLE1BQU4sQ0FBYUMsSUFBYjtBQUNBLFlBQUl5QixVQUFVVixPQUFWLENBQWtCZixLQUFLSixHQUF2QixDQUFKLEVBQWlDO0FBQzdCNkIsc0JBQVVMLElBQVYsQ0FBZTBCLEtBQWYsRUFBc0JoQixPQUF0QjtBQUNBRCxtQkFBT1QsSUFBUCxDQUFZMEIsTUFBTWxELEdBQWxCLEVBQXVCa0QsTUFBTTVDLEtBQTdCLEVBQW9DNEMsTUFBTWpELElBQTFDLEVBQWdEaUMsVUFBVUEsUUFBUWxDLEdBQWxCLEdBQXdCLElBQXhFO0FBQ0gsU0FIRCxNQUdPO0FBQ0gsaUJBQUsyQyxZQUFMLENBQWtCM0MsR0FBbEI7QUFDSDtBQUNKO0FBQ0RnRCxlQUFXNUMsSUFBWCxFQUFpQjtBQUNiLFlBQUksRUFBRXlCLFNBQUYsRUFBYUksTUFBYixFQUFxQkMsT0FBckIsS0FBaUMsSUFBckM7QUFDQSxZQUFJZCxPQUFPUyxVQUFVUCxZQUFWLENBQXVCbEIsSUFBdkIsRUFBNkI4QixPQUE3QixDQUFYO0FBQ0FELGVBQU9rQixNQUFQLENBQWMvQixLQUFLcEIsR0FBbkIsRUFBd0JvQixLQUFLZCxLQUE3QixFQUFvQ2MsS0FBS25CLElBQXpDLEVBQStDaUMsVUFBVUEsUUFBUWxDLEdBQWxCLEdBQXdCLElBQXZFO0FBQ0g7QUFDRDZDLGlCQUFhO0FBQ1QsYUFBS1gsT0FBTCxHQUFlLEtBQUtMLFNBQUwsQ0FBZUYsSUFBZixFQUFmO0FBQ0EsZUFBT0ksTUFBTVEsS0FBYjtBQUNIO0FBQ0RDLGdCQUFZO0FBQ1IsWUFBSSxFQUFFWCxTQUFGLEVBQWFJLE1BQWIsRUFBcUJDLE9BQXJCLEtBQWlDLElBQXJDO0FBQ0EsWUFBSUEsWUFBWSxJQUFoQixFQUFzQjtBQUNsQixtQkFBT0gsTUFBTVUsSUFBYjtBQUNIO0FBQ0QsWUFBSXJCLE9BQU9jLE9BQVg7QUFDQSxhQUFLQSxPQUFMLEdBQWVMLFVBQVVILFFBQVYsQ0FBbUJOLElBQW5CLENBQWY7QUFDQSxZQUFJQSxLQUFLWixZQUFMLEVBQUosRUFBeUI7QUFDckJxQixzQkFBVUosTUFBVixDQUFpQkwsSUFBakI7QUFDQWEsbUJBQU9tQixNQUFQLENBQWNoQyxLQUFLcEIsR0FBbkI7QUFDSCxTQUhELE1BR087QUFDSG9CLGlCQUFLWCxLQUFMO0FBQ0g7QUFDRCxlQUFPc0IsTUFBTVEsS0FBYjtBQUNIO0FBQ0RHLGVBQVc7QUFDUCxhQUFLVCxNQUFMLENBQVlvQixJQUFaO0FBQ0g7QUE3RjZCO1FBQXJCckIsb0IsR0FBQUEsb0IiLCJmaWxlIjoibGliL2l0ZXJhYmxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGlua2VkTGlzdCwgTGlzdE5vZGUsIGRpY3QsIGV4cGVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuZXhwb3J0IGNsYXNzIExpc3RJdGVtIGV4dGVuZHMgTGlzdE5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGl0ZXJhYmxlLCByZXN1bHQpIHtcbiAgICAgICAgc3VwZXIoaXRlcmFibGUudmFsdWVSZWZlcmVuY2VGb3IocmVzdWx0KSk7XG4gICAgICAgIHRoaXMucmV0YWluZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMua2V5ID0gcmVzdWx0LmtleTtcbiAgICAgICAgdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlO1xuICAgICAgICB0aGlzLm1lbW8gPSBpdGVyYWJsZS5tZW1vUmVmZXJlbmNlRm9yKHJlc3VsdCk7XG4gICAgfVxuICAgIHVwZGF0ZShpdGVtKSB7XG4gICAgICAgIHRoaXMucmV0YWluZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLml0ZXJhYmxlLnVwZGF0ZVZhbHVlUmVmZXJlbmNlKHRoaXMudmFsdWUsIGl0ZW0pO1xuICAgICAgICB0aGlzLml0ZXJhYmxlLnVwZGF0ZU1lbW9SZWZlcmVuY2UodGhpcy5tZW1vLCBpdGVtKTtcbiAgICB9XG4gICAgc2hvdWxkUmVtb3ZlKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMucmV0YWluZWQ7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnJldGFpbmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VlbiA9IGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBJdGVyYXRpb25BcnRpZmFjdHMge1xuICAgIGNvbnN0cnVjdG9yKGl0ZXJhYmxlKSB7XG4gICAgICAgIHRoaXMubWFwID0gZGljdCgpO1xuICAgICAgICB0aGlzLmxpc3QgPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgICAgICB0aGlzLnRhZyA9IGl0ZXJhYmxlLnRhZztcbiAgICAgICAgdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICBsZXQgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yID0gdGhpcy5pdGVyYWJsZS5pdGVyYXRlKCk7XG4gICAgICAgIHJldHVybiBpdGVyYXRvci5pc0VtcHR5KCk7XG4gICAgfVxuICAgIGl0ZXJhdGUoKSB7XG4gICAgICAgIGxldCBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3IgfHwgdGhpcy5pdGVyYWJsZS5pdGVyYXRlKCk7XG4gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBudWxsO1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5tYXBba2V5XTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgICB9XG4gICAgd2FzU2VlbihrZXkpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLm1hcFtrZXldO1xuICAgICAgICByZXR1cm4gbm9kZSAmJiBub2RlLnNlZW47XG4gICAgfVxuICAgIGFwcGVuZChpdGVtKSB7XG4gICAgICAgIGxldCB7IG1hcCwgbGlzdCwgaXRlcmFibGUgfSA9IHRoaXM7XG4gICAgICAgIGxldCBub2RlID0gbWFwW2l0ZW0ua2V5XSA9IG5ldyBMaXN0SXRlbShpdGVyYWJsZSwgaXRlbSk7XG4gICAgICAgIGxpc3QuYXBwZW5kKG5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgaW5zZXJ0QmVmb3JlKGl0ZW0sIHJlZmVyZW5jZSkge1xuICAgICAgICBsZXQgeyBtYXAsIGxpc3QsIGl0ZXJhYmxlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgbm9kZSA9IG1hcFtpdGVtLmtleV0gPSBuZXcgTGlzdEl0ZW0oaXRlcmFibGUsIGl0ZW0pO1xuICAgICAgICBub2RlLnJldGFpbmVkID0gdHJ1ZTtcbiAgICAgICAgbGlzdC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIG1vdmUoaXRlbSwgcmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGxpc3QgfSA9IHRoaXM7XG4gICAgICAgIGl0ZW0ucmV0YWluZWQgPSB0cnVlO1xuICAgICAgICBsaXN0LnJlbW92ZShpdGVtKTtcbiAgICAgICAgbGlzdC5pbnNlcnRCZWZvcmUoaXRlbSwgcmVmZXJlbmNlKTtcbiAgICB9XG4gICAgcmVtb3ZlKGl0ZW0pIHtcbiAgICAgICAgbGV0IHsgbGlzdCB9ID0gdGhpcztcbiAgICAgICAgbGlzdC5yZW1vdmUoaXRlbSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm1hcFtpdGVtLmtleV07XG4gICAgfVxuICAgIG5leHROb2RlKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5uZXh0Tm9kZShpdGVtKTtcbiAgICB9XG4gICAgaGVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5oZWFkKCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUl0ZXJhdG9yIHtcbiAgICAvLyBpZiBhbnlvbmUgbmVlZHMgdG8gY29uc3RydWN0IHRoaXMgb2JqZWN0IHdpdGggc29tZXRoaW5nIG90aGVyIHRoYW5cbiAgICAvLyBhbiBpdGVyYWJsZSwgbGV0IEB3eWNhdHMga25vdy5cbiAgICBjb25zdHJ1Y3RvcihpdGVyYWJsZSkge1xuICAgICAgICB0aGlzLml0ZXJhdG9yID0gbnVsbDtcbiAgICAgICAgbGV0IGFydGlmYWN0cyA9IG5ldyBJdGVyYXRpb25BcnRpZmFjdHMoaXRlcmFibGUpO1xuICAgICAgICB0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0cztcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgbGV0IHsgYXJ0aWZhY3RzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yID0gdGhpcy5pdGVyYXRvciB8fCBhcnRpZmFjdHMuaXRlcmF0ZSgpO1xuICAgICAgICBsZXQgaXRlbSA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGFydGlmYWN0cy5hcHBlbmQoaXRlbSk7XG4gICAgfVxufVxudmFyIFBoYXNlO1xuKGZ1bmN0aW9uIChQaGFzZSkge1xuICAgIFBoYXNlW1BoYXNlW1wiQXBwZW5kXCJdID0gMF0gPSBcIkFwcGVuZFwiO1xuICAgIFBoYXNlW1BoYXNlW1wiUHJ1bmVcIl0gPSAxXSA9IFwiUHJ1bmVcIjtcbiAgICBQaGFzZVtQaGFzZVtcIkRvbmVcIl0gPSAyXSA9IFwiRG9uZVwiO1xufSkoUGhhc2UgfHwgKFBoYXNlID0ge30pKTtcbmV4cG9ydCBjbGFzcyBJdGVyYXRvclN5bmNocm9uaXplciB7XG4gICAgY29uc3RydWN0b3IoeyB0YXJnZXQsIGFydGlmYWN0cyB9KSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0cztcbiAgICAgICAgdGhpcy5pdGVyYXRvciA9IGFydGlmYWN0cy5pdGVyYXRlKCk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGFydGlmYWN0cy5oZWFkKCk7XG4gICAgfVxuICAgIHN5bmMoKSB7XG4gICAgICAgIGxldCBwaGFzZSA9IFBoYXNlLkFwcGVuZDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGhhc2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFBoYXNlLkFwcGVuZDpcbiAgICAgICAgICAgICAgICAgICAgcGhhc2UgPSB0aGlzLm5leHRBcHBlbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBQaGFzZS5QcnVuZTpcbiAgICAgICAgICAgICAgICAgICAgcGhhc2UgPSB0aGlzLm5leHRQcnVuZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFBoYXNlLkRvbmU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dERvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFkdmFuY2VUb0tleShrZXkpIHtcbiAgICAgICAgbGV0IHsgY3VycmVudCwgYXJ0aWZhY3RzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgc2VlayA9IGN1cnJlbnQ7XG4gICAgICAgIHdoaWxlIChzZWVrICYmIHNlZWsua2V5ICE9PSBrZXkpIHtcbiAgICAgICAgICAgIHNlZWsuc2VlbiA9IHRydWU7XG4gICAgICAgICAgICBzZWVrID0gYXJ0aWZhY3RzLm5leHROb2RlKHNlZWspO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHNlZWsgJiYgYXJ0aWZhY3RzLm5leHROb2RlKHNlZWspO1xuICAgIH1cbiAgICBuZXh0QXBwZW5kKCkge1xuICAgICAgICBsZXQgeyBpdGVyYXRvciwgY3VycmVudCwgYXJ0aWZhY3RzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgaXRlbSA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0UHJ1bmUoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBrZXkgfSA9IGl0ZW07XG4gICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFJldGFpbihpdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcnRpZmFjdHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dE1vdmUoaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJbnNlcnQoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBoYXNlLkFwcGVuZDtcbiAgICB9XG4gICAgbmV4dFJldGFpbihpdGVtKSB7XG4gICAgICAgIGxldCB7IGFydGlmYWN0cywgY3VycmVudCB9ID0gdGhpcztcbiAgICAgICAgY3VycmVudCA9IGV4cGVjdChjdXJyZW50LCAnQlVHOiBjdXJyZW50IGlzIGVtcHR5Jyk7XG4gICAgICAgIGN1cnJlbnQudXBkYXRlKGl0ZW0pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBhcnRpZmFjdHMubmV4dE5vZGUoY3VycmVudCk7XG4gICAgICAgIHRoaXMudGFyZ2V0LnJldGFpbihpdGVtLmtleSwgY3VycmVudC52YWx1ZSwgY3VycmVudC5tZW1vKTtcbiAgICB9XG4gICAgbmV4dE1vdmUoaXRlbSkge1xuICAgICAgICBsZXQgeyBjdXJyZW50LCBhcnRpZmFjdHMsIHRhcmdldCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsga2V5IH0gPSBpdGVtO1xuICAgICAgICBsZXQgZm91bmQgPSBhcnRpZmFjdHMuZ2V0KGl0ZW0ua2V5KTtcbiAgICAgICAgZm91bmQudXBkYXRlKGl0ZW0pO1xuICAgICAgICBpZiAoYXJ0aWZhY3RzLndhc1NlZW4oaXRlbS5rZXkpKSB7XG4gICAgICAgICAgICBhcnRpZmFjdHMubW92ZShmb3VuZCwgY3VycmVudCk7XG4gICAgICAgICAgICB0YXJnZXQubW92ZShmb3VuZC5rZXksIGZvdW5kLnZhbHVlLCBmb3VuZC5tZW1vLCBjdXJyZW50ID8gY3VycmVudC5rZXkgOiBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZVRvS2V5KGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dEluc2VydChpdGVtKSB7XG4gICAgICAgIGxldCB7IGFydGlmYWN0cywgdGFyZ2V0LCBjdXJyZW50IH0gPSB0aGlzO1xuICAgICAgICBsZXQgbm9kZSA9IGFydGlmYWN0cy5pbnNlcnRCZWZvcmUoaXRlbSwgY3VycmVudCk7XG4gICAgICAgIHRhcmdldC5pbnNlcnQobm9kZS5rZXksIG5vZGUudmFsdWUsIG5vZGUubWVtbywgY3VycmVudCA/IGN1cnJlbnQua2V5IDogbnVsbCk7XG4gICAgfVxuICAgIHN0YXJ0UHJ1bmUoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuYXJ0aWZhY3RzLmhlYWQoKTtcbiAgICAgICAgcmV0dXJuIFBoYXNlLlBydW5lO1xuICAgIH1cbiAgICBuZXh0UHJ1bmUoKSB7XG4gICAgICAgIGxldCB7IGFydGlmYWN0cywgdGFyZ2V0LCBjdXJyZW50IH0gPSB0aGlzO1xuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFBoYXNlLkRvbmU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5vZGUgPSBjdXJyZW50O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBhcnRpZmFjdHMubmV4dE5vZGUobm9kZSk7XG4gICAgICAgIGlmIChub2RlLnNob3VsZFJlbW92ZSgpKSB7XG4gICAgICAgICAgICBhcnRpZmFjdHMucmVtb3ZlKG5vZGUpO1xuICAgICAgICAgICAgdGFyZ2V0LmRlbGV0ZShub2RlLmtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBoYXNlLlBydW5lO1xuICAgIH1cbiAgICBuZXh0RG9uZSgpIHtcbiAgICAgICAgdGhpcy50YXJnZXQuZG9uZSgpO1xuICAgIH1cbn0iXX0=