UNPKG

ember-legacy-class-transform

Version:
333 lines (281 loc) 28.8 kB
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import { dict, EMPTY_ARRAY } from '@glimmer/util'; import { combineTagged } from '@glimmer/reference'; import { PrimitiveReference, UNDEFINED_REFERENCE } from '../references'; export var Arguments = function () { function Arguments() { _classCallCheck(this, Arguments); this.stack = null; this.positional = new PositionalArguments(); this.named = new NamedArguments(); } Arguments.prototype.empty = function empty() { this.setup(null, true); return this; }; Arguments.prototype.setup = function setup(stack, synthetic) { this.stack = stack; var names = stack.fromTop(0); var namedCount = names.length; var positionalCount = stack.fromTop(namedCount + 1); var start = positionalCount + namedCount + 2; var positional = this.positional; positional.setup(stack, start, positionalCount); var named = this.named; named.setup(stack, namedCount, names, synthetic); }; Arguments.prototype.at = function at(pos) { return this.positional.at(pos); }; Arguments.prototype.get = function get(name) { return this.named.get(name); }; Arguments.prototype.capture = function capture() { return { tag: this.tag, length: this.length, positional: this.positional.capture(), named: this.named.capture() }; }; Arguments.prototype.clear = function clear() { var stack = this.stack, length = this.length; stack.pop(length + 2); }; _createClass(Arguments, [{ key: 'tag', get: function () { return combineTagged([this.positional, this.named]); } }, { key: 'length', get: function () { return this.positional.length + this.named.length; } }]); return Arguments; }(); var PositionalArguments = function () { function PositionalArguments() { _classCallCheck(this, PositionalArguments); this.length = 0; this.stack = null; this.start = 0; this._tag = null; this._references = null; } PositionalArguments.prototype.setup = function setup(stack, start, length) { this.stack = stack; this.start = start; this.length = length; this._tag = null; this._references = null; }; PositionalArguments.prototype.at = function at(position) { var start = this.start, length = this.length; if (position < 0 || position >= length) { return UNDEFINED_REFERENCE; } // stack: pos1, pos2, pos3, named1, named2 // start: 4 (top - 4) // // at(0) === pos1 === top - start // at(1) === pos2 === top - (start - 1) // at(2) === pos3 === top - (start - 2) var fromTop = start - position - 1; return this.stack.fromTop(fromTop); }; PositionalArguments.prototype.capture = function capture() { return new CapturedPositionalArguments(this.tag, this.references); }; _createClass(PositionalArguments, [{ key: 'tag', get: function () { var tag = this._tag; if (!tag) { tag = this._tag = combineTagged(this.references); } return tag; } }, { key: 'references', get: function () { var references = this._references; if (!references) { var length = this.length; references = this._references = new Array(length); for (var i = 0; i < length; i++) { references[i] = this.at(i); } } return references; } }]); return PositionalArguments; }(); var CapturedPositionalArguments = function () { function CapturedPositionalArguments(tag, references) { var length = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : references.length; _classCallCheck(this, CapturedPositionalArguments); this.tag = tag; this.references = references; this.length = length; } CapturedPositionalArguments.prototype.at = function at(position) { return this.references[position]; }; CapturedPositionalArguments.prototype.value = function value() { return this.references.map(this.valueOf); }; CapturedPositionalArguments.prototype.get = function get(name) { var references = this.references, length = this.length; if (name === 'length') { return PrimitiveReference.create(length); } else { var idx = parseInt(name, 10); if (idx < 0 || idx >= length) { return UNDEFINED_REFERENCE; } else { return references[idx]; } } }; CapturedPositionalArguments.prototype.valueOf = function valueOf(reference) { return reference.value(); }; return CapturedPositionalArguments; }(); var NamedArguments = function () { function NamedArguments() { _classCallCheck(this, NamedArguments); this.length = 0; this._tag = null; this._references = null; this._names = null; this._realNames = EMPTY_ARRAY; } NamedArguments.prototype.setup = function setup(stack, length, names, synthetic) { this.stack = stack; this.length = length; this._tag = null; this._references = null; if (synthetic) { this._names = names; this._realNames = EMPTY_ARRAY; } else { this._names = null; this._realNames = names; } }; NamedArguments.prototype.has = function has(name) { return this.names.indexOf(name) !== -1; }; NamedArguments.prototype.get = function get(name) { var names = this.names, length = this.length; var idx = names.indexOf(name); if (idx === -1) { return UNDEFINED_REFERENCE; } // stack: pos1, pos2, pos3, named1, named2 // start: 4 (top - 4) // namedDict: { named1: 1, named2: 0 }; // // get('named1') === named1 === top - (start - 1) // get('named2') === named2 === top - start var fromTop = length - idx; return this.stack.fromTop(fromTop); }; NamedArguments.prototype.capture = function capture() { return new CapturedNamedArguments(this.tag, this.names, this.references); }; NamedArguments.prototype.sliceName = function sliceName(name) { return name.slice(1); }; _createClass(NamedArguments, [{ key: 'tag', get: function () { return combineTagged(this.references); } }, { key: 'names', get: function () { var names = this._names; if (!names) { names = this._names = this._realNames.map(this.sliceName); } return names; } }, { key: 'references', get: function () { var references = this._references; if (!references) { var names = this.names, length = this.length; references = this._references = []; for (var i = 0; i < length; i++) { references[i] = this.get(names[i]); } } return references; } }]); return NamedArguments; }(); var CapturedNamedArguments = function () { function CapturedNamedArguments(tag, names, references) { _classCallCheck(this, CapturedNamedArguments); this.tag = tag; this.names = names; this.references = references; this.length = names.length; this._map = null; } CapturedNamedArguments.prototype.has = function has(name) { return this.names.indexOf(name) !== -1; }; CapturedNamedArguments.prototype.get = function get(name) { var names = this.names, references = this.references; var idx = names.indexOf(name); if (idx === -1) { return UNDEFINED_REFERENCE; } else { return references[idx]; } }; CapturedNamedArguments.prototype.value = function value() { var names = this.names, references = this.references; var out = dict(); for (var i = 0; i < names.length; i++) { var name = names[i]; out[name] = references[i].value(); } return out; }; _createClass(CapturedNamedArguments, [{ key: 'map', get: function () { var map = this._map; if (!map) { var names = this.names, references = this.references; map = this._map = dict(); for (var i = 0; i < names.length; i++) { var name = names[i]; map[name] = references[i]; } } return map; } }]); return CapturedNamedArguments; }(); export default new Arguments(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92bS9hcmd1bWVudHMuanMiXSwibmFtZXMiOlsiZGljdCIsIkVNUFRZX0FSUkFZIiwiY29tYmluZVRhZ2dlZCIsIlByaW1pdGl2ZVJlZmVyZW5jZSIsIlVOREVGSU5FRF9SRUZFUkVOQ0UiLCJBcmd1bWVudHMiLCJzdGFjayIsInBvc2l0aW9uYWwiLCJQb3NpdGlvbmFsQXJndW1lbnRzIiwibmFtZWQiLCJOYW1lZEFyZ3VtZW50cyIsImVtcHR5Iiwic2V0dXAiLCJzeW50aGV0aWMiLCJuYW1lcyIsImZyb21Ub3AiLCJuYW1lZENvdW50IiwibGVuZ3RoIiwicG9zaXRpb25hbENvdW50Iiwic3RhcnQiLCJhdCIsInBvcyIsImdldCIsIm5hbWUiLCJjYXB0dXJlIiwidGFnIiwiY2xlYXIiLCJwb3AiLCJfdGFnIiwiX3JlZmVyZW5jZXMiLCJwb3NpdGlvbiIsIkNhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyIsInJlZmVyZW5jZXMiLCJBcnJheSIsImkiLCJ2YWx1ZSIsIm1hcCIsInZhbHVlT2YiLCJjcmVhdGUiLCJpZHgiLCJwYXJzZUludCIsInJlZmVyZW5jZSIsIl9uYW1lcyIsIl9yZWFsTmFtZXMiLCJoYXMiLCJpbmRleE9mIiwiQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyIsInNsaWNlTmFtZSIsInNsaWNlIiwiX21hcCIsIm91dCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLFNBQVNBLElBQVQsRUFBZUMsV0FBZixRQUFrQyxlQUFsQztBQUNBLFNBQVNDLGFBQVQsUUFBOEIsb0JBQTlCO0FBQ0EsU0FBU0Msa0JBQVQsRUFBNkJDLG1CQUE3QixRQUF3RCxlQUF4RDtBQUNBLFdBQWFDLFNBQWI7QUFDSSx5QkFBYztBQUFBOztBQUNWLGFBQUtDLEtBQUwsR0FBYSxJQUFiO0FBQ0EsYUFBS0MsVUFBTCxHQUFrQixJQUFJQyxtQkFBSixFQUFsQjtBQUNBLGFBQUtDLEtBQUwsR0FBYSxJQUFJQyxjQUFKLEVBQWI7QUFDSDs7QUFMTCx3QkFNSUMsS0FOSixvQkFN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V0FBV08sR0FBWCxDQUFQO0FBQ0g7QUFDSixLOztxQ0FDREosSyxvQkFBUTtBQUFBLFlBQ0VyQixLQURGLEdBQ3dCLElBRHhCLENBQ0VBLEtBREY7QUFBQSxZQUNTa0IsVUFEVCxHQUN3QixJQUR4QixDQUNTQSxVQURUOztBQUVKLFlBQUlrQixNQUFNbEQsTUFBVjtBQUNBLGFBQUssSUFBSWtDLElBQUksQ0FBYixFQUFnQkEsSUFBSXBCLE1BQU1HLE1BQTFCLEVBQWtDaUIsR0FBbEMsRUFBdUM7QUFDbkMsZ0JBQUlYLE9BQU9ULE1BQU1vQixDQUFOLENBQVg7QUFDQWdCLGdCQUFJM0IsSUFBSixJQUFZUyxXQUFXRSxDQUFYLEVBQWNDLEtBQWQsRUFBWjtBQUNIO0FBQ0QsZUFBT2UsR0FBUDtBQUNILEs7Ozs7eUJBaENTO0FBQ04sZ0JBQUlkLE1BQU0sS0FBS2EsSUFBZjtBQUNBLGdCQUFJLENBQUNiLEdBQUwsRUFBVTtBQUFBLG9CQUNBdEIsS0FEQSxHQUNzQixJQUR0QixDQUNBQSxLQURBO0FBQUEsb0JBQ09rQixVQURQLEdBQ3NCLElBRHRCLENBQ09BLFVBRFA7O0FBRU5JLHNCQUFNLEtBQUthLElBQUwsR0FBWWpELE1BQWxCO0FBQ0EscUJBQUssSUFBSWtDLElBQUksQ0FBYixFQUFnQkEsSUFBSXBCLE1BQU1HLE1BQTFCLEVBQWtDaUIsR0FBbEMsRUFBdUM7QUFDbkMsd0JBQUlYLE9BQU9ULE1BQU1vQixDQUFOLENBQVg7QUFDQUUsd0JBQUliLElBQUosSUFBWVMsV0FBV0UsQ0FBWCxDQUFaO0FBQ0g7QUFDSjtBQUNELG1CQUFPRSxHQUFQO0FBQ0g7Ozs7OztBQXVCTCxlQUFlLElBQUkvQixTQUFKLEVBQWYiLCJmaWxlIjoibGliL3ZtL2FyZ3VtZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpY3QsIEVNUFRZX0FSUkFZIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBjb21iaW5lVGFnZ2VkIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IFByaW1pdGl2ZVJlZmVyZW5jZSwgVU5ERUZJTkVEX1JFRkVSRU5DRSB9IGZyb20gJy4uL3JlZmVyZW5jZXMnO1xuZXhwb3J0IGNsYXNzIEFyZ3VtZW50cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBudWxsO1xuICAgICAgICB0aGlzLnBvc2l0aW9uYWwgPSBuZXcgUG9zaXRpb25hbEFyZ3VtZW50cygpO1xuICAgICAgICB0aGlzLm5hbWVkID0gbmV3IE5hbWVkQXJndW1lbnRzKCk7XG4gICAgfVxuICAgIGVtcHR5KCkge1xuICAgICAgICB0aGlzLnNldHVwKG51bGwsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0dXAoc3RhY2ssIHN5bnRoZXRpYykge1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIGxldCBuYW1lcyA9IHN0YWNrLmZyb21Ub3AoMCk7XG4gICAgICAgIGxldCBuYW1lZENvdW50ID0gbmFtZXMubGVuZ3RoO1xuICAgICAgICBsZXQgcG9zaXRpb25hbENvdW50ID0gc3RhY2suZnJvbVRvcChuYW1lZENvdW50ICsgMSk7XG4gICAgICAgIGxldCBzdGFydCA9IHBvc2l0aW9uYWxDb3VudCArIG5hbWVkQ291bnQgKyAyO1xuICAgICAgICBsZXQgcG9zaXRpb25hbCA9IHRoaXMucG9zaXRpb25hbDtcbiAgICAgICAgcG9zaXRpb25hbC5zZXR1cChzdGFjaywgc3RhcnQsIHBvc2l0aW9uYWxDb3VudCk7XG4gICAgICAgIGxldCBuYW1lZCA9IHRoaXMubmFtZWQ7XG4gICAgICAgIG5hbWVkLnNldHVwKHN0YWNrLCBuYW1lZENvdW50LCBuYW1lcywgc3ludGhldGljKTtcbiAgICB9XG4gICAgZ2V0IHRhZygpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVUYWdnZWQoW3RoaXMucG9zaXRpb25hbCwgdGhpcy5uYW1lZF0pO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbmFsLmxlbmd0aCArIHRoaXMubmFtZWQubGVuZ3RoO1xuICAgIH1cbiAgICBhdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25hbC5hdChwb3MpO1xuICAgIH1cbiAgICBnZXQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lZC5nZXQobmFtZSk7XG4gICAgfVxuICAgIGNhcHR1cmUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWc6IHRoaXMudGFnLFxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aCxcbiAgICAgICAgICAgIHBvc2l0aW9uYWw6IHRoaXMucG9zaXRpb25hbC5jYXB0dXJlKCksXG4gICAgICAgICAgICBuYW1lZDogdGhpcy5uYW1lZC5jYXB0dXJlKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGxldCB7IHN0YWNrLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICAgIHN0YWNrLnBvcChsZW5ndGggKyAyKTtcbiAgICB9XG59XG5jbGFzcyBQb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnN0YWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGFydCA9IDA7XG4gICAgICAgIHRoaXMuX3RhZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgIH1cbiAgICBzZXR1cChzdGFjaywgc3RhcnQsIGxlbmd0aCkge1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuX3RhZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgIH1cbiAgICBnZXQgdGFnKCkge1xuICAgICAgICBsZXQgdGFnID0gdGhpcy5fdGFnO1xuICAgICAgICBpZiAoIXRhZykge1xuICAgICAgICAgICAgdGFnID0gdGhpcy5fdGFnID0gY29tYmluZVRhZ2dlZCh0aGlzLnJlZmVyZW5jZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIGF0KHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdGFjazogcG9zMSwgcG9zMiwgcG9zMywgbmFtZWQxLCBuYW1lZDJcbiAgICAgICAgLy8gc3RhcnQ6IDQgKHRvcCAtIDQpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGF0KDApID09PSBwb3MxID09PSB0b3AgLSBzdGFydFxuICAgICAgICAvLyBhdCgxKSA9PT0gcG9zMiA9PT0gdG9wIC0gKHN0YXJ0IC0gMSlcbiAgICAgICAgLy8gYXQoMikgPT09IHBvczMgPT09IHRvcCAtIChzdGFydCAtIDIpXG4gICAgICAgIGxldCBmcm9tVG9wID0gc3RhcnQgLSBwb3NpdGlvbiAtIDE7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrLmZyb21Ub3AoZnJvbVRvcCk7XG4gICAgfVxuICAgIGNhcHR1cmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzKHRoaXMudGFnLCB0aGlzLnJlZmVyZW5jZXMpO1xuICAgIH1cbiAgICBnZXQgcmVmZXJlbmNlcygpIHtcbiAgICAgICAgbGV0IHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzO1xuICAgICAgICBpZiAoIXJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIGxldCB7IGxlbmd0aCB9ID0gdGhpcztcbiAgICAgICAgICAgIHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlc1tpXSA9IHRoaXMuYXQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXM7XG4gICAgfVxufVxuY2xhc3MgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgICBjb25zdHJ1Y3Rvcih0YWcsIHJlZmVyZW5jZXMsIGxlbmd0aCA9IHJlZmVyZW5jZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB9XG4gICAgYXQocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlc1twb3NpdGlvbl07XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VzLm1hcCh0aGlzLnZhbHVlT2YpO1xuICAgIH1cbiAgICBnZXQobmFtZSkge1xuICAgICAgICBsZXQgeyByZWZlcmVuY2VzLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICAgIGlmIChuYW1lID09PSAnbGVuZ3RoJykge1xuICAgICAgICAgICAgcmV0dXJuIFByaW1pdGl2ZVJlZmVyZW5jZS5jcmVhdGUobGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChuYW1lLCAxMCk7XG4gICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzW2lkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFsdWVPZihyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZS52YWx1ZSgpO1xuICAgIH1cbn1cbmNsYXNzIE5hbWVkQXJndW1lbnRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl90YWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWFsTmFtZXMgPSBFTVBUWV9BUlJBWTtcbiAgICB9XG4gICAgc2V0dXAoc3RhY2ssIGxlbmd0aCwgbmFtZXMsIHN5bnRoZXRpYykge1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLl90YWcgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICAgICAgaWYgKHN5bnRoZXRpYykge1xuICAgICAgICAgICAgdGhpcy5fbmFtZXMgPSBuYW1lcztcbiAgICAgICAgICAgIHRoaXMuX3JlYWxOYW1lcyA9IEVNUFRZX0FSUkFZO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbmFtZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcmVhbE5hbWVzID0gbmFtZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRhZygpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVUYWdnZWQodGhpcy5yZWZlcmVuY2VzKTtcbiAgICB9XG4gICAgZ2V0IG5hbWVzKCkge1xuICAgICAgICBsZXQgbmFtZXMgPSB0aGlzLl9uYW1lcztcbiAgICAgICAgaWYgKCFuYW1lcykge1xuICAgICAgICAgICAgbmFtZXMgPSB0aGlzLl9uYW1lcyA9IHRoaXMuX3JlYWxOYW1lcy5tYXAodGhpcy5zbGljZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lcztcbiAgICB9XG4gICAgaGFzKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG4gICAgfVxuICAgIGdldChuYW1lKSB7XG4gICAgICAgIGxldCB7IG5hbWVzLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICAgIGxldCBpZHggPSBuYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3RhY2s6IHBvczEsIHBvczIsIHBvczMsIG5hbWVkMSwgbmFtZWQyXG4gICAgICAgIC8vIHN0YXJ0OiA0ICh0b3AgLSA0KVxuICAgICAgICAvLyBuYW1lZERpY3Q6IHsgbmFtZWQxOiAxLCBuYW1lZDI6IDAgfTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gZ2V0KCduYW1lZDEnKSA9PT0gbmFtZWQxID09PSB0b3AgLSAoc3RhcnQgLSAxKVxuICAgICAgICAvLyBnZXQoJ25hbWVkMicpID09PSBuYW1lZDIgPT09IHRvcCAtIHN0YXJ0XG4gICAgICAgIGxldCBmcm9tVG9wID0gbGVuZ3RoIC0gaWR4O1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFjay5mcm9tVG9wKGZyb21Ub3ApO1xuICAgIH1cbiAgICBjYXB0dXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IENhcHR1cmVkTmFtZWRBcmd1bWVudHModGhpcy50YWcsIHRoaXMubmFtZXMsIHRoaXMucmVmZXJlbmNlcyk7XG4gICAgfVxuICAgIGdldCByZWZlcmVuY2VzKCkge1xuICAgICAgICBsZXQgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXM7XG4gICAgICAgIGlmICghcmVmZXJlbmNlcykge1xuICAgICAgICAgICAgbGV0IHsgbmFtZXMsIGxlbmd0aCB9ID0gdGhpcztcbiAgICAgICAgICAgIHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlc1tpXSA9IHRoaXMuZ2V0KG5hbWVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgICB9XG4gICAgc2xpY2VOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUuc2xpY2UoMSk7XG4gICAgfVxufVxuY2xhc3MgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyB7XG4gICAgY29uc3RydWN0b3IodGFnLCBuYW1lcywgcmVmZXJlbmNlcykge1xuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgdGhpcy5uYW1lcyA9IG5hbWVzO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG5hbWVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fbWFwID0gbnVsbDtcbiAgICB9XG4gICAgZ2V0IG1hcCgpIHtcbiAgICAgICAgbGV0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgaWYgKCFtYXApIHtcbiAgICAgICAgICAgIGxldCB7IG5hbWVzLCByZWZlcmVuY2VzIH0gPSB0aGlzO1xuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwID0gZGljdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgICAgICAgICAgbWFwW25hbWVdID0gcmVmZXJlbmNlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICBoYXMobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgICB9XG4gICAgZ2V0KG5hbWUpIHtcbiAgICAgICAgbGV0IHsgbmFtZXMsIHJlZmVyZW5jZXMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBpZHggPSBuYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlc1tpZHhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhbHVlKCkge1xuICAgICAgICBsZXQgeyBuYW1lcywgcmVmZXJlbmNlcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IG91dCA9IGRpY3QoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICAgIG91dFtuYW1lXSA9IHJlZmVyZW5jZXNbaV0udmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IG5ldyBBcmd1bWVudHMoKTsiXX0=