ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
269 lines (268 loc) • 26.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.combineTagged = combineTagged;
exports.combineSlice = combineSlice;
exports.combine = combine;
exports.map = map;
exports.isModified = isModified;
const CONSTANT = exports.CONSTANT = 0;
const INITIAL = exports.INITIAL = 1;
const VOLATILE = exports.VOLATILE = NaN;
class RevisionTag {
validate(snapshot) {
return this.value() === snapshot;
}
}
exports.RevisionTag = RevisionTag;
RevisionTag.id = 0;
const VALUE = [];
const VALIDATE = [];
class TagWrapper {
constructor(type, inner) {
this.type = type;
this.inner = inner;
}
value() {
let func = VALUE[this.type];
return func(this.inner);
}
validate(snapshot) {
let func = VALIDATE[this.type];
return func(this.inner, snapshot);
}
}
exports.TagWrapper = TagWrapper;
function register(Type) {
let type = VALUE.length;
VALUE.push(tag => tag.value());
VALIDATE.push((tag, snapshot) => tag.validate(snapshot));
Type.id = type;
}
///
// CONSTANT: 0
VALUE.push(() => CONSTANT);
VALIDATE.push((_tag, snapshot) => snapshot === CONSTANT);
const CONSTANT_TAG = exports.CONSTANT_TAG = new TagWrapper(0, null);
// VOLATILE: 1
VALUE.push(() => VOLATILE);
VALIDATE.push((_tag, snapshot) => snapshot === VOLATILE);
const VOLATILE_TAG = exports.VOLATILE_TAG = new TagWrapper(1, null);
// CURRENT: 2
VALUE.push(() => $REVISION);
VALIDATE.push((_tag, snapshot) => snapshot === $REVISION);
const CURRENT_TAG = exports.CURRENT_TAG = new TagWrapper(2, null);
///
let $REVISION = INITIAL;
class DirtyableTag extends RevisionTag {
static create(revision = $REVISION) {
return new TagWrapper(this.id, new DirtyableTag(revision));
}
constructor(revision = $REVISION) {
super();
this.revision = revision;
}
value() {
return this.revision;
}
dirty() {
this.revision = ++$REVISION;
}
}
exports.DirtyableTag = DirtyableTag;
register(DirtyableTag);
function combineTagged(tagged) {
let optimized = [];
for (let i = 0, l = tagged.length; i < l; i++) {
let tag = tagged[i].tag;
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag === CONSTANT_TAG) continue;
optimized.push(tag);
}
return _combine(optimized);
}
function combineSlice(slice) {
let optimized = [];
let node = slice.head();
while (node !== null) {
let tag = node.tag;
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag !== CONSTANT_TAG) optimized.push(tag);
node = slice.nextNode(node);
}
return _combine(optimized);
}
function combine(tags) {
let optimized = [];
for (let i = 0, l = tags.length; i < l; i++) {
let tag = tags[i];
if (tag === VOLATILE_TAG) return VOLATILE_TAG;
if (tag === CONSTANT_TAG) continue;
optimized.push(tag);
}
return _combine(optimized);
}
function _combine(tags) {
switch (tags.length) {
case 0:
return CONSTANT_TAG;
case 1:
return tags[0];
case 2:
return TagsPair.create(tags[0], tags[1]);
default:
return TagsCombinator.create(tags);
}
;
}
class CachedTag extends RevisionTag {
constructor() {
super(...arguments);
this.lastChecked = null;
this.lastValue = null;
}
value() {
let { lastChecked, lastValue } = this;
if (lastChecked !== $REVISION) {
this.lastChecked = $REVISION;
this.lastValue = lastValue = this.compute();
}
return this.lastValue;
}
invalidate() {
this.lastChecked = null;
}
}
exports.CachedTag = CachedTag;
class TagsPair extends CachedTag {
static create(first, second) {
return new TagWrapper(this.id, new TagsPair(first, second));
}
constructor(first, second) {
super();
this.first = first;
this.second = second;
}
compute() {
return Math.max(this.first.value(), this.second.value());
}
}
register(TagsPair);
class TagsCombinator extends CachedTag {
static create(tags) {
return new TagWrapper(this.id, new TagsCombinator(tags));
}
constructor(tags) {
super();
this.tags = tags;
}
compute() {
let { tags } = this;
let max = -1;
for (let i = 0; i < tags.length; i++) {
let value = tags[i].value();
max = Math.max(value, max);
}
return max;
}
}
register(TagsCombinator);
class UpdatableTag extends CachedTag {
static create(tag) {
return new TagWrapper(this.id, new UpdatableTag(tag));
}
constructor(tag) {
super();
this.tag = tag;
this.lastUpdated = INITIAL;
}
compute() {
return Math.max(this.lastUpdated, this.tag.value());
}
update(tag) {
if (tag !== this.tag) {
this.tag = tag;
this.lastUpdated = $REVISION;
this.invalidate();
}
}
}
exports.UpdatableTag = UpdatableTag;
register(UpdatableTag);
class CachedReference {
constructor() {
this.lastRevision = null;
this.lastValue = null;
}
value() {
let { tag, lastRevision, lastValue } = this;
if (!lastRevision || !tag.validate(lastRevision)) {
lastValue = this.lastValue = this.compute();
this.lastRevision = tag.value();
}
return lastValue;
}
invalidate() {
this.lastRevision = null;
}
}
exports.CachedReference = CachedReference;
class MapperReference extends CachedReference {
constructor(reference, mapper) {
super();
this.tag = reference.tag;
this.reference = reference;
this.mapper = mapper;
}
compute() {
let { reference, mapper } = this;
return mapper(reference.value());
}
}
function map(reference, mapper) {
return new MapperReference(reference, mapper);
}
//////////
class ReferenceCache {
constructor(reference) {
this.lastValue = null;
this.lastRevision = null;
this.initialized = false;
this.tag = reference.tag;
this.reference = reference;
}
peek() {
if (!this.initialized) {
return this.initialize();
}
return this.lastValue;
}
revalidate() {
if (!this.initialized) {
return this.initialize();
}
let { reference, lastRevision } = this;
let tag = reference.tag;
if (tag.validate(lastRevision)) return NOT_MODIFIED;
this.lastRevision = tag.value();
let { lastValue } = this;
let value = reference.value();
if (value === lastValue) return NOT_MODIFIED;
this.lastValue = value;
return value;
}
initialize() {
let { reference } = this;
let value = this.lastValue = reference.value();
this.lastRevision = reference.tag.value();
this.initialized = true;
return value;
}
}
exports.ReferenceCache = ReferenceCache;
const NOT_MODIFIED = "adb3b78e-3d22-4e4b-877a-6317c2c5c145";
function isModified(value) {
return value !== NOT_MODIFIED;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92YWxpZGF0b3JzLmpzIl0sIm5hbWVzIjpbImNvbWJpbmVUYWdnZWQiLCJjb21iaW5lU2xpY2UiLCJjb21iaW5lIiwibWFwIiwiaXNNb2RpZmllZCIsIkNPTlNUQU5UIiwiSU5JVElBTCIsIlZPTEFUSUxFIiwiTmFOIiwiUmV2aXNpb25UYWciLCJ2YWxpZGF0ZSIsInNuYXBzaG90IiwidmFsdWUiLCJpZCIsIlZBTFVFIiwiVkFMSURBVEUiLCJUYWdXcmFwcGVyIiwiY29uc3RydWN0b3IiLCJ0eXBlIiwiaW5uZXIiLCJmdW5jIiwicmVnaXN0ZXIiLCJUeXBlIiwibGVuZ3RoIiwicHVzaCIsInRhZyIsIl90YWciLCJDT05TVEFOVF9UQUciLCJWT0xBVElMRV9UQUciLCIkUkVWSVNJT04iLCJDVVJSRU5UX1RBRyIsIkRpcnR5YWJsZVRhZyIsImNyZWF0ZSIsInJldmlzaW9uIiwiZGlydHkiLCJ0YWdnZWQiLCJvcHRpbWl6ZWQiLCJpIiwibCIsIl9jb21iaW5lIiwic2xpY2UiLCJub2RlIiwiaGVhZCIsIm5leHROb2RlIiwidGFncyIsIlRhZ3NQYWlyIiwiVGFnc0NvbWJpbmF0b3IiLCJDYWNoZWRUYWciLCJhcmd1bWVudHMiLCJsYXN0Q2hlY2tlZCIsImxhc3RWYWx1ZSIsImNvbXB1dGUiLCJpbnZhbGlkYXRlIiwiZmlyc3QiLCJzZWNvbmQiLCJNYXRoIiwibWF4IiwiVXBkYXRhYmxlVGFnIiwibGFzdFVwZGF0ZWQiLCJ1cGRhdGUiLCJDYWNoZWRSZWZlcmVuY2UiLCJsYXN0UmV2aXNpb24iLCJNYXBwZXJSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJtYXBwZXIiLCJSZWZlcmVuY2VDYWNoZSIsImluaXRpYWxpemVkIiwicGVlayIsImluaXRpYWxpemUiLCJyZXZhbGlkYXRlIiwiTk9UX01PRElGSUVEIl0sIm1hcHBpbmdzIjoiOzs7OztRQThEZ0JBLGEsR0FBQUEsYTtRQVVBQyxZLEdBQUFBLFk7UUFXQUMsTyxHQUFBQSxPO1FBNEhBQyxHLEdBQUFBLEc7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U0FBZCxFQUF5QixPQUFPb0IsWUFBUDtBQUN6QixhQUFLcEIsU0FBTCxHQUFpQnRDLEtBQWpCO0FBQ0EsZUFBT0EsS0FBUDtBQUNIO0FBQ0R3RCxpQkFBYTtBQUNULFlBQUksRUFBRUwsU0FBRixLQUFnQixJQUFwQjtBQUNBLFlBQUluRCxRQUFRLEtBQUtzQyxTQUFMLEdBQWlCYSxVQUFVbkQsS0FBVixFQUE3QjtBQUNBLGFBQUtpRCxZQUFMLEdBQW9CRSxVQUFVdEMsR0FBVixDQUFjYixLQUFkLEVBQXBCO0FBQ0EsYUFBS3NELFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxlQUFPdEQsS0FBUDtBQUNIO0FBbEN1QjtRQUFmcUQsYyxHQUFBQSxjO0FBb0NiLE1BQU1LLGVBQWUsc0NBQXJCO0FBQ08sU0FBU2xFLFVBQVQsQ0FBb0JRLEtBQXBCLEVBQTJCO0FBQzlCLFdBQU9BLFVBQVUwRCxZQUFqQjtBQUNIIiwiZmlsZSI6ImxpYi92YWxpZGF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IENPTlNUQU5UID0gMDtcbmV4cG9ydCBjb25zdCBJTklUSUFMID0gMTtcbmV4cG9ydCBjb25zdCBWT0xBVElMRSA9IE5hTjtcbmV4cG9ydCBjbGFzcyBSZXZpc2lvblRhZyB7XG4gICAgdmFsaWRhdGUoc25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoKSA9PT0gc25hcHNob3Q7XG4gICAgfVxufVxuUmV2aXNpb25UYWcuaWQgPSAwO1xuY29uc3QgVkFMVUUgPSBbXTtcbmNvbnN0IFZBTElEQVRFID0gW107XG5leHBvcnQgY2xhc3MgVGFnV3JhcHBlciB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgaW5uZXIpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgIH1cbiAgICB2YWx1ZSgpIHtcbiAgICAgICAgbGV0IGZ1bmMgPSBWQUxVRVt0aGlzLnR5cGVdO1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzLmlubmVyKTtcbiAgICB9XG4gICAgdmFsaWRhdGUoc25hcHNob3QpIHtcbiAgICAgICAgbGV0IGZ1bmMgPSBWQUxJREFURVt0aGlzLnR5cGVdO1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzLmlubmVyLCBzbmFwc2hvdCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVnaXN0ZXIoVHlwZSkge1xuICAgIGxldCB0eXBlID0gVkFMVUUubGVuZ3RoO1xuICAgIFZBTFVFLnB1c2godGFnID0+IHRhZy52YWx1ZSgpKTtcbiAgICBWQUxJREFURS5wdXNoKCh0YWcsIHNuYXBzaG90KSA9PiB0YWcudmFsaWRhdGUoc25hcHNob3QpKTtcbiAgICBUeXBlLmlkID0gdHlwZTtcbn1cbi8vL1xuLy8gQ09OU1RBTlQ6IDBcblZBTFVFLnB1c2goKCkgPT4gQ09OU1RBTlQpO1xuVkFMSURBVEUucHVzaCgoX3RhZywgc25hcHNob3QpID0+IHNuYXBzaG90ID09PSBDT05TVEFOVCk7XG5leHBvcnQgY29uc3QgQ09OU1RBTlRfVEFHID0gbmV3IFRhZ1dyYXBwZXIoMCwgbnVsbCk7XG4vLyBWT0xBVElMRTogMVxuVkFMVUUucHVzaCgoKSA9PiBWT0xBVElMRSk7XG5WQUxJREFURS5wdXNoKChfdGFnLCBzbmFwc2hvdCkgPT4gc25hcHNob3QgPT09IFZPTEFUSUxFKTtcbmV4cG9ydCBjb25zdCBWT0xBVElMRV9UQUcgPSBuZXcgVGFnV3JhcHBlcigxLCBudWxsKTtcbi8vIENVUlJFTlQ6IDJcblZBTFVFLnB1c2goKCkgPT4gJFJFVklTSU9OKTtcblZBTElEQVRFLnB1c2goKF90YWcsIHNuYXBzaG90KSA9PiBzbmFwc2hvdCA9PT0gJFJFVklTSU9OKTtcbmV4cG9ydCBjb25zdCBDVVJSRU5UX1RBRyA9IG5ldyBUYWdXcmFwcGVyKDIsIG51bGwpO1xuLy8vXG5sZXQgJFJFVklTSU9OID0gSU5JVElBTDtcbmV4cG9ydCBjbGFzcyBEaXJ0eWFibGVUYWcgZXh0ZW5kcyBSZXZpc2lvblRhZyB7XG4gICAgc3RhdGljIGNyZWF0ZShyZXZpc2lvbiA9ICRSRVZJU0lPTikge1xuICAgICAgICByZXR1cm4gbmV3IFRhZ1dyYXBwZXIodGhpcy5pZCwgbmV3IERpcnR5YWJsZVRhZyhyZXZpc2lvbikpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihyZXZpc2lvbiA9ICRSRVZJU0lPTikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJldmlzaW9uID0gcmV2aXNpb247XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZpc2lvbjtcbiAgICB9XG4gICAgZGlydHkoKSB7XG4gICAgICAgIHRoaXMucmV2aXNpb24gPSArKyRSRVZJU0lPTjtcbiAgICB9XG59XG5yZWdpc3RlcihEaXJ0eWFibGVUYWcpO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVUYWdnZWQodGFnZ2VkKSB7XG4gICAgbGV0IG9wdGltaXplZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGFnZ2VkLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBsZXQgdGFnID0gdGFnZ2VkW2ldLnRhZztcbiAgICAgICAgaWYgKHRhZyA9PT0gVk9MQVRJTEVfVEFHKSByZXR1cm4gVk9MQVRJTEVfVEFHO1xuICAgICAgICBpZiAodGFnID09PSBDT05TVEFOVF9UQUcpIGNvbnRpbnVlO1xuICAgICAgICBvcHRpbWl6ZWQucHVzaCh0YWcpO1xuICAgIH1cbiAgICByZXR1cm4gX2NvbWJpbmUob3B0aW1pemVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lU2xpY2Uoc2xpY2UpIHtcbiAgICBsZXQgb3B0aW1pemVkID0gW107XG4gICAgbGV0IG5vZGUgPSBzbGljZS5oZWFkKCk7XG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IG5vZGUudGFnO1xuICAgICAgICBpZiAodGFnID09PSBWT0xBVElMRV9UQUcpIHJldHVybiBWT0xBVElMRV9UQUc7XG4gICAgICAgIGlmICh0YWcgIT09IENPTlNUQU5UX1RBRykgb3B0aW1pemVkLnB1c2godGFnKTtcbiAgICAgICAgbm9kZSA9IHNsaWNlLm5leHROb2RlKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gX2NvbWJpbmUob3B0aW1pemVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lKHRhZ3MpIHtcbiAgICBsZXQgb3B0aW1pemVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0YWdzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBsZXQgdGFnID0gdGFnc1tpXTtcbiAgICAgICAgaWYgKHRhZyA9PT0gVk9MQVRJTEVfVEFHKSByZXR1cm4gVk9MQVRJTEVfVEFHO1xuICAgICAgICBpZiAodGFnID09PSBDT05TVEFOVF9UQUcpIGNvbnRpbnVlO1xuICAgICAgICBvcHRpbWl6ZWQucHVzaCh0YWcpO1xuICAgIH1cbiAgICByZXR1cm4gX2NvbWJpbmUob3B0aW1pemVkKTtcbn1cbmZ1bmN0aW9uIF9jb21iaW5lKHRhZ3MpIHtcbiAgICBzd2l0Y2ggKHRhZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBDT05TVEFOVF9UQUc7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiB0YWdzWzBdO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gVGFnc1BhaXIuY3JlYXRlKHRhZ3NbMF0sIHRhZ3NbMV0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFRhZ3NDb21iaW5hdG9yLmNyZWF0ZSh0YWdzKTtcbiAgICB9XG4gICAgO1xufVxuZXhwb3J0IGNsYXNzIENhY2hlZFRhZyBleHRlbmRzIFJldmlzaW9uVGFnIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIGxldCB7IGxhc3RDaGVja2VkLCBsYXN0VmFsdWUgfSA9IHRoaXM7XG4gICAgICAgIGlmIChsYXN0Q2hlY2tlZCAhPT0gJFJFVklTSU9OKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RDaGVja2VkID0gJFJFVklTSU9OO1xuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBsYXN0VmFsdWUgPSB0aGlzLmNvbXB1dGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0VmFsdWU7XG4gICAgfVxuICAgIGludmFsaWRhdGUoKSB7XG4gICAgICAgIHRoaXMubGFzdENoZWNrZWQgPSBudWxsO1xuICAgIH1cbn1cbmNsYXNzIFRhZ3NQYWlyIGV4dGVuZHMgQ2FjaGVkVGFnIHtcbiAgICBzdGF0aWMgY3JlYXRlKGZpcnN0LCBzZWNvbmQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWdXcmFwcGVyKHRoaXMuaWQsIG5ldyBUYWdzUGFpcihmaXJzdCwgc2Vjb25kKSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGZpcnN0LCBzZWNvbmQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5maXJzdCA9IGZpcnN0O1xuICAgICAgICB0aGlzLnNlY29uZCA9IHNlY29uZDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuZmlyc3QudmFsdWUoKSwgdGhpcy5zZWNvbmQudmFsdWUoKSk7XG4gICAgfVxufVxucmVnaXN0ZXIoVGFnc1BhaXIpO1xuY2xhc3MgVGFnc0NvbWJpbmF0b3IgZXh0ZW5kcyBDYWNoZWRUYWcge1xuICAgIHN0YXRpYyBjcmVhdGUodGFncykge1xuICAgICAgICByZXR1cm4gbmV3IFRhZ1dyYXBwZXIodGhpcy5pZCwgbmV3IFRhZ3NDb21iaW5hdG9yKHRhZ3MpKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IodGFncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIH1cbiAgICBjb21wdXRlKCkge1xuICAgICAgICBsZXQgeyB0YWdzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgbWF4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGFnc1tpXS52YWx1ZSgpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgodmFsdWUsIG1heCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG59XG5yZWdpc3RlcihUYWdzQ29tYmluYXRvcik7XG5leHBvcnQgY2xhc3MgVXBkYXRhYmxlVGFnIGV4dGVuZHMgQ2FjaGVkVGFnIHtcbiAgICBzdGF0aWMgY3JlYXRlKHRhZykge1xuICAgICAgICByZXR1cm4gbmV3IFRhZ1dyYXBwZXIodGhpcy5pZCwgbmV3IFVwZGF0YWJsZVRhZyh0YWcpKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IodGFnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gSU5JVElBTDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMubGFzdFVwZGF0ZWQsIHRoaXMudGFnLnZhbHVlKCkpO1xuICAgIH1cbiAgICB1cGRhdGUodGFnKSB7XG4gICAgICAgIGlmICh0YWcgIT09IHRoaXMudGFnKSB7XG4gICAgICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSAkUkVWSVNJT047XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbnJlZ2lzdGVyKFVwZGF0YWJsZVRhZyk7XG5leHBvcnQgY2xhc3MgQ2FjaGVkUmVmZXJlbmNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICBsZXQgeyB0YWcsIGxhc3RSZXZpc2lvbiwgbGFzdFZhbHVlIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIWxhc3RSZXZpc2lvbiB8fCAhdGFnLnZhbGlkYXRlKGxhc3RSZXZpc2lvbikpIHtcbiAgICAgICAgICAgIGxhc3RWYWx1ZSA9IHRoaXMubGFzdFZhbHVlID0gdGhpcy5jb21wdXRlKCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHRhZy52YWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXN0VmFsdWU7XG4gICAgfVxuICAgIGludmFsaWRhdGUoKSB7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gbnVsbDtcbiAgICB9XG59XG5jbGFzcyBNYXBwZXJSZWZlcmVuY2UgZXh0ZW5kcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKHJlZmVyZW5jZSwgbWFwcGVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFnID0gcmVmZXJlbmNlLnRhZztcbiAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyO1xuICAgIH1cbiAgICBjb21wdXRlKCkge1xuICAgICAgICBsZXQgeyByZWZlcmVuY2UsIG1hcHBlciB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG1hcHBlcihyZWZlcmVuY2UudmFsdWUoKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG1hcChyZWZlcmVuY2UsIG1hcHBlcikge1xuICAgIHJldHVybiBuZXcgTWFwcGVyUmVmZXJlbmNlKHJlZmVyZW5jZSwgbWFwcGVyKTtcbn1cbi8vLy8vLy8vLy9cbmV4cG9ydCBjbGFzcyBSZWZlcmVuY2VDYWNoZSB7XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlKSB7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGFnID0gcmVmZXJlbmNlLnRhZztcbiAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgfVxuICAgIHBlZWsoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcbiAgICB9XG4gICAgcmV2YWxpZGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgcmVmZXJlbmNlLCBsYXN0UmV2aXNpb24gfSA9IHRoaXM7XG4gICAgICAgIGxldCB0YWcgPSByZWZlcmVuY2UudGFnO1xuICAgICAgICBpZiAodGFnLnZhbGlkYXRlKGxhc3RSZXZpc2lvbikpIHJldHVybiBOT1RfTU9ESUZJRUQ7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gdGFnLnZhbHVlKCk7XG4gICAgICAgIGxldCB7IGxhc3RWYWx1ZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IHZhbHVlID0gcmVmZXJlbmNlLnZhbHVlKCk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbGFzdFZhbHVlKSByZXR1cm4gTk9UX01PRElGSUVEO1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICAgIGxldCB7IHJlZmVyZW5jZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5sYXN0VmFsdWUgPSByZWZlcmVuY2UudmFsdWUoKTtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSByZWZlcmVuY2UudGFnLnZhbHVlKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuY29uc3QgTk9UX01PRElGSUVEID0gXCJhZGIzYjc4ZS0zZDIyLTRlNGItODc3YS02MzE3YzJjNWMxNDVcIjtcbmV4cG9ydCBmdW5jdGlvbiBpc01vZGlmaWVkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBOT1RfTU9ESUZJRUQ7XG59Il19