UNPKG

ember-legacy-class-transform

Version:
269 lines (268 loc) 26.9 kB
"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