ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
541 lines (457 loc) • 57.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PatchElementOpcode = exports.DynamicAttribute = exports.StaticAttribute = exports.UpdateModifierOpcode = exports.ComponentElementOperations = exports.SimpleElementOperations = undefined;
var _reference = require("@glimmer/reference");
var _opcodes = require("../../opcodes");
var _references = require("../../references");
var _vm = require("./vm");
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");
}
}
_opcodes.APPEND_OPCODES.add(24 /* Text */, function (vm, _ref) {
var text = _ref.op1;
vm.elements().appendText(vm.constants.getString(text));
});
_opcodes.APPEND_OPCODES.add(25 /* Comment */, function (vm, _ref2) {
var text = _ref2.op1;
vm.elements().appendComment(vm.constants.getString(text));
});
_opcodes.APPEND_OPCODES.add(27 /* OpenElement */, function (vm, _ref3) {
var tag = _ref3.op1;
vm.elements().openElement(vm.constants.getString(tag));
});
_opcodes.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);
});
_opcodes.APPEND_OPCODES.add(29 /* OpenDynamicElement */, function (vm) {
var operations = vm.stack.pop();
var tagName = vm.stack.pop().value();
vm.elements().openElement(tagName, operations);
});
_opcodes.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 ((0, _reference.isConst)(elementRef)) {
element = elementRef.value();
} else {
var cache = new _reference.ReferenceCache(elementRef);
element = cache.peek();
vm.updateWith(new _vm.Assert(cache));
}
if ((0, _reference.isConst)(nextSiblingRef)) {
nextSibling = nextSiblingRef.value();
} else {
var _cache = new _reference.ReferenceCache(nextSiblingRef);
nextSibling = _cache.peek();
vm.updateWith(new _vm.Assert(_cache));
}
vm.elements().pushRemoteElement(element, nextSibling);
});
_opcodes.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 && (0, _reference.isConst)(reference);
};
ClassList.prototype.toReference = function toReference() {
var list = this.list,
isConst = this.isConst;
if (!list) return _references.NULL_REFERENCE;
if (isConst) return _references.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 = (0, _reference.combineTagged)(list);
_this.list = list;
return _this;
}
ClassListReference.prototype.compute = function compute() {
return toClassName(this.list);
};
return ClassListReference;
}(_reference.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(' ');
}
var SimpleElementOperations = exports.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(_references.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;
}();
var ComponentElementOperations = exports.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(_references.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;
}();
_opcodes.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();
});
_opcodes.APPEND_OPCODES.add(34 /* CloseElement */, function (vm) {
return vm.elements().closeElement();
});
_opcodes.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);
}
});
_opcodes.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));
});
var UpdateModifierOpcode = exports.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;
}(_opcodes.UpdatingOpcode);
var StaticAttribute = exports.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;
}();
var DynamicAttribute = exports.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 ((0, _reference.isModified)(value)) {
this.attributeManager.updateAttribute(env, element, value, this.namespace);
}
};
DynamicAttribute.prototype.flush = function flush(env) {
var reference = this.reference,
element = this.element;
if ((0, _reference.isConst)(reference)) {
var value = reference.value();
this.attributeManager.setAttribute(env, element, value, this.namespace);
return null;
} else {
var cache = this.cache = new _reference.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() + ' />');
}
_opcodes.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);
});
_opcodes.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);
});
var PatchElementOpcode = exports.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;
}(_opcodes.UpdatingOpcode);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2RvbS5qcyJdLCJuYW1lcyI6WyJDYWNoZWRSZWZlcmVuY2UiLCJjb21iaW5lVGFnZ2VkIiwiaXNDb25zdCIsImlzQ29uc3RSZWZlcmVuY2UiLCJpc01vZGlmaWVkIiwiUmVmZXJlbmNlQ2FjaGUiLCJBUFBFTkRfT1BDT0RFUyIsIlVwZGF0aW5nT3Bjb2RlIiwiTlVMTF9SRUZFUkVOQ0UiLCJQcmltaXRpdmVSZWZlcmVuY2UiLCJBc3NlcnQiLCJhZGQiLCJ2bSIsInRleHQiLCJvcDEiLCJlbGVtZW50cyIsImFwcGVuZFRleHQiLCJjb25zdGFudHMiLCJnZXRTdHJpbmciLCJhcHBlbmRDb21tZW50IiwidGFnIiwib3BlbkVsZW1lbnQiLCJ0YWdOYW1lIiwib3BlcmF0aW9ucyIsInN0YWNrIiwicG9wIiwidmFsdWUiLCJlbGVtZW50UmVmIiwibmV4dFNpYmxpbmdSZWYiLCJlbGVtZW50IiwibmV4dFNpYmxpbmciLCJjYWNoZSIsInBlZWsiLCJ1cGRhdGVXaXRoIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiQ2xhc3NMaXN0IiwibGlzdCIsImFwcGVuZCIsInJlZmVyZW5jZSIsInB1c2giLCJ0b1JlZmVyZW5jZSIsImNyZWF0ZSIsInRvQ2xhc3NOYW1lIiwiQ2xhc3NMaXN0UmVmZXJlbmNlIiwiY29tcHV0ZSIsInJldCIsImkiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwiU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMiLCJlbnYiLCJvcGNvZGVzIiwiY2xhc3NMaXN0IiwiYWRkU3RhdGljQXR0cmlidXRlIiwibmFtZSIsImFkZENsYXNzIiwiZ2V0QXBwZW5kT3BlcmF0aW9ucyIsInNldEF0dHJpYnV0ZSIsImFkZFN0YXRpY0F0dHJpYnV0ZU5TIiwibmFtZXNwYWNlIiwiYWRkRHluYW1pY0F0dHJpYnV0ZSIsImlzVHJ1c3RpbmciLCJhdHRyaWJ1dGVNYW5hZ2VyIiwiYXR0cmlidXRlRm9yIiwiYXR0cmlidXRlIiwiRHluYW1pY0F0dHJpYnV0ZSIsImFkZEF0dHJpYnV0ZSIsImFkZER5bmFtaWNBdHRyaWJ1dGVOUyIsIm5zQXR0cmlidXRlIiwiZmx1c2giLCJvcGNvZGUiLCJDb21wb25lbnRFbGVtZW50T3BlcmF0aW9ucyIsImF0dHJpYnV0ZU5hbWVzIiwiYXR0cmlidXRlcyIsInNob3VsZEFkZEF0dHJpYnV0ZSIsIlN0YXRpY0F0dHJpYnV0ZSIsImluZGV4T2YiLCJhY3Rpb24iLCJleHBlY3RPcGVyYXRpb25zIiwiZXhwZWN0Q29uc3RydWN0aW5nIiwiZmx1c2hFbGVtZW50IiwiY2xvc2VFbGVtZW50IiwiX25hbWUiLCJfdmFsdWUiLCJvcDIiLCJfbmFtZXNwYWNlIiwib3AzIiwic2V0U3RhdGljQXR0cmlidXRlTlMiLCJzZXRTdGF0aWNBdHRyaWJ1dGUiLCJfbWFuYWdlciIsIm1hbmFnZXIiLCJnZXRPdGhlciIsImFyZ3MiLCJjb25zdHJ1Y3RpbmciLCJ1cGRhdGVPcGVyYXRpb25zIiwiZHluYW1pY1Njb3BlIiwibW9kaWZpZXIiLCJjbGVhciIsInNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyIiwiZGVzdHJ1Y3RvciIsImdldERlc3RydWN0b3IiLCJuZXdEZXN0cm95YWJsZSIsIlVwZGF0ZU1vZGlmaWVyT3Bjb2RlIiwidHlwZSIsImxhc3RVcGRhdGVkIiwiZXZhbHVhdGUiLCJ2YWxpZGF0ZSIsInNjaGVkdWxlVXBkYXRlTW9kaWZpZXIiLCJ0b0pTT04iLCJndWlkIiwiX2d1aWQiLCJwYXRjaCIsInJldmFsaWRhdGUiLCJ1cGRhdGVBdHRyaWJ1dGUiLCJQYXRjaEVsZW1lbnRPcGNvZGUiLCJmb3JtYXR0ZWRFbGVtZW50IiwiZm9ybWF0RWxlbWVudCIsImxhc3RWYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b0xvd2VyQ2FzZSIsInRydXN0aW5nIiwic2V0RHluYW1pY0F0dHJpYnV0ZU5TIiwic2V0RHluYW1pY0F0dHJpYnV0ZSIsIm9wZXJhdGlvbiIsImRldGFpbHMiXSwibWFwcGluZ3MiOiI7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QUFBZSxNQUFNLEdBQXJCLEFBQXdCLEFBQzNCO0FBVEw7O2lDQUFBLEFBVUksMkJBQVM7WUFBQSxBQUNDLFFBREQsQUFDNEIsS0FENUIsQUFDQztZQURELEFBQ1EsT0FEUixBQUM0QixLQUQ1QixBQUNRO1lBRFIsQUFDYyxZQURkLEFBQzRCLEtBRDVCLEFBQ2MsQUFDbkI7OztxQkFDYSxVQUROLEFBQ00sQUFBVSxBQUNuQjtrQkFGRyxBQUVHLEFBQ047a0JBSEosQUFBTyxBQUtWO0FBTFUsQUFDSDtBQWJaOztXQUFBO0FBQUEsQUFBd0MiLCJmaWxlIjoibGliL2NvbXBpbGVkL29wY29kZXMvZG9tLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVkUmVmZXJlbmNlLCBjb21iaW5lVGFnZ2VkLCBpc0NvbnN0IGFzIGlzQ29uc3RSZWZlcmVuY2UsIGlzTW9kaWZpZWQsIFJlZmVyZW5jZUNhY2hlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGV4cGVjdCwgdW53cmFwIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUywgVXBkYXRpbmdPcGNvZGUgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IE5VTExfUkVGRVJFTkNFLCBQcmltaXRpdmVSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9yZWZlcmVuY2VzJztcbmltcG9ydCB7IEFzc2VydCB9IGZyb20gJy4vdm0nO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI0IC8qIFRleHQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kVGV4dCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI1IC8qIENvbW1lbnQgKi8sICh2bSwgeyBvcDE6IHRleHQgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkuYXBwZW5kQ29tbWVudCh2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRleHQpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI3IC8qIE9wZW5FbGVtZW50ICovLCAodm0sIHsgb3AxOiB0YWcgfSkgPT4ge1xuICAgIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodm0uY29uc3RhbnRzLmdldFN0cmluZyh0YWcpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDI4IC8qIE9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMgKi8sICh2bSwgeyBvcDE6IHRhZyB9KSA9PiB7XG4gICAgbGV0IHRhZ05hbWUgPSB2bS5jb25zdGFudHMuZ2V0U3RyaW5nKHRhZyk7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICB2bS5lbGVtZW50cygpLm9wZW5FbGVtZW50KHRhZ05hbWUsIG9wZXJhdGlvbnMpO1xufSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMjkgLyogT3BlbkR5bmFtaWNFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgdGFnTmFtZSA9IHZtLnN0YWNrLnBvcCgpLnZhbHVlKCk7XG4gICAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh0YWdOYW1lLCBvcGVyYXRpb25zKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDM2IC8qIFB1c2hSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IGVsZW1lbnRSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgbmV4dFNpYmxpbmdSZWYgPSB2bS5zdGFjay5wb3AoKTtcbiAgICBsZXQgZWxlbWVudDtcbiAgICBsZXQgbmV4dFNpYmxpbmc7XG4gICAgaWYgKGlzQ29uc3RSZWZlcmVuY2UoZWxlbWVudFJlZikpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnRSZWYudmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY2FjaGUgPSBuZXcgUmVmZXJlbmNlQ2FjaGUoZWxlbWVudFJlZik7XG4gICAgICAgIGVsZW1lbnQgPSBjYWNoZS5wZWVrKCk7XG4gICAgICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChjYWNoZSkpO1xuICAgIH1cbiAgICBpZiAoaXNDb25zdFJlZmVyZW5jZShuZXh0U2libGluZ1JlZikpIHtcbiAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0U2libGluZ1JlZi52YWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjYWNoZSA9IG5ldyBSZWZlcmVuY2VDYWNoZShuZXh0U2libGluZ1JlZik7XG4gICAgICAgIG5leHRTaWJsaW5nID0gY2FjaGUucGVlaygpO1xuICAgICAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQoY2FjaGUpKTtcbiAgICB9XG4gICAgdm0uZWxlbWVudHMoKS5wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBuZXh0U2libGluZyk7XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCgzNyAvKiBQb3BSZW1vdGVFbGVtZW50ICovLCB2bSA9PiB2bS5lbGVtZW50cygpLnBvcFJlbW90ZUVsZW1lbnQoKSk7XG5jbGFzcyBDbGFzc0xpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSB0cnVlO1xuICAgIH1cbiAgICBhcHBlbmQocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmIChsaXN0ID09PSBudWxsKSBsaXN0ID0gdGhpcy5saXN0ID0gW107XG4gICAgICAgIGxpc3QucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICB0aGlzLmlzQ29uc3QgPSBpc0NvbnN0ICYmIGlzQ29uc3RSZWZlcmVuY2UocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgdG9SZWZlcmVuY2UoKSB7XG4gICAgICAgIGxldCB7IGxpc3QsIGlzQ29uc3QgfSA9IHRoaXM7XG4gICAgICAgIGlmICghbGlzdCkgcmV0dXJuIE5VTExfUkVGRVJFTkNFO1xuICAgICAgICBpZiAoaXNDb25zdCkgcmV0dXJuIFByaW1pdGl2ZVJlZmVyZW5jZS5jcmVhdGUodG9DbGFzc05hbWUobGlzdCkpO1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdFJlZmVyZW5jZShsaXN0KTtcbiAgICB9XG59XG5jbGFzcyBDbGFzc0xpc3RSZWZlcmVuY2UgZXh0ZW5kcyBDYWNoZWRSZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKGxpc3QpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgICAgIHRoaXMudGFnID0gY29tYmluZVRhZ2dlZChsaXN0KTtcbiAgICAgICAgdGhpcy5saXN0ID0gbGlzdDtcbiAgICB9XG4gICAgY29tcHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRvQ2xhc3NOYW1lKHRoaXMubGlzdCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdG9DbGFzc05hbWUobGlzdCkge1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbGlzdFtpXS52YWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHJldC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0LmpvaW4oJyAnKTtcbn1cbmV4cG9ydCBjbGFzcyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoZW52KSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLm9wY29kZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCkuc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKS5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGFkZER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENsYXNzKHJlZmVyZW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlTWFuYWdlciA9IHRoaXMuZW52LmF0dHJpYnV0ZUZvcihlbGVtZW50LCBuYW1lLCBpc1RydXN0aW5nKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCBuYW1lLCByZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGREeW5hbWljQXR0cmlidXRlTlMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgbGV0IG5zQXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlLCBuYW1lc3BhY2UpO1xuICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZShuc0F0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGZsdXNoKGVsZW1lbnQsIHZtKSB7XG4gICAgICAgIGxldCB7IGVudiB9ID0gdm07XG4gICAgICAgIGxldCB7IG9wY29kZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IG9wY29kZXMgJiYgaSA8IG9wY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgob3Bjb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSBlbnYuYXR0cmlidXRlRm9yKGVsZW1lbnQsICdjbGFzcycsIGZhbHNlKTtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBuZXcgRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVNYW5hZ2VyLCAnY2xhc3MnLCBjbGFzc0xpc3QudG9SZWZlcmVuY2UoKSk7XG4gICAgICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKGVudik7XG4gICAgICAgICAgICBpZiAob3Bjb2RlKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aChvcGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0ID0gbnVsbDtcbiAgICB9XG4gICAgYWRkQ2xhc3MocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hcHBlbmQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSkge1xuICAgICAgICBsZXQgb3Bjb2RlID0gYXR0cmlidXRlLmZsdXNoKHRoaXMuZW52KTtcbiAgICAgICAgaWYgKG9wY29kZSkge1xuICAgICAgICAgICAgbGV0IHsgb3Bjb2RlcyB9ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghb3Bjb2Rlcykge1xuICAgICAgICAgICAgICAgIG9wY29kZXMgPSB0aGlzLm9wY29kZXMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wY29kZXMucHVzaChvcGNvZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEVsZW1lbnRPcGVyYXRpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IG51bGw7XG4gICAgfVxuICAgIGFkZFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRBZGRBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5ldyBTdGF0aWNBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRTdGF0aWNBdHRyaWJ1dGVOUyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUobmFtZSwgbmV3IFN0YXRpY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3MocmVmZXJlbmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZyk7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgbmFtZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkRHluYW1pY0F0dHJpYnV0ZU5TKGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSwgcmVmZXJlbmNlLCBpc1RydXN0aW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZEFkZEF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmVudi5hdHRyaWJ1dGVGb3IoZWxlbWVudCwgbmFtZSwgaXNUcnVzdGluZywgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIGxldCBuc0F0dHJpYnV0ZSA9IG5ldyBEeW5hbWljQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU1hbmFnZXIsIG5hbWUsIHJlZmVyZW5jZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKG5hbWUsIG5zQXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaChlbGVtZW50LCB2bSkge1xuICAgICAgICBsZXQgeyBlbnYgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGF0dHJpYnV0ZXMsIGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGF0dHJpYnV0ZXMgJiYgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvcGNvZGUgPSBhdHRyaWJ1dGVzW2ldLmZsdXNoKGVudik7XG4gICAgICAgICAgICBpZiAob3Bjb2RlKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aChvcGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVNYW5hZ2VyID0gZW52LmF0dHJpYnV0ZUZvcihlbGVtZW50LCAnY2xhc3MnLCBmYWxzZSk7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gbmV3IER5bmFtaWNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlTWFuYWdlciwgJ2NsYXNzJywgY2xhc3NMaXN0LnRvUmVmZXJlbmNlKCkpO1xuICAgICAgICAgICAgbGV0IG9wY29kZSA9IGF0dHJpYnV0ZS5mbHVzaChlbnYpO1xuICAgICAgICAgICAgaWYgKG9wY29kZSkge1xuICAgICAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgob3Bjb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzaG91bGRBZGRBdHRyaWJ1dGUobmFtZSkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYXR0cmlidXRlTmFtZXMgfHwgdGhpcy5hdHRyaWJ1dGVOYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMTtcbiAgICB9XG4gICAgYWRkQ2xhc3MocmVmZXJlbmNlKSB7XG4gICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0ID0gbmV3IENsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hcHBlbmQocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSkge1xuICAgICAgICBsZXQgeyBhdHRyaWJ1dGVOYW1lcywgYXR0cmlidXRlcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lcykge1xuICAgICAgICAgICAgYXR0cmlidXRlTmFtZXMgPSB0aGlzLmF0dHJpYnV0ZU5hbWVzID0gW107XG4gICAgICAgICAgICBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlTmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgdW53cmFwKGF0dHJpYnV0ZXMpLnB1c2goYXR0cmlidXRlKTtcbiAgICB9XG59XG5BUFBFTkRfT1BDT0RFUy5hZGQoMzMgLyogRmx1c2hFbGVtZW50ICovLCB2bSA9PiB7XG4gICAgbGV0IHN0YWNrID0gdm0uZWxlbWV