ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
513 lines (434 loc) • 58.9 kB
JavaScript
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { CachedReference, combineTagged, isConst as isConstReference, isModified, ReferenceCache } from '@glimmer/reference';
import { APPEND_OPCODES, UpdatingOpcode } from '../../opcodes';
import { NULL_REFERENCE, PrimitiveReference } from '../../references';
import { Assert } from './vm';
APPEND_OPCODES.add(24 /* Text */, function (vm, _ref) {
var text = _ref.op1;
vm.elements().appendText(vm.constants.getString(text));
});
APPEND_OPCODES.add(25 /* Comment */, function (vm, _ref2) {
var text = _ref2.op1;
vm.elements().appendComment(vm.constants.getString(text));
});
APPEND_OPCODES.add(27 /* OpenElement */, function (vm, _ref3) {
var tag = _ref3.op1;
vm.elements().openElement(vm.constants.getString(tag));
});
APPEND_OPCODES.add(28 /* OpenElementWithOperations */, function (vm, _ref4) {
var tag = _ref4.op1;
var tagName = vm.constants.getString(tag);
var operations = vm.stack.pop();
vm.elements().openElement(tagName, operations);
});
APPEND_OPCODES.add(29 /* OpenDynamicElement */, function (vm) {
var operations = vm.stack.pop();
var tagName = vm.stack.pop().value();
vm.elements().openElement(tagName, operations);
});
APPEND_OPCODES.add(36 /* PushRemoteElement */, function (vm) {
var elementRef = vm.stack.pop();
var nextSiblingRef = vm.stack.pop();
var element = void 0;
var nextSibling = void 0;
if (isConstReference(elementRef)) {
element = elementRef.value();
} else {
var cache = new ReferenceCache(elementRef);
element = cache.peek();
vm.updateWith(new Assert(cache));
}
if (isConstReference(nextSiblingRef)) {
nextSibling = nextSiblingRef.value();
} else {
var _cache = new ReferenceCache(nextSiblingRef);
nextSibling = _cache.peek();
vm.updateWith(new Assert(_cache));
}
vm.elements().pushRemoteElement(element, nextSibling);
});
APPEND_OPCODES.add(37 /* PopRemoteElement */, function (vm) {
return vm.elements().popRemoteElement();
});
var ClassList = function () {
function ClassList() {
_classCallCheck(this, ClassList);
this.list = null;
this.isConst = true;
}
ClassList.prototype.append = function append(reference) {
var list = this.list,
isConst = this.isConst;
if (list === null) list = this.list = [];
list.push(reference);
this.isConst = isConst && isConstReference(reference);
};
ClassList.prototype.toReference = function toReference() {
var list = this.list,
isConst = this.isConst;
if (!list) return NULL_REFERENCE;
if (isConst) return PrimitiveReference.create(toClassName(list));
return new ClassListReference(list);
};
return ClassList;
}();
var ClassListReference = function (_CachedReference) {
_inherits(ClassListReference, _CachedReference);
function ClassListReference(list) {
_classCallCheck(this, ClassListReference);
var _this = _possibleConstructorReturn(this, _CachedReference.call(this));
_this.list = [];
_this.tag = combineTagged(list);
_this.list = list;
return _this;
}
ClassListReference.prototype.compute = function compute() {
return toClassName(this.list);
};
return ClassListReference;
}(CachedReference);
function toClassName(list) {
var ret = [];
for (var i = 0; i < list.length; i++) {
var value = list[i].value();
if (value !== false && value !== null && value !== undefined) ret.push(value);
}
return ret.length === 0 ? null : ret.join(' ');
}
export var SimpleElementOperations = function () {
function SimpleElementOperations(env) {
_classCallCheck(this, SimpleElementOperations);
this.env = env;
this.opcodes = null;
this.classList = null;
}
SimpleElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) {
if (name === 'class') {
this.addClass(PrimitiveReference.create(value));
} else {
this.env.getAppendOperations().setAttribute(element, name, value);
}
};
SimpleElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) {
this.env.getAppendOperations().setAttribute(element, name, value, namespace);
};
SimpleElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference, isTrusting) {
if (name === 'class') {
this.addClass(reference);
} else {
var attributeManager = this.env.attributeFor(element, name, isTrusting);
var attribute = new DynamicAttribute(element, attributeManager, name, reference);
this.addAttribute(attribute);
}
};
SimpleElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference, isTrusting) {
var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace);
var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference, namespace);
this.addAttribute(nsAttribute);
};
SimpleElementOperations.prototype.flush = function flush(element, vm) {
var env = vm.env;
var opcodes = this.opcodes,
classList = this.classList;
for (var i = 0; opcodes && i < opcodes.length; i++) {
vm.updateWith(opcodes[i]);
}
if (classList) {
var attributeManager = env.attributeFor(element, 'class', false);
var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference());
var opcode = attribute.flush(env);
if (opcode) {
vm.updateWith(opcode);
}
}
this.opcodes = null;
this.classList = null;
};
SimpleElementOperations.prototype.addClass = function addClass(reference) {
var classList = this.classList;
if (!classList) {
classList = this.classList = new ClassList();
}
classList.append(reference);
};
SimpleElementOperations.prototype.addAttribute = function addAttribute(attribute) {
var opcode = attribute.flush(this.env);
if (opcode) {
var opcodes = this.opcodes;
if (!opcodes) {
opcodes = this.opcodes = [];
}
opcodes.push(opcode);
}
};
return SimpleElementOperations;
}();
export var ComponentElementOperations = function () {
function ComponentElementOperations(env) {
_classCallCheck(this, ComponentElementOperations);
this.env = env;
this.attributeNames = null;
this.attributes = null;
this.classList = null;
}
ComponentElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) {
if (name === 'class') {
this.addClass(PrimitiveReference.create(value));
} else if (this.shouldAddAttribute(name)) {
this.addAttribute(name, new StaticAttribute(element, name, value));
}
};
ComponentElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) {
if (this.shouldAddAttribute(name)) {
this.addAttribute(name, new StaticAttribute(element, name, value, namespace));
}
};
ComponentElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference, isTrusting) {
if (name === 'class') {
this.addClass(reference);
} else if (this.shouldAddAttribute(name)) {
var attributeManager = this.env.attributeFor(element, name, isTrusting);
var attribute = new DynamicAttribute(element, attributeManager, name, reference);
this.addAttribute(name, attribute);
}
};
ComponentElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference, isTrusting) {
if (this.shouldAddAttribute(name)) {
var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace);
var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference, namespace);
this.addAttribute(name, nsAttribute);
}
};
ComponentElementOperations.prototype.flush = function flush(element, vm) {
var env = this.env;
var attributes = this.attributes,
classList = this.classList;
for (var i = 0; attributes && i < attributes.length; i++) {
var opcode = attributes[i].flush(env);
if (opcode) {
vm.updateWith(opcode);
}
}
if (classList) {
var attributeManager = env.attributeFor(element, 'class', false);
var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference());
var _opcode = attribute.flush(env);
if (_opcode) {
vm.updateWith(_opcode);
}
}
};
ComponentElementOperations.prototype.shouldAddAttribute = function shouldAddAttribute(name) {
return !this.attributeNames || this.attributeNames.indexOf(name) === -1;
};
ComponentElementOperations.prototype.addClass = function addClass(reference) {
var classList = this.classList;
if (!classList) {
classList = this.classList = new ClassList();
}
classList.append(reference);
};
ComponentElementOperations.prototype.addAttribute = function addAttribute(name, attribute) {
var attributeNames = this.attributeNames,
attributes = this.attributes;
if (!attributeNames) {
attributeNames = this.attributeNames = [];
attributes = this.attributes = [];
}
attributeNames.push(name);
attributes.push(attribute);
};
return ComponentElementOperations;
}();
APPEND_OPCODES.add(33 /* FlushElement */, function (vm) {
var stack = vm.elements();
var action = 'FlushElementOpcode#evaluate';
stack.expectOperations(action).flush(stack.expectConstructing(action), vm);
stack.flushElement();
});
APPEND_OPCODES.add(34 /* CloseElement */, function (vm) {
return vm.elements().closeElement();
});
APPEND_OPCODES.add(30 /* StaticAttr */, function (vm, _ref5) {
var _name = _ref5.op1,
_value = _ref5.op2,
_namespace = _ref5.op3;
var name = vm.constants.getString(_name);
var value = vm.constants.getString(_value);
if (_namespace) {
var namespace = vm.constants.getString(_namespace);
vm.elements().setStaticAttributeNS(namespace, name, value);
} else {
vm.elements().setStaticAttribute(name, value);
}
});
APPEND_OPCODES.add(35 /* Modifier */, function (vm, _ref6) {
var _manager = _ref6.op1;
var manager = vm.constants.getOther(_manager);
var stack = vm.stack;
var args = stack.pop();
var tag = args.tag;
var _vm$elements = vm.elements(),
element = _vm$elements.constructing,
updateOperations = _vm$elements.updateOperations;
var dynamicScope = vm.dynamicScope();
var modifier = manager.create(element, args, dynamicScope, updateOperations);
args.clear();
vm.env.scheduleInstallModifier(modifier, manager);
var destructor = manager.getDestructor(modifier);
if (destructor) {
vm.newDestroyable(destructor);
}
vm.updateWith(new UpdateModifierOpcode(tag, manager, modifier));
});
export var UpdateModifierOpcode = function (_UpdatingOpcode) {
_inherits(UpdateModifierOpcode, _UpdatingOpcode);
function UpdateModifierOpcode(tag, manager, modifier) {
_classCallCheck(this, UpdateModifierOpcode);
var _this2 = _possibleConstructorReturn(this, _UpdatingOpcode.call(this));
_this2.tag = tag;
_this2.manager = manager;
_this2.modifier = modifier;
_this2.type = 'update-modifier';
_this2.lastUpdated = tag.value();
return _this2;
}
UpdateModifierOpcode.prototype.evaluate = function evaluate(vm) {
var manager = this.manager,
modifier = this.modifier,
tag = this.tag,
lastUpdated = this.lastUpdated;
if (!tag.validate(lastUpdated)) {
vm.env.scheduleUpdateModifier(modifier, manager);
this.lastUpdated = tag.value();
}
};
UpdateModifierOpcode.prototype.toJSON = function toJSON() {
return {
guid: this._guid,
type: this.type
};
};
return UpdateModifierOpcode;
}(UpdatingOpcode);
export var StaticAttribute = function () {
function StaticAttribute(element, name, value, namespace) {
_classCallCheck(this, StaticAttribute);
this.element = element;
this.name = name;
this.value = value;
this.namespace = namespace;
}
StaticAttribute.prototype.flush = function flush(env) {
env.getAppendOperations().setAttribute(this.element, this.name, this.value, this.namespace);
return null;
};
return StaticAttribute;
}();
export var DynamicAttribute = function () {
function DynamicAttribute(element, attributeManager, name, reference, namespace) {
_classCallCheck(this, DynamicAttribute);
this.element = element;
this.attributeManager = attributeManager;
this.name = name;
this.reference = reference;
this.namespace = namespace;
this.cache = null;
this.tag = reference.tag;
}
DynamicAttribute.prototype.patch = function patch(env) {
var element = this.element,
cache = this.cache;
var value = cache.revalidate();
if (isModified(value)) {
this.attributeManager.updateAttribute(env, element, value, this.namespace);
}
};
DynamicAttribute.prototype.flush = function flush(env) {
var reference = this.reference,
element = this.element;
if (isConstReference(reference)) {
var value = reference.value();
this.attributeManager.setAttribute(env, element, value, this.namespace);
return null;
} else {
var cache = this.cache = new ReferenceCache(reference);
var _value2 = cache.peek();
this.attributeManager.setAttribute(env, element, _value2, this.namespace);
return new PatchElementOpcode(this);
}
};
DynamicAttribute.prototype.toJSON = function toJSON() {
var element = this.element,
namespace = this.namespace,
name = this.name,
cache = this.cache;
var formattedElement = formatElement(element);
var lastValue = cache.peek();
if (namespace) {
return {
element: formattedElement,
lastValue: lastValue,
name: name,
namespace: namespace,
type: 'attribute'
};
}
return {
element: formattedElement,
lastValue: lastValue,
name: name,
namespace: namespace === undefined ? null : namespace,
type: 'attribute'
};
};
return DynamicAttribute;
}();
function formatElement(element) {
return JSON.stringify('<' + element.tagName.toLowerCase() + ' />');
}
APPEND_OPCODES.add(32 /* DynamicAttrNS */, function (vm, _ref7) {
var _name = _ref7.op1,
_namespace = _ref7.op2,
trusting = _ref7.op3;
var name = vm.constants.getString(_name);
var namespace = vm.constants.getString(_namespace);
var reference = vm.stack.pop();
vm.elements().setDynamicAttributeNS(namespace, name, reference, !!trusting);
});
APPEND_OPCODES.add(31 /* DynamicAttr */, function (vm, _ref8) {
var _name = _ref8.op1,
trusting = _ref8.op2;
var name = vm.constants.getString(_name);
var reference = vm.stack.pop();
vm.elements().setDynamicAttribute(name, reference, !!trusting);
});
export var PatchElementOpcode = function (_UpdatingOpcode2) {
_inherits(PatchElementOpcode, _UpdatingOpcode2);
function PatchElementOpcode(operation) {
_classCallCheck(this, PatchElementOpcode);
var _this3 = _possibleConstructorReturn(this, _UpdatingOpcode2.call(this));
_this3.type = 'patch-element';
_this3.tag = operation.tag;
_this3.operation = operation;
return _this3;
}
PatchElementOpcode.prototype.evaluate = function evaluate(vm) {
this.operation.patch(vm.env);
};
PatchElementOpcode.prototype.toJSON = function toJSON() {
var _guid = this._guid,
type = this.type,
operation = this.operation;
return {
details: operation.toJSON(),
guid: _guid,
type: type
};
};
return PatchElementOpcode;
}(UpdatingOpcode);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2RvbS5qcyJdLCJuYW1lcyI6WyJDYWNoZWRSZWZlcmVuY2UiLCJjb21iaW5lVGFnZ2VkIiwiaXNDb25zdCIsImlzQ29uc3RSZWZlcmVuY2UiLCJpc01vZGlmaWVkIiwiUmVmZXJlbmNlQ2FjaGUiLCJBUFBFTkRfT1BDT0RFUyIsIlVwZGF0aW5nT3Bjb2RlIiwiTlVMTF9SRUZFUkVOQ0UiLCJQcmltaXRpdmVSZWZlcmVuY2UiLCJBc3NlcnQiLCJhZGQiLCJ2bSIsInRleHQiLCJvcDEiLCJlbGVtZW50cyIsImFwcGVuZFRleHQiLCJjb25zdGFudHMiLCJnZXRTdHJpbmciLCJhcHBlbmRDb21tZW50IiwidGFnIiwib3BlbkVsZW1lbnQiLCJ0YWdOYW1lIiwib3BlcmF0aW9ucyIsInN0YWNrIiwicG9wIiwidmFsdWUiLCJlbGVtZW50UmVmIiwibmV4dFNpYmxpbmdSZWYiLCJlbGVtZW50IiwibmV4dFNpYmxpbmciLCJjYWNoZSIsInBlZWsiLCJ1cGRhdGVXaXRoIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiQ2xhc3NMaXN0IiwibGlzdCIsImFwcGVuZCIsInJlZmVyZW5jZSIsInB1c2giLCJ0b1JlZmVyZW5jZSIsImNyZWF0ZSIsInRvQ2xhc3NOYW1lIiwiQ2xhc3NMaXN0UmVmZXJlbmNlIiwiY29tcHV0ZSIsInJldCIsImkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwiU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMiLCJlbnYiLCJvcGNvZGVzIiwiY2xhc3NMaXN0IiwiYWRkU3RhdGljQXR0cmlidXRlIiwibmFtZSIsImFkZENsYXNzIiwiZ2V0QXBwZW5kT3BlcmF0aW9ucyIsInNldEF0dHJpYnV0ZSIsImFkZFN0YXRpY0F0dHJpYnV0ZU5TIiwibmFtZXNwYWNlIiwiYWRkRHluYW1pY0F0dHJpYnV0ZSIsImlzVHJ1c3RpbmciLCJhdHRyaWJ1dGVNYW5hZ2VyIiwiYXR0cmlidXRlRm9yIiwiYXR0cmlidXRlIiwiRHluYW1pY0F0dHJpYnV0ZSIsImFkZEF0dHJpYnV0ZSIsImFkZER5bmFtaWNBdHRyaWJ1dGVOUyIsIm5zQXR0cmlidXRlIiwiZmx1c2giLCJvcGNvZGUiLCJDb21wb25lbnRFbGVtZW50T3BlcmF0aW9ucyIsImF0dHJpYnV0ZU5hbWVzIiwiYXR0cmlidXRlcyIsInNob3VsZEFkZEF0dHJpYnV0ZSIsIlN0YXRpY0F0dHJpYnV0ZSIsImluZGV4T2YiLCJhY3Rpb24iLCJleHBlY3RPcGVyYXRpb25zIiwiZXhwZWN0Q29uc3RydWN0aW5nIiwiZmx1c2hFbGVtZW50IiwiY2xvc2VFbGVtZW50IiwiX25hbWUiLCJfdmFsdWUiLCJvcDIiLCJfbmFtZXNwYWNlIiwib3AzIiwic2V0U3RhdGljQXR0cmlidXRlTlMiLCJzZXRTdGF0aWNBdHRyaWJ1dGUiLCJfbWFuYWdlciIsIm1hbmFnZXIiLCJnZXRPdGhlciIsImFyZ3MiLCJjb25zdHJ1Y3RpbmciLCJ1cGRhdGVPcGVyYXRpb25zIiwiZHluYW1pY1Njb3BlIiwibW9kaWZpZXIiLCJjbGVhciIsInNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyIiwiZGVzdHJ1Y3RvciIsImdldERlc3RydWN0b3IiLCJuZXdEZXN0cm95YWJsZSIsIlVwZGF0ZU1vZGlmaWVyT3Bjb2RlIiwidHlwZSIsImxhc3RVcGRhdGVkIiwiZXZhbHVhdGUiLCJ2YWxpZGF0ZSIsInNjaGVkdWxlVXBkYXRlTW9kaWZpZXIiLCJ0b0pTT04iLCJndWlkIiwiX2d1aWQiLCJwYXRjaCIsInJldmFsaWRhdGUiLCJ1cGRhdGVBdHRyaWJ1dGUiLCJQYXRjaEVsZW1lbnRPcGNvZGUiLCJmb3JtYXR0ZWRFbGVtZW50IiwiZm9ybWF0RWxlbWVudCIsImxhc3RWYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b0xvd2VyQ2FzZSIsInRydXN0aW5nIiwic2V0RHluYW1pY0F0dHJpYnV0ZU5TIiwic2V0RHluYW1pY0F0dHJpYnV0ZSIsIm9wZXJhdGlvbiIsImRldGFpbHMiXSwibWFwcGluZ3MiOiI7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NUIsQ0FDQ0EsS0FERDtBQUFBLFlBQ1FQLElBRFIsR0FDNEIsSUFENUIsQ0FDUUEsSUFEUjtBQUFBLFlBQ2NxQixTQURkLEdBQzRCLElBRDVCLENBQ2NBLFNBRGQ7O0FBRUwsZUFBTztBQUNIQyxxQkFBU0QsVUFBVWhCLE1BQVYsRUFETjtBQUVIQyxrQkFBTUMsS0FGSDtBQUdIUDtBQUhHLFNBQVA7QUFLSCxLQWpCTDs7QUFBQTtBQUFBLEVBQXdDbEcsY0FBeEMiLCJmaWxlIjoibGliL2NvbXBpbGVkL29wY29kZXMvZG9tLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVkUmVmZXJlbmNlLCBjb21iaW5lVGFnZ2VkLCBpc0NvbnN0IGFzIGlzQ29uc3RSZWZlcmVuY2UsIGlzTW9kaWZpZWQsIFJlZmVyZW5jZUNhY2hlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGV4cGVjdCwgdW53cmFwIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUywgVXBkYXRpbmdPcGNvZGUgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IE5VTExfUkVGRVJFTkNFLCBQcmltaXRpdmVSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9yZWZlcmVuY2VzJztcbmltcG9ydCB7IEFzc2VydCB9IGZyb20gJy4vdm0nO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI0IC8qIFRleHQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kVGV4dCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI1IC8qIENvbW1lbnQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kQ29tbWVudCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI3IC8qIE9wZW5FbGVtZW50ICovLCAodm0sIHsgb3AxOiB0YWcgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodm0uY29uc3RhbnRzLmdldFN0cmluZyh0YWcpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI4IC8qIE9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMgKi8sICh2bSwgeyBvcDE6IHRhZyB9KSA9PiB7XG4gICAgbGV0IHRhZ05hbWUgPSB2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRhZyk7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICB2bS5lbGVtZW50cygpLm9wZW5FbGVtZW50KHRhZ05hbWUsIG9wZXJhdGlvbnMpO1xufSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMjkgLyogT3BlbkR5bmFtaWNFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgdGFnTmFtZSA9IHZtLnN0YWNrLnBvcCgpLnZhbHVlKCk7XG4gICAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh0YWdOYW1lLCBvcGVyYXRpb25zKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDM2IC8qIFB1c2hSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IGVsZW1lbnRSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgbmV4dFNpYmxpbmdSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgZWxlbWVudDtcbiAgICBsZXQgbmV4dFNpYmxpbmc7XG4gICAgaWYgKGlzQ29uc3RSZWZlcmVuY2UoZWxlbWVudFJlZikpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnRSZWYudmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY2FjaGUgPSBuZXcgUmVmZXJlbmNlQ2FjaGUoZWxlbWVudFJlZik7XG4gICAgICAgIGVsZW1lbnQgPSBjYWNoZS5wZWVrKCk7XG4gICAgICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChjYWNoZSkpO1xuICAgIH1cbiAgICBpZiAoaXNDb25zdFJlZmVyZW5jZShuZXh0U2libGluZ1JlZikpIHtcbiAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZ1JlZi52YWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjYWNoZSA9IG5ldyBSZWZlcmVuY2VDYWNoZShuZXh0U2libGluZ1JlZik7XG4gICAgICAgIG5leHRTaWJsaW5nID0gY2FjaGUucGVlaygpO1xuICAgICAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQoY2FjaGUpKTtcbiAgICB9XG4gICAgdm0uZWxlbWVudHMoKS5wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBuZXh0U2libGluZyk7XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCgzNyAvKiBQb3BSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB2bS5lbGVtZW50cygpLnBvcFJlbW90ZUVsZW1lbnQoKSk7XG5jbGFzcyBDbGFzc0xpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSB0cnVlO1xuICAgIH1cbiAgICBhcHBlbmQocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmIChsaXN0ID09PSBudWxsKSBsaXN0ID0gdGhpcy5saXN0ID0gW107XG4gICAgICAgIGxpc3QucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0ICYmIGlzQ29uc3RSZWZlcmVuY2UocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgdG9SZWZlcmVuY2UoKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmICghbGlzdCkgcmV0dXJuIE5VTExfUkVGRVJFTkNFO1xuICAgICAgICBpZiAoaXNDb25zdCkgcmV0dXJuIFByaW1pdGl2ZVJlZmVyZW5jZS5jcmVhdGUodG9DbGFzc05hbWUobGlzdCkpO1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdFJlZmVyZW5jZShsaXN0KTtcbiAgICB9XG59XG5jbGFzcyBDbGFzc0xpc3RSZWZlcmVuY2UgZXh0ZW5kcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKGxpc3QpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgICAgIHRoaXMudGFnID0gY29tYmluZVRhZ2dlZChsaXN0KTtcbiAgICAgICAgdGhpcy5saXN0ID0gbGlzdDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRvQ2xhc3NOYW1lKHRoaXMubGlzdCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdG9DbGFzc05hbWUobGlzdCkge1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbGlzdFtpXS52YWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHJldC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0LmpvaW4oJyAnKTtcbn1cbmV4cG9ydCBjbGFzcyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoZW52KSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLm9wY29kZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCkuc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKS5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGFkZER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENsYXNzKHJlZmVyZW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlTWFuYWdlciA9IHRoaXMuZW52LmF0dHJpYnV0ZUZvcihlbGVtZW50LCBuYW1lLCBpc1RydXN0aW5nKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCBuYW1lLCByZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGREeW5hbWljQXR0cmlidXRlTlMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgbGV0IG5zQXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlLCBuYW1lc3BhY2UpO1xuICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZShuc0F0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGZsdXNoKGVsZW1lbnQsIHZtKSB7XG4gICAgICAgIGxldCB7IGVudiB9ID0gdm07XG4gICAgICAgIGxldCB7IG9wY29kZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IG9wY29kZXMgJiYgaSA8IG9wY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgob3Bjb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSBlbnYuYXR0cmlidXRlRm9yKGVsZW1lbnQsICdjbGFzcycsIGZhbHNlKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCAnY2xhc3MnLCBjbGFzc0xpc3QudG9SZWZlcmVuY2UoKSk7XG4gICAgICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKGVudik7XG4gICAgICAgICAgICBpZiAob3Bjb2RlKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aChvcGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0ID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ2xhc3MocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hcHBlbmQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSkge1xuICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKHRoaXMuZW52KTtcbiAgICAgICAgaWYgKG9wY29kZSkge1xuICAgICAgICAgICAgbGV0IHsgb3Bjb2RlcyB9ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghb3Bjb2Rlcykge1xuICAgICAgICAgICAgICAgIG9wY29kZXMgPSB0aGlzLm9wY29kZXMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wY29kZXMucHVzaChvcGNvZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEVsZW1lbnRPcGVyYXRpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRBZGRBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5ldyBTdGF0aWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUobmFtZSwgbmV3IFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3MocmVmZXJlbmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZyk7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZU5TKGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIGxldCBuc0F0dHJpYnV0ZSA9IG5ldyBEeW5hbWljQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU1hbmFnZXIsIG5hbWUsIHJlZmVyZW5jZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5zQXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaChlbGVtZW50LCB2bSkge1xuICAgICAgICBsZXQgeyBlbnYgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGF0dHJpYnV0ZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGF0dHJpYnV0ZXMgJiYgaSA8IGF0dHJpY