@tripsnek/tmf
Version:
TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)
240 lines • 34.9 kB
JavaScript
import { BasicEList } from '../basicelist.js';
import { ENamedElementImpl } from '../impl/enamed-element-impl.js';
import { EAttributeImpl } from '../impl/eattribute-impl.js';
import { EClassImpl } from '../impl/eclass-impl.js';
import { EOperationImpl } from '../impl/eoperation-impl.js';
import { EReferenceImpl } from '../impl/ereference-impl.js';
import { EEnumImpl } from '../impl/eenum-impl.js';
import { EDataTypeImpl } from '../impl/edata-type-impl.js';
import { EEnumLiteralImpl } from '../impl/eenum-literal-impl.js';
import { EParameterImpl } from '../impl/eparameter-impl.js';
export class EPackage extends ENamedElementImpl {
static EPACKAGE; // Initialized in EClass
static ECORE; // Initialized in EClass
/**
* A map from {@link EPackage#getNsURI() namespace URI} to {@link EPackage}.
*
* NOTE: This is a significant simplication of the EPackage.Registry in EMF, in
* that it consolidates several classes into one.
*/
static Registry = class Registry extends Map {
static INSTANCE = new Registry();
register(pkg) {
if (!this.has(pkg.getNsURI())) {
this.set(pkg.getNsURI(), pkg);
}
}
/**
* Looks up the value in the map.
*/
getEPackage(nsURI) {
return this.get(nsURI);
}
/**
* Looks up the value in the map.
*/
getEFactory(nsURI) {
return this.get(nsURI).getEFactoryInstance();
}
};
_eClassifiers = new BasicEList();
_eSubPackages = new BasicEList();
_eSuperPackage;
_nsPrefix;
_nsURI;
_eFactoryInstance;
constructor(name, nsUri, nsPrefix) {
super(name);
if (nsUri) {
this.setNsURI(nsUri);
EPackage.Registry.INSTANCE.register(this);
}
if (nsPrefix) {
this.setNsPrefix(nsPrefix);
}
}
getEClassifier(name) {
return this._eClassifiers.find((e) => e.getName() === name);
}
getESubPackageByName(name) {
return this._eSubPackages.find((e) => e.getName() === name);
}
// TODO: Protected is probably not right
// This method is probably to be invoked by setting an inverse field
addEClassifier(eClassifier) {
this._eClassifiers.add(eClassifier);
}
getEClassifiers() {
return this._eClassifiers;
}
getESubPackages() {
return this._eSubPackages;
}
getESuperPackage() {
return this._eSuperPackage;
}
setESuperPackage(superPkg) {
//TODO: should handle inverse reference on both ends
this._eSuperPackage = superPkg;
if (!this._eSuperPackage.getESubPackages().contains(this))
this._eSuperPackage.getESubPackages().add(this);
}
getNsPrefix() {
return this._nsPrefix;
}
setNsPrefix(value) {
this._nsPrefix = value;
}
getNsURI() {
return this._nsURI;
}
setNsURI(value) {
this._nsURI = value;
}
//======================================================================
// Factory-related methods
getEFactoryInstance() {
return this._eFactoryInstance;
}
setEFactoryInstance(value) {
this._eFactoryInstance = value;
}
createEEnum(id) {
const c = new EEnumImpl();
c.setClassifierId(id);
c.setEPackage(this);
this.getEClassifiers().add(c);
return c;
}
createEDataType(id) {
const c = new EDataTypeImpl();
c.setClassifierId(id);
c.setEPackage(this);
this.getEClassifiers().add(c);
return c;
}
createEClass(id) {
const c = new EClassImpl();
c.setClassifierId(id);
this.getEClassifiers().add(c);
c.setEPackage(this);
return c;
}
addEEnumLiteral(owner, literal, value) {
//NOTE: This is different from the EMF implementation, which exploits the
//fact that Java allows enums to implement interfaces. To replicate that in
//typescript, we would probably have to use types. If so, we should need only
//to pass in an instance of that base class (Enumerator in EMF) as 'literal'
const l = new EEnumLiteralImpl();
l.setLiteral(literal);
l.setName(literal);
l.setInstance(literal);
l.setValue(value);
l.setEEnum(owner);
owner.getELiterals().add(l);
}
initEClass(c, instanceClassName, isAbstract, isInterface, isGenerated) {
this.initEClassifier(c, instanceClassName, isGenerated);
c.setAbstract(isAbstract);
c.setInterface(isInterface);
return c;
}
initEEnum(e, instanceClassName) {
this.initEClassifier(e, instanceClassName, true);
return e;
}
initEDataType(e, instanceClassName) {
this.initEClassifier(e, instanceClassName, true);
return e;
}
initEClassifier(o, instanceClassName, isGenerated) {
o.setName(instanceClassName);
// if (instanceClassName != null) {
// o.setInstanceClass(instanceClassName);
// }
if (isGenerated) {
//TODO: Should we add this generated class name stuff to EClassifier?
// setGeneratedClassName(o);
}
}
initEReference(r, type, otherEnd, name, defaultValue, lowerBound, upperBound, containerClass, isTransient, isVolatile, isChangeable, isContainment, isResolveProxies, isUnsettable, isUnique, isDerived, isOrdered) {
this.initEStructuralFeature(r, type, name, defaultValue, lowerBound, upperBound, containerClass, isTransient, isVolatile, isChangeable, isUnsettable, isUnique, isDerived, isOrdered);
r.setContainment(isContainment);
if (otherEnd != null) {
r.setEOpposite(otherEnd);
}
// r.setResolveProxies(isResolveProxies);
return r;
}
initEAttribute(a, type, name, defaultValue, lowerBound, upperBound, containerClass, isTransient, isVolatile, isChangeable, isUnsettable, isID, isUnique, isDerived, isOrdered) {
this.initEStructuralFeature(a, type, name, defaultValue, lowerBound, upperBound, containerClass, isTransient, isVolatile, isChangeable, isUnsettable, isUnique, isDerived, isOrdered);
a.setId(isID);
return a;
}
initEStructuralFeature(s, type, name, defaultValue, lowerBound, upperBound, containerClass, isTransient, isVolatile, isChangeable, isUnsettable, isUnique, isDerived, isOrdered) {
s.setName(name);
// s.setContainerClass(containerClass);
s.setTransient(isTransient);
s.setVolatile(isVolatile);
s.setChangeable(isChangeable);
// s.setUnsettable(isUnsettable);
// s.setUnique(isUnique);
// s.setDerived(isDerived);
// s.setOrdered(isOrdered);
s.setLowerBound(lowerBound);
s.setUpperBound(upperBound);
s.setEType(type);
if (defaultValue != null) {
s.setDefaultValueLiteral(defaultValue);
}
}
initEOperation(eOperation, type, name, lowerBound, upperBound, isUnique, isOrdered) {
if (type)
eOperation.setEType(type);
eOperation.setName(name);
if (lowerBound)
eOperation.setLowerBound(lowerBound);
if (upperBound)
eOperation.setUpperBound(upperBound);
// eOperation.setUnique(isUnique ?? false);
// eOperation.setOrdered(isOrdered ?? false);
return eOperation;
}
createEOperation(owner, id) {
const o = new EOperationImpl();
o.setOperationID(id);
o.setEContainingClass(owner);
owner.getEOperations().add(o);
}
createEParameter(owner, name, upperBound, type) {
const param = new EParameterImpl();
param.setName(name);
if (type)
param.setEType(type);
param.setUpperBound(upperBound);
//TODO: Would not have to do both if model was source generated
owner.getEParameters().add(param);
param.setEOperation(owner);
}
createEAttribute(owner, id) {
const a = new EAttributeImpl();
a.setFeatureID(id);
owner.getEStructuralFeatures().add(a);
a.setEContainingClass(owner);
}
createEReference(owner, id) {
const r = new EReferenceImpl();
r.setFeatureID(id);
owner.getEStructuralFeatures().add(r);
r.setEContainingClass(owner);
}
getRootPackage() {
if (!this.getESuperPackage())
return this;
let cursor = this.getESuperPackage();
while (cursor.getESuperPackage() != null)
cursor = cursor.getESuperPackage();
return cursor;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBhY2thZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21ldGFtb2RlbC9hcGkvZXBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBUTlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU1RCxNQUFNLE9BQU8sUUFBUyxTQUFRLGlCQUFpQjtJQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFTLENBQUMsd0JBQXdCO0lBQ2pELE1BQU0sQ0FBQyxLQUFLLENBQVcsQ0FBQyx3QkFBd0I7SUFFdkQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sUUFBUyxTQUFRLEdBQXFCO1FBQ25FLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUUxQixRQUFRLENBQUMsR0FBYTtZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsR0FBRyxDQUFD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QUMsQ0FBQztRQUNuQixLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsRUFBVTtRQUNsRCxNQUFNLENBQUMsR0FBZSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkIsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDckMsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJO1lBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5hbWVkRWxlbWVudCB9IGZyb20gJy4vZW5hbWVkLWVsZW1lbnQuanMnO1xyXG5pbXBvcnQgeyBFQ2xhc3MgfSBmcm9tICcuL2VjbGFzcy5qcyc7XHJcbmltcG9ydCB7IEVDbGFzc2lmaWVyIH0gZnJvbSAnLi9lY2xhc3NpZmllci5qcyc7XHJcbmltcG9ydCB7IEVGYWN0b3J5IH0gZnJvbSAnLi9lZmFjdG9yeS5qcyc7XHJcbmltcG9ydCB7IEVMaXN0IH0gZnJvbSAnLi9lbGlzdC5qcyc7XHJcbmltcG9ydCB7IEJhc2ljRUxpc3QgfSBmcm9tICcuLi9iYXNpY2VsaXN0LmpzJztcclxuaW1wb3J0IHsgRUVudW0gfSBmcm9tICcuL2VlbnVtLmpzJztcclxuaW1wb3J0IHsgRUF0dHJpYnV0ZSB9IGZyb20gJy4vZWF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEVSZWZlcmVuY2UgfSBmcm9tICcuL2VyZWZlcmVuY2UuanMnO1xyXG5pbXBvcnQgeyBFU3RydWN0dXJhbEZlYXR1cmUgfSBmcm9tICcuL2VzdHJ1Y3R1cmFsLWZlYXR1cmUuanMnO1xyXG5pbXBvcnQgeyBFRGF0YVR5cGUgfSBmcm9tICcuL2VkYXRhLXR5cGUuanMnO1xyXG5pbXBvcnQgeyBFRW51bUxpdGVyYWwgfSBmcm9tICcuL2VlbnVtLWxpdGVyYWwuanMnO1xyXG5pbXBvcnQgeyBFT3BlcmF0aW9uIH0gZnJvbSAnLi9lb3BlcmF0aW9uLmpzJztcclxuaW1wb3J0IHsgRU5hbWVkRWxlbWVudEltcGwgfSBmcm9tICcuLi9pbXBsL2VuYW1lZC1lbGVtZW50LWltcGwuanMnO1xyXG5pbXBvcnQgeyBFQXR0cmlidXRlSW1wbCB9IGZyb20gJy4uL2ltcGwvZWF0dHJpYnV0ZS1pbXBsLmpzJztcclxuaW1wb3J0IHsgRUNsYXNzSW1wbCB9IGZyb20gJy4uL2ltcGwvZWNsYXNzLWltcGwuanMnO1xyXG5pbXBvcnQgeyBFT3BlcmF0aW9uSW1wbCB9IGZyb20gJy4uL2ltcGwvZW9wZXJhdGlvbi1pbXBsLmpzJztcclxuaW1wb3J0IHsgRVJlZmVyZW5jZUltcGwgfSBmcm9tICcuLi9pbXBsL2VyZWZlcmVuY2UtaW1wbC5qcyc7XHJcbmltcG9ydCB7IEVFbnVtSW1wbCB9IGZyb20gJy4uL2ltcGwvZWVudW0taW1wbC5qcyc7XHJcbmltcG9ydCB7IEVEYXRhVHlwZUltcGwgfSBmcm9tICcuLi9pbXBsL2VkYXRhLXR5cGUtaW1wbC5qcyc7XHJcbmltcG9ydCB7IEVFbnVtTGl0ZXJhbEltcGwgfSBmcm9tICcuLi9pbXBsL2VlbnVtLWxpdGVyYWwtaW1wbC5qcyc7XHJcbmltcG9ydCB7IEVQYXJhbWV0ZXJJbXBsIH0gZnJvbSAnLi4vaW1wbC9lcGFyYW1ldGVyLWltcGwuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVQYWNrYWdlIGV4dGVuZHMgRU5hbWVkRWxlbWVudEltcGwge1xyXG4gIHB1YmxpYyBzdGF0aWMgRVBBQ0tBR0U6IEVDbGFzczsgLy8gSW5pdGlhbGl6ZWQgaW4gRUNsYXNzXHJcbiAgcHVibGljIHN0YXRpYyBFQ09SRTogRVBhY2thZ2U7IC8vIEluaXRpYWxpemVkIGluIEVDbGFzc1xyXG5cclxuICAvKipcclxuICAgKiBBIG1hcCBmcm9tIHtAbGluayBFUGFja2FnZSNnZXROc1VSSSgpIG5hbWVzcGFjZSBVUkl9IHRvIHtAbGluayBFUGFja2FnZX0uXHJcbiAgICpcclxuICAgKiBOT1RFOiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgc2ltcGxpY2F0aW9uIG9mIHRoZSBFUGFja2FnZS5SZWdpc3RyeSBpbiBFTUYsIGluXHJcbiAgICogdGhhdCBpdCBjb25zb2xpZGF0ZXMgc2V2ZXJhbCBjbGFzc2VzIGludG8gb25lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgUmVnaXN0cnkgPSBjbGFzcyBSZWdpc3RyeSBleHRlbmRzIE1hcDxzdHJpbmcsIEVQYWNrYWdlPiB7XHJcbiAgICBzdGF0aWMgSU5TVEFOQ0UgPSBuZXcgUmVnaXN0cnkoKTtcclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXIocGtnOiBFUGFja2FnZSkge1xyXG4gICAgICBpZiAoIXRoaXMuaGFzKHBrZy5nZXROc1VSSSgpKSkge1xyXG4gICAgICAgIHRoaXMuc2V0KHBrZy5nZXROc1VSSSgpLCBwa2cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb29rcyB1cCB0aGUgdmFsdWUgaW4gdGhlIG1hcC5cclxuICAgICAqL1xyXG4gICAgZ2V0RVBhY2thZ2UobnNVUkk6IHN0cmluZyk6IEVQYWNrYWdlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0KG5zVVJJKSE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb29rcyB1cCB0aGUgdmFsdWUgaW4gdGhlIG1hcC5cclxuICAgICAqL1xyXG4gICAgZ2V0RUZhY3RvcnkobnNVUkk6IHN0cmluZyk6IEVGYWN0b3J5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0KG5zVVJJKSEuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgX2VDbGFzc2lmaWVyczogRUxpc3Q8RUNsYXNzaWZpZXI+ID0gbmV3IEJhc2ljRUxpc3QoKTtcclxuICBwcml2YXRlIF9lU3ViUGFja2FnZXM6IEVMaXN0PEVQYWNrYWdlPiA9IG5ldyBCYXNpY0VMaXN0KCk7XHJcbiAgcHJpdmF0ZSBfZVN1cGVyUGFja2FnZSE6IEVQYWNrYWdlO1xyXG4gIHByaXZhdGUgX25zUHJlZml4ITogc3RyaW5nO1xyXG4gIHByaXZhdGUgX25zVVJJITogc3RyaW5nO1xyXG5cclxuICBwcm90ZWN0ZWQgX2VGYWN0b3J5SW5zdGFuY2UhOiBFRmFjdG9yeTtcclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgbnNVcmk/OiBzdHJpbmcsIG5zUHJlZml4Pzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihuYW1lKTtcclxuICAgIGlmIChuc1VyaSkge1xyXG4gICAgICB0aGlzLnNldE5zVVJJKG5zVXJpKTtcclxuICAgICAgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucmVnaXN0ZXIodGhpcyk7XHJcbiAgICB9XHJcbiAgICBpZihuc1ByZWZpeCl7XHJcbiAgICAgIHRoaXMuc2V0TnNQcmVmaXgobnNQcmVmaXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVDbGFzc2lmaWVyKG5hbWU6IHN0cmluZyk6IEVDbGFzc2lmaWVyIHtcclxuICAgIHJldHVybiB0aGlzLl9lQ2xhc3NpZmllcnMuZmluZCgoZSkgPT4gZS5nZXROYW1lKCkgPT09IG5hbWUpITtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRFU3ViUGFja2FnZUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBFUGFja2FnZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZVN1YlBhY2thZ2VzLmZpbmQoKGUpID0+IGUuZ2V0TmFtZSgpID09PSBuYW1lKSE7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiBQcm90ZWN0ZWQgaXMgcHJvYmFibHkgbm90IHJpZ2h0XHJcbiAgLy8gVGhpcyBtZXRob2QgaXMgcHJvYmFibHkgdG8gYmUgaW52b2tlZCBieSBzZXR0aW5nIGFuIGludmVyc2UgZmllbGRcclxuICBwcm90ZWN0ZWQgYWRkRUNsYXNzaWZpZXIoZUNsYXNzaWZpZXI6IEVDbGFzc2lmaWVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lQ2xhc3NpZmllcnMuYWRkKGVDbGFzc2lmaWVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRFQ2xhc3NpZmllcnMoKTogRUxpc3Q8RUNsYXNzaWZpZXI+IHtcclxuICAgIHJldHVybiB0aGlzLl9lQ2xhc3NpZmllcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RVN1YlBhY2thZ2VzKCk6IEVMaXN0PEVQYWNrYWdlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZVN1YlBhY2thZ2VzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVTdXBlclBhY2thZ2UoKTogRVBhY2thZ2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VTdXBlclBhY2thZ2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RVN1cGVyUGFja2FnZShzdXBlclBrZzogRVBhY2thZ2UpOiB2b2lkIHtcclxuICAgIC8vVE9ETzogc2hvdWxkIGhhbmRsZSBpbnZlcnNlIHJlZmVyZW5jZSBvbiBib3RoIGVuZHNcclxuICAgIHRoaXMuX2VTdXBlclBhY2thZ2UgPSBzdXBlclBrZztcclxuICAgIGlmKCF0aGlzLl9lU3VwZXJQYWNrYWdlLmdldEVTdWJQYWNrYWdlcygpLmNvbnRhaW5zKHRoaXMpKVxyXG4gICAgICB0aGlzLl9lU3VwZXJQYWNrYWdlLmdldEVTdWJQYWNrYWdlcygpLmFkZCh0aGlzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROc1ByZWZpeCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX25zUHJlZml4O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE5zUHJlZml4KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX25zUHJlZml4ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TnNVUkkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9uc1VSSTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXROc1VSSSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9uc1VSSSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gRmFjdG9yeS1yZWxhdGVkIG1ldGhvZHNcclxuXHJcbiAgcHVibGljIGdldEVGYWN0b3J5SW5zdGFuY2UoKTogRUZhY3Rvcnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VGYWN0b3J5SW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RUZhY3RvcnlJbnN0YW5jZSh2YWx1ZTogRUZhY3RvcnkpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VGYWN0b3J5SW5zdGFuY2UgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVFRW51bShpZDogbnVtYmVyKTogRUVudW0ge1xyXG4gICAgY29uc3QgYyA9IG5ldyBFRW51bUltcGwoKTtcclxuICAgIGMuc2V0Q2xhc3NpZmllcklkKGlkKTtcclxuICAgIGMuc2V0RVBhY2thZ2UodGhpcyk7XHJcbiAgICB0aGlzLmdldEVDbGFzc2lmaWVycygpLmFkZChjKTtcclxuICAgIHJldHVybiBjO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUVEYXRhVHlwZShpZDogbnVtYmVyKTogRURhdGFUeXBlIHtcclxuICAgIGNvbnN0IGMgPSBuZXcgRURhdGFUeXBlSW1wbCgpO1xyXG4gICAgYy5zZXRDbGFzc2lmaWVySWQoaWQpO1xyXG4gICAgYy5zZXRFUGFja2FnZSh0aGlzKTtcclxuICAgIHRoaXMuZ2V0RUNsYXNzaWZpZXJzKCkuYWRkKGMpO1xyXG4gICAgcmV0dXJuIGM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRUNsYXNzKGlkOiBudW1iZXIpOiBFQ2xhc3Mge1xyXG4gICAgY29uc3QgYyA9IG5ldyBFQ2xhc3NJbXBsKCk7XHJcbiAgICBjLnNldENsYXNzaWZpZXJJZChpZCk7XHJcbiAgICB0aGlzLmdldEVDbGFzc2lmaWVycygpLmFkZChjKTtcclxuICAgIGMuc2V0RVBhY2thZ2UodGhpcyk7XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRFRW51bUxpdGVyYWwoXHJcbiAgICBvd25lcjogRUVudW0sXHJcbiAgICBsaXRlcmFsOiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogbnVtYmVyXHJcbiAgKTogdm9pZCB7XHJcbiAgICAvL05PVEU6IFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIEVNRiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggZXhwbG9pdHMgdGhlXHJcbiAgICAvL2ZhY3QgdGhhdCBKYXZhIGFsbG93cyBlbnVtcyB0byBpbXBsZW1lbnQgaW50ZXJmYWNlcy4gVG8gcmVwbGljYXRlIHRoYXQgaW5cclxuICAgIC8vdHlwZXNjcmlwdCwgd2Ugd291bGQgcHJvYmFibHkgaGF2ZSB0byB1c2UgdHlwZXMuIElmIHNvLCB3ZSBzaG91bGQgbmVlZCBvbmx5XHJcbiAgICAvL3RvIHBhc3MgaW4gYW4gaW5zdGFuY2Ugb2YgdGhhdCBiYXNlIGNsYXNzIChFbnVtZXJhdG9yIGluIEVNRikgYXMgJ2xpdGVyYWwnXHJcbiAgICBjb25zdCBsID0gbmV3IEVFbnVtTGl0ZXJhbEltcGwoKTtcclxuICAgIGwuc2V0TGl0ZXJhbChsaXRlcmFsKTtcclxuICAgIGwuc2V0TmFtZShsaXRlcmFsKTtcclxuICAgIGwuc2V0SW5zdGFuY2UobGl0ZXJhbCk7XHJcbiAgICBsLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGwuc2V0RUVudW0ob3duZXIpO1xyXG4gICAgb3duZXIuZ2V0RUxpdGVyYWxzKCkuYWRkKGwpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGluaXRFQ2xhc3MoXHJcbiAgICBjOiBFQ2xhc3MsXHJcbiAgICBpbnN0YW5jZUNsYXNzTmFtZTogc3RyaW5nLFxyXG4gICAgaXNBYnN0cmFjdDogYm9vbGVhbixcclxuICAgIGlzSW50ZXJmYWNlOiBib29sZWFuLFxyXG4gICAgaXNHZW5lcmF0ZWQ6IGJvb2xlYW5cclxuICApOiBFQ2xhc3Mge1xyXG4gICAgdGhpcy5pbml0RUNsYXNzaWZpZXIoYywgaW5zdGFuY2VDbGFzc05hbWUsIGlzR2VuZXJhdGVkKTtcclxuICAgIGMuc2V0QWJzdHJhY3QoaXNBYnN0cmFjdCk7XHJcbiAgICBjLnNldEludGVyZmFjZShpc0ludGVyZmFjZSk7XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbml0RUVudW0oZTogRUVudW0sIGluc3RhbmNlQ2xhc3NOYW1lOiBzdHJpbmcpOiBFRW51bSB7XHJcbiAgICB0aGlzLmluaXRFQ2xhc3NpZmllcihlLCBpbnN0YW5jZUNsYXNzTmFtZSwgdHJ1ZSk7XHJcbiAgICByZXR1cm4gZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbml0RURhdGFUeXBlKGU6IEVEYXRhVHlwZSwgaW5zdGFuY2VDbGFzc05hbWU6IHN0cmluZyk6IEVEYXRhVHlwZSB7XHJcbiAgICB0aGlzLmluaXRFQ2xhc3NpZmllcihlLCBpbnN0YW5jZUNsYXNzTmFtZSwgdHJ1ZSk7XHJcbiAgICByZXR1cm4gZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEVDbGFzc2lmaWVyKFxyXG4gICAgbzogRUNsYXNzaWZpZXIsXHJcbiAgICBpbnN0YW5jZUNsYXNzTmFtZTogc3RyaW5nLFxyXG4gICAgaXNHZW5lcmF0ZWQ6IGJvb2xlYW5cclxuICApIHtcclxuICAgIG8uc2V0TmFtZShpbnN0YW5jZUNsYXNzTmFtZSk7XHJcbiAgICAvLyBpZiAoaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCkge1xyXG4gICAgLy8gICBvLnNldEluc3RhbmNlQ2xhc3MoaW5zdGFuY2VDbGFzc05hbWUpO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKGlzR2VuZXJhdGVkKSB7XHJcbiAgICAgIC8vVE9ETzogU2hvdWxkIHdlIGFkZCB0aGlzIGdlbmVyYXRlZCBjbGFzcyBuYW1lIHN0dWZmIHRvIEVDbGFzc2lmaWVyP1xyXG4gICAgICAvLyBzZXRHZW5lcmF0ZWRDbGFzc05hbWUobyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW5pdEVSZWZlcmVuY2UoXHJcbiAgICByOiBFUmVmZXJlbmNlLFxyXG4gICAgdHlwZTogRUNsYXNzaWZpZXIsXHJcbiAgICBvdGhlckVuZDogRVJlZmVyZW5jZSB8IHVuZGVmaW5lZCxcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGRlZmF1bHRWYWx1ZTogc3RyaW5nLFxyXG4gICAgbG93ZXJCb3VuZDogbnVtYmVyLFxyXG4gICAgdXBwZXJCb3VuZDogbnVtYmVyLFxyXG4gICAgY29udGFpbmVyQ2xhc3M6IHN0cmluZyxcclxuICAgIGlzVHJhbnNpZW50OiBib29sZWFuLFxyXG4gICAgaXNWb2xhdGlsZTogYm9vbGVhbixcclxuICAgIGlzQ2hhbmdlYWJsZTogYm9vbGVhbixcclxuICAgIGlzQ29udGFpbm1lbnQ6IGJvb2xlYW4sXHJcbiAgICBpc1Jlc29sdmVQcm94aWVzOiBib29sZWFuLFxyXG4gICAgaXNVbnNldHRhYmxlOiBib29sZWFuLFxyXG4gICAgaXNVbmlxdWU6IGJvb2xlYW4sXHJcbiAgICBpc0Rlcml2ZWQ6IGJvb2xlYW4sXHJcbiAgICBpc09yZGVyZWQ6IGJvb2xlYW5cclxuICApOiBFUmVmZXJlbmNlIHtcclxuICAgIHRoaXMuaW5pdEVTdHJ1Y3R1cmFsRmVhdHVyZShcclxuICAgICAgcixcclxuICAgICAgdHlwZSxcclxuICAgICAgbmFtZSxcclxuICAgICAgZGVmYXVsdFZhbHVlLFxyXG4gICAgICBsb3dlckJvdW5kLFxyXG4gICAgICB1cHBlckJvdW5kLFxyXG4gICAgICBjb250YWluZXJDbGFzcyxcclxuICAgICAgaXNUcmFuc2llbnQsXHJcbiAgICAgIGlzVm9sYXRpbGUsXHJcbiAgICAgIGlzQ2hhbmdlYWJsZSxcclxuICAgICAgaXNVbnNldHRhYmxlLFxyXG4gICAgICBpc1VuaXF1ZSxcclxuICAgICAgaXNEZXJpdmVkLFxyXG4gICAgICBpc09yZGVyZWRcclxuICAgICk7XHJcbiAgICByLnNldENvbnRhaW5tZW50KGlzQ29udGFpbm1lbnQpO1xyXG4gICAgaWYgKG90aGVyRW5kICE9IG51bGwpIHtcclxuICAgICAgci5zZXRFT3Bwb3NpdGUob3RoZXJFbmQpO1xyXG4gICAgfVxyXG4gICAgLy8gci5zZXRSZXNvbHZlUHJveGllcyhpc1Jlc29sdmVQcm94aWVzKTtcclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGluaXRFQXR0cmlidXRlKFxyXG4gICAgYTogRUF0dHJpYnV0ZSxcclxuICAgIHR5cGU6IEVDbGFzc2lmaWVyLFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgZGVmYXVsdFZhbHVlOiBzdHJpbmcsXHJcbiAgICBsb3dlckJvdW5kOiBudW1iZXIsXHJcbiAgICB1cHBlckJvdW5kOiBudW1iZXIsXHJcbiAgICBjb250YWluZXJDbGFzczogc3RyaW5nLFxyXG4gICAgaXNUcmFuc2llbnQ6IGJvb2xlYW4sXHJcbiAgICBpc1ZvbGF0aWxlOiBib29sZWFuLFxyXG4gICAgaXNDaGFuZ2VhYmxlOiBib29sZWFuLFxyXG4gICAgaXNVbnNldHRhYmxlOiBib29sZWFuLFxyXG4gICAgaXNJRDogYm9vbGVhbixcclxuICAgIGlzVW5pcXVlOiBib29sZWFuLFxyXG4gICAgaXNEZXJpdmVkOiBib29sZWFuLFxyXG4gICAgaXNPcmRlcmVkOiBib29sZWFuXHJcbiAgKTogRUF0dHJpYnV0ZSB7XHJcbiAgICB0aGlzLmluaXRFU3RydWN0dXJhbEZlYXR1cmUoXHJcbiAgICAgIGEsXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGRlZmF1bHRWYWx1ZSxcclxuICAgICAgbG93ZXJCb3VuZCxcclxuICAgICAgdXBwZXJCb3VuZCxcclxuICAgICAgY29udGFpbmVyQ2xhc3MsXHJcbiAgICAgIGlzVHJhbnNpZW50LFxyXG4gICAgICBpc1ZvbGF0aWxlLFxyXG4gICAgICBpc0NoYW5nZWFibGUsXHJcbiAgICAgIGlzVW5zZXR0YWJsZSxcclxuICAgICAgaXNVbmlxdWUsXHJcbiAgICAgIGlzRGVyaXZlZCxcclxuICAgICAgaXNPcmRlcmVkXHJcbiAgICApO1xyXG4gICAgYS5zZXRJZChpc0lEKTtcclxuICAgIHJldHVybiBhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0RVN0cnVjdHVyYWxGZWF0dXJlKFxyXG4gICAgczogRVN0cnVjdHVyYWxGZWF0dXJlLFxyXG4gICAgdHlwZTogRUNsYXNzaWZpZXIsXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBkZWZhdWx0VmFsdWU6IHN0cmluZyxcclxuICAgIGxvd2VyQm91bmQ6IG51bWJlcixcclxuICAgIHVwcGVyQm91bmQ6IG51bWJlcixcclxuICAgIGNvbnRhaW5lckNsYXNzOiBzdHJpbmcsXHJcbiAgICBpc1RyYW5zaWVudDogYm9vbGVhbixcclxuICAgIGlzVm9sYXRpbGU6IGJvb2xlYW4sXHJcbiAgICBpc0NoYW5nZWFibGU6IGJvb2xlYW4sXHJcbiAgICBpc1Vuc2V0dGFibGU6IGJvb2xlYW4sXHJcbiAgICBpc1VuaXF1ZTogYm9vbGVhbixcclxuICAgIGlzRGVyaXZlZDogYm9vbGVhbixcclxuICAgIGlzT3JkZXJlZDogYm9vbGVhblxyXG4gICk6IHZvaWQge1xyXG4gICAgcy5zZXROYW1lKG5hbWUpO1xyXG4gICAgLy8gcy5zZXRDb250YWluZXJDbGFzcyhjb250YWluZXJDbGFzcyk7XHJcbiAgICBzLnNldFRyYW5zaWVudChpc1RyYW5zaWVudCk7XHJcbiAgICBzLnNldFZvbGF0aWxlKGlzVm9sYXRpbGUpO1xyXG4gICAgcy5zZXRDaGFuZ2VhYmxlKGlzQ2hhbmdlYWJsZSk7XHJcbiAgICAvLyBzLnNldFVuc2V0dGFibGUoaXNVbnNldHRhYmxlKTtcclxuICAgIC8vIHMuc2V0VW5pcXVlKGlzVW5pcXVlKTtcclxuICAgIC8vIHMuc2V0RGVyaXZlZChpc0Rlcml2ZWQpO1xyXG4gICAgLy8gcy5zZXRPcmRlcmVkKGlzT3JkZXJlZCk7XHJcbiAgICBzLnNldExvd2VyQm91bmQobG93ZXJCb3VuZCk7XHJcbiAgICBzLnNldFVwcGVyQm91bmQodXBwZXJCb3VuZCk7XHJcbiAgICBzLnNldEVUeXBlKHR5cGUpO1xyXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIHMuc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbChkZWZhdWx0VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGluaXRFT3BlcmF0aW9uKFxyXG4gICAgZU9wZXJhdGlvbjogRU9wZXJhdGlvbixcclxuICAgIHR5cGU6IEVDbGFzc2lmaWVyIHwgdW5kZWZpbmVkLFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgbG93ZXJCb3VuZD86IG51bWJlcixcclxuICAgIHVwcGVyQm91bmQ/OiBudW1iZXIsXHJcbiAgICBpc1VuaXF1ZT86IGJvb2xlYW4sXHJcbiAgICBpc09yZGVyZWQ/OiBib29sZWFuXHJcbiAgKTogRU9wZXJhdGlvbiB7XHJcbiAgICBpZiAodHlwZSkgZU9wZXJhdGlvbi5zZXRFVHlwZSh0eXBlKTtcclxuICAgIGVPcGVyYXRpb24uc2V0TmFtZShuYW1lKTtcclxuICAgIGlmIChsb3dlckJvdW5kKSBlT3BlcmF0aW9uLnNldExvd2VyQm91bmQobG93ZXJCb3VuZCk7XHJcbiAgICBpZiAodXBwZXJCb3VuZCkgZU9wZXJhdGlvbi5zZXRVcHBlckJvdW5kKHVwcGVyQm91bmQpO1xyXG4gICAgLy8gZU9wZXJhdGlvbi5zZXRVbmlxdWUoaXNVbmlxdWUgPz8gZmFsc2UpO1xyXG4gICAgLy8gZU9wZXJhdGlvbi5zZXRPcmRlcmVkKGlzT3JkZXJlZCA/PyBmYWxzZSk7XHJcbiAgICByZXR1cm4gZU9wZXJhdGlvbjtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVFT3BlcmF0aW9uKG93bmVyOiBFQ2xhc3MsIGlkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IG8gPSBuZXcgRU9wZXJhdGlvbkltcGwoKTtcclxuICAgIG8uc2V0T3BlcmF0aW9uSUQoaWQpO1xyXG4gICAgby5zZXRFQ29udGFpbmluZ0NsYXNzKG93bmVyKTtcclxuICAgIG93bmVyLmdldEVPcGVyYXRpb25zKCkuYWRkKG8pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUVQYXJhbWV0ZXIoXHJcbiAgICBvd25lcjogRU9wZXJhdGlvbixcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIHVwcGVyQm91bmQ6IG51bWJlcixcclxuICAgIHR5cGU/OiBFQ2xhc3NpZmllclxyXG4gICkgOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcmFtID0gbmV3IEVQYXJhbWV0ZXJJbXBsKCk7XHJcbiAgICBwYXJhbS5zZXROYW1lKG5hbWUpO1xyXG4gICAgaWYgKHR5cGUpIHBhcmFtLnNldEVUeXBlKHR5cGUpO1xyXG4gICAgcGFyYW0uc2V0VXBwZXJCb3VuZCh1cHBlckJvdW5kKTtcclxuXHJcbiAgICAvL1RPRE86IFdvdWxkIG5vdCBoYXZlIHRvIGRvIGJvdGggaWYgbW9kZWwgd2FzIHNvdXJjZSBnZW5lcmF0ZWRcclxuICAgIG93bmVyLmdldEVQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtKTtcclxuICAgIHBhcmFtLnNldEVPcGVyYXRpb24ob3duZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUVBdHRyaWJ1dGUob3duZXI6IEVDbGFzcywgaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgYSA9IDxFQXR0cmlidXRlPm5ldyBFQXR0cmlidXRlSW1wbCgpO1xyXG4gICAgYS5zZXRGZWF0dXJlSUQoaWQpO1xyXG4gICAgb3duZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmFkZChhKTtcclxuICAgIGEuc2V0RUNvbnRhaW5pbmdDbGFzcyhvd25lcik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlRVJlZmVyZW5jZShvd25lcjogRUNsYXNzLCBpZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCByID0gPEVSZWZlcmVuY2U+bmV3IEVSZWZlcmVuY2VJbXBsKCk7XHJcbiAgICByLnNldEZlYXR1cmVJRChpZCk7XHJcbiAgICBvd25lci5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuYWRkKHIpO1xyXG4gICAgci5zZXRFQ29udGFpbmluZ0NsYXNzKG93bmVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRSb290UGFja2FnZSgpOiBFUGFja2FnZSB7XHJcbiAgICBpZiAoIXRoaXMuZ2V0RVN1cGVyUGFja2FnZSgpKSByZXR1cm4gdGhpcztcclxuICAgIGxldCBjdXJzb3IgPSB0aGlzLmdldEVTdXBlclBhY2thZ2UoKTtcclxuICAgIHdoaWxlIChjdXJzb3IuZ2V0RVN1cGVyUGFja2FnZSgpICE9IG51bGwpXHJcbiAgICAgIGN1cnNvciA9IGN1cnNvci5nZXRFU3VwZXJQYWNrYWdlKCk7XHJcbiAgICByZXR1cm4gY3Vyc29yO1xyXG4gIH1cclxufVxyXG4iXX0=