@ngx-i18nsupport/ngx-i18nsupport-lib
Version:
A Typescript library to work with Angular generated i18n files (xliff, xmb)
356 lines • 29.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { STATE_TRANSLATED } from './internalapi';
import { AbstractTranslationMessagesFile } from './abstract-translation-messages-file';
import { isNullOrUndefined, isString } from 'util';
/**
* Created by roobm on 10.05.2017.
* Abstract superclass for all implementations of ITransUnit.
* @abstract
*/
export class AbstractTransUnit {
/**
* @protected
* @param {?} _element
* @param {?} _id
* @param {?} _translationMessagesFile
*/
constructor(_element, _id, _translationMessagesFile) {
this._element = _element;
this._id = _id;
this._translationMessagesFile = _translationMessagesFile;
}
/**
* @return {?}
*/
get id() {
return this._id;
}
/**
* The file the unit belongs to.,
* @return {?}
*/
translationMessagesFile() {
return this._translationMessagesFile;
}
/**
* Test, wether setting of source content is supported.
* If not, setSourceContent in trans-unit will do nothing.
* xtb does not support this, all other formats do.
* @return {?}
*/
supportsSetSourceContent() {
return true;
}
/**
* The original text value, that is to be translated, as normalized message.
* @return {?}
*/
sourceContentNormalized() {
if (isNullOrUndefined(this._sourceContentNormalized)) {
this._sourceContentNormalized = this.createSourceContentNormalized();
}
return this._sourceContentNormalized;
}
/**
* State of the translation.
* (on of new, translated, final)
* Return values are defined as Constants STATE_...
* @return {?}
*/
targetState() {
/** @type {?} */
const nativeState = this.nativeTargetState();
return this.mapNativeStateToState(nativeState);
}
/**
* Modify the target state.
* @param {?} newState one of the 3 allowed target states new, translated, final.
* Constants STATE_...
* Invalid states throw an error.
* @return {?}
*/
setTargetState(newState) {
this.setNativeTargetState(this.mapStateToNativeState(newState));
if (this.translationMessagesFile() instanceof AbstractTranslationMessagesFile) {
((/** @type {?} */ (this.translationMessagesFile()))).countNumbers();
}
}
/**
* Test, wether setting of source refs is supported.
* If not, setSourceReferences will do nothing.
* xtb does not support this, all other formats do.
* @return {?}
*/
supportsSetSourceReferences() {
return true;
}
/**
* Test, wether setting of description and meaning is supported.
* If not, setDescription and setMeaning will do nothing.
* xtb does not support this, all other formats do.
* @return {?}
*/
supportsSetDescriptionAndMeaning() {
return true;
}
/**
* Check notes
* @throws an Error if any note contains description or meaning as from attribute.
* @protected
* @param {?} newNotes the notes to add.
* @return {?}
*/
checkNotes(newNotes) {
// check from values
/** @type {?} */
const errorInFromNote = newNotes.find((/**
* @param {?} note
* @return {?}
*/
(note) => note.from === 'description' || note.from === 'meaning'));
if (!isNullOrUndefined(errorInFromNote)) {
throw new Error('description or meaning are not allowed as from atttribute');
}
}
/**
* The real xml element used for the trans unit.
* (internal usage only, a client should never need this)
* @return {?} real xml element used for the trans unit.
*/
asXmlElement() {
return this._element;
}
/**
* Translate the trans unit.
* @param {?} translation the translated string or (preferred) a normalized message.
* The pure string can contain any markup and will not be checked.
* So it can damage the document.
* A normalized message prevents this.
* @return {?}
*/
translate(translation) {
/** @type {?} */
let translationNative;
if (isString(translation)) {
translationNative = (/** @type {?} */ (translation));
}
else {
translationNative = ((/** @type {?} */ (translation))).asNativeString();
}
this.translateNative(translationNative);
this.setTargetState(STATE_TRANSLATED);
}
/**
* Test, wether message looks like ICU message.
* @param {?} message message
* @return {?} wether message looks like ICU message.
*/
isICUMessage(message) {
return this.messageParser().isICUMessageStart(message);
}
}
if (false) {
/**
* @type {?}
* @private
*/
AbstractTransUnit.prototype._sourceContentNormalized;
/**
* @type {?}
* @protected
*/
AbstractTransUnit.prototype._element;
/**
* @type {?}
* @protected
*/
AbstractTransUnit.prototype._id;
/**
* @type {?}
* @protected
*/
AbstractTransUnit.prototype._translationMessagesFile;
/**
* The original text value, that is to be translated.
* Contains all markup, depends on the concrete format used.
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.sourceContent = function () { };
/**
* Set new source content in the transunit.
* Normally, this is done by ng-extract.
* Method only exists to allow xliffmerge to merge missing changed source content.
* @abstract
* @param {?} newContent the new content.
* @return {?}
*/
AbstractTransUnit.prototype.setSourceContent = function (newContent) { };
/**
* The original text value, that is to be translated, as normalized message.
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.createSourceContentNormalized = function () { };
/**
* The translated value.
* Contains all markup, depends on the concrete format used.
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.targetContent = function () { };
/**
* The translated value as normalized message.
* All placeholders are replaced with {{n}} (starting at 0)
* and all embedded html is replaced by direct html markup.
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.targetContentNormalized = function () { };
/**
* State of the translation as stored in the xml.
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.nativeTargetState = function () { };
/**
* Map an abstract state (new, translated, final) to a concrete state used in the xml.
* Returns the state to be used in the xml.
* @throws error, if state is invalid.
* @abstract
* @protected
* @param {?} state one of Constants.STATE...
* @return {?} a native state (depends on concrete format)
*/
AbstractTransUnit.prototype.mapStateToNativeState = function (state) { };
/**
* Map a native state (found in the document) to an abstract state (new, translated, final).
* Returns the abstract state.
* @abstract
* @protected
* @param {?} nativeState nativeState
* @return {?}
*/
AbstractTransUnit.prototype.mapNativeStateToState = function (nativeState) { };
/**
* set state in xml.
* @abstract
* @protected
* @param {?} nativeState nativeState
* @return {?}
*/
AbstractTransUnit.prototype.setNativeTargetState = function (nativeState) { };
/**
* All the source elements in the trans unit.
* The source element is a reference to the original template.
* It contains the name of the template file and a line number with the position inside the template.
* It is just a help for translators to find the context for the translation.
* This is set when using Angular 4.0 or greater.
* Otherwise it just returns an empty array.
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.sourceReferences = function () { };
/**
* Set source ref elements in the transunit.
* Normally, this is done by ng-extract.
* Method only exists to allow xliffmerge to merge missing source refs.
* @abstract
* @param {?} sourceRefs the sourcerefs to set. Old ones are removed.
* @return {?}
*/
AbstractTransUnit.prototype.setSourceReferences = function (sourceRefs) { };
/**
* The description set in the template as value of the i18n-attribute.
* e.g. i18n="mydescription".
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.description = function () { };
/**
* The meaning (intent) set in the template as value of the i18n-attribute.
* This is the part in front of the | symbol.
* e.g. i18n="meaning|mydescription".
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.meaning = function () { };
/**
* Change description property of trans-unit.
* @abstract
* @param {?} description description
* @return {?}
*/
AbstractTransUnit.prototype.setDescription = function (description) { };
/**
* Change meaning property of trans-unit.
* @abstract
* @param {?} meaning meaning
* @return {?}
*/
AbstractTransUnit.prototype.setMeaning = function (meaning) { };
/**
* Get all notes of the trans-unit.
* Notes are remarks made by a translator.
* (description and meaning are not included here!)
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.notes = function () { };
/**
* Test, wether setting of notes is supported.
* If not, setNotes will do nothing.
* xtb does not support this, all other formats do.
* @abstract
* @return {?}
*/
AbstractTransUnit.prototype.supportsSetNotes = function () { };
/**
* Add notes to trans unit.
* @throws an Error if any note contains descpription or meaning as from attribute.
* @abstract
* @param {?} newNotes the notes to add.
* @return {?}
*/
AbstractTransUnit.prototype.setNotes = function (newNotes) { };
/**
* Copy source to target to use it as dummy translation.
* Returns a changed copy of this trans unit.
* receiver is not changed.
* (internal usage only, a client should call importNewTransUnit on ITranslationMessageFile)
* @abstract
* @param {?} isDefaultLang
* @param {?} copyContent
* @param {?} targetFile
* @return {?}
*/
AbstractTransUnit.prototype.cloneWithSourceAsTarget = function (isDefaultLang, copyContent, targetFile) { };
/**
* Copy source to target to use it as dummy translation.
* (internal usage only, a client should call createTranslationFileForLang on ITranslationMessageFile)
* @abstract
* @param {?} isDefaultLang
* @param {?} copyContent
* @return {?}
*/
AbstractTransUnit.prototype.useSourceAsTarget = function (isDefaultLang, copyContent) { };
/**
* Return a parser used for normalized messages.
* @abstract
* @protected
* @return {?}
*/
AbstractTransUnit.prototype.messageParser = function () { };
/**
* Set the translation to a given string (including markup).
* @abstract
* @protected
* @param {?} translation translation
* @return {?}
*/
AbstractTransUnit.prototype.translateNative = function (translation) { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdHJhbnMtdW5pdC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZ3gtaTE4bnN1cHBvcnQvbmd4LWkxOG5zdXBwb3J0LWxpYi8iLCJzb3VyY2VzIjpbImltcGwvYWJzdHJhY3QtdHJhbnMtdW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLGdCQUFnQixFQUFrRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRixPQUFPLEVBQUMsaUJBQWlCLEVBQUUsUUFBUSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFRakQsTUFBTSxPQUFnQixpQkFBaUI7Ozs7Ozs7SUFJbkMsWUFBZ0MsUUFBaUIsRUFDakIsR0FBVyxFQUNYLHdCQUFrRDtRQUZsRCxhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFDWCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO0lBQ2xGLENBQUM7Ozs7SUFFRCxJQUFXLEVBQUU7UUFDVCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFLRCx1QkFBdUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDekMsQ0FBQzs7Ozs7OztJQWFELHdCQUF3QjtRQUNwQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7OztJQWFNLHVCQUF1QjtRQUMxQixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO1lBQ2xELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztTQUN4RTtRQUNELE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3pDLENBQUM7Ozs7Ozs7SUE4Qk0sV0FBVzs7Y0FDUixXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1FBQzVDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7Ozs7Ozs7O0lBOEJELGNBQWMsQ0FBQyxRQUFnQjtRQUMzQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsWUFBWSwrQkFBK0IsRUFBRTtZQUMzRSxDQUFDLG1CQUFrQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBQSxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckY7SUFDTCxDQUFDOzs7Ozs7O0lBaUJNLDJCQUEyQjtRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7Ozs7O0lBNEJNLGdDQUFnQztRQUNuQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7Ozs7OztJQXdDUyxVQUFVLENBQUMsUUFBaUI7OztjQUU1QixlQUFlLEdBQUcsUUFBUSxDQUFDLElBQUk7Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUM7UUFDdkcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztTQUNoRjtJQUNMLENBQUM7Ozs7OztJQU9NLFlBQVk7UUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQzs7Ozs7Ozs7O0lBdUJNLFNBQVMsQ0FBQyxXQUF3Qzs7WUFDakQsaUJBQXlCO1FBQzdCLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZCLGlCQUFpQixHQUFHLG1CQUFTLFdBQVcsRUFBQSxDQUFDO1NBQzVDO2FBQU07WUFDSCxpQkFBaUIsR0FBRyxDQUFDLG1CQUFxQixXQUFXLEVBQUEsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQzNFO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxQyxDQUFDOzs7Ozs7SUFZTSxZQUFZLENBQUMsT0FBZTtRQUMvQixPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBT0o7Ozs7OztJQWxSRyxxREFBZ0Q7Ozs7O0lBRTFCLHFDQUEyQjs7Ozs7SUFDM0IsZ0NBQXFCOzs7OztJQUNyQixxREFBNEQ7Ozs7Ozs7SUFrQmxGLDREQUFpQzs7Ozs7Ozs7O0lBaUJqQyx5RUFBOEM7Ozs7OztJQWU5Qyw0RUFBd0Q7Ozs7Ozs7SUFNeEQsNERBQWlDOzs7Ozs7OztJQU9qQyxzRUFBdUQ7Ozs7OztJQUt2RCxnRUFBcUM7Ozs7Ozs7Ozs7SUFtQnJDLHlFQUFnRTs7Ozs7Ozs7O0lBT2hFLCtFQUFzRTs7Ozs7Ozs7SUFNdEUsOEVBQTZEOzs7Ozs7Ozs7OztJQXVCN0QsK0RBQXdFOzs7Ozs7Ozs7SUFpQnhFLDRFQUFxRjs7Ozs7OztJQU1yRiwwREFBK0I7Ozs7Ozs7O0lBTy9CLHNEQUEyQjs7Ozs7OztJQWUzQix3RUFBNkM7Ozs7Ozs7SUFNN0MsZ0VBQXFDOzs7Ozs7OztJQU9yQyxvREFBMEI7Ozs7Ozs7O0lBTzFCLCtEQUFxQzs7Ozs7Ozs7SUFPckMsK0RBQXFDOzs7Ozs7Ozs7Ozs7SUE4QnJDLDRHQUF3STs7Ozs7Ozs7O0lBTXhJLDBGQUF5RTs7Ozs7OztJQXVCekUsNERBQTBEOzs7Ozs7OztJQWUxRCx5RUFBd0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NUQVRFX1RSQU5TTEFURUQsIElUcmFuc2xhdGlvbk1lc3NhZ2VzRmlsZSwgSU5vcm1hbGl6ZWRNZXNzYWdlLCBJVHJhbnNVbml0LCBJTm90ZX0gZnJvbSAnLi9pbnRlcm5hbGFwaSc7XHJcbmltcG9ydCB7QWJzdHJhY3RUcmFuc2xhdGlvbk1lc3NhZ2VzRmlsZX0gZnJvbSAnLi9hYnN0cmFjdC10cmFuc2xhdGlvbi1tZXNzYWdlcy1maWxlJztcclxuaW1wb3J0IHtpc051bGxPclVuZGVmaW5lZCwgaXNTdHJpbmd9IGZyb20gJ3V0aWwnO1xyXG5pbXBvcnQge1BhcnNlZE1lc3NhZ2V9IGZyb20gJy4vcGFyc2VkLW1lc3NhZ2UnO1xyXG5pbXBvcnQge0Fic3RyYWN0TWVzc2FnZVBhcnNlcn0gZnJvbSAnLi9hYnN0cmFjdC1tZXNzYWdlLXBhcnNlcic7XHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IHJvb2JtIG9uIDEwLjA1LjIwMTcuXHJcbiAqIEFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgSVRyYW5zVW5pdC5cclxuICovXHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmFuc1VuaXQgaW1wbGVtZW50cyBJVHJhbnNVbml0IHtcclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2VDb250ZW50Tm9ybWFsaXplZDogUGFyc2VkTWVzc2FnZTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIF9lbGVtZW50OiBFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfaWQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0aW9uTWVzc2FnZXNGaWxlOiBJVHJhbnNsYXRpb25NZXNzYWdlc0ZpbGUpIHtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZpbGUgdGhlIHVuaXQgYmVsb25ncyB0by4sXHJcbiAgICAgKi9cclxuICAgIHRyYW5zbGF0aW9uTWVzc2FnZXNGaWxlKCk6IElUcmFuc2xhdGlvbk1lc3NhZ2VzRmlsZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0aW9uTWVzc2FnZXNGaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9yaWdpbmFsIHRleHQgdmFsdWUsIHRoYXQgaXMgdG8gYmUgdHJhbnNsYXRlZC5cclxuICAgICAqIENvbnRhaW5zIGFsbCBtYXJrdXAsIGRlcGVuZHMgb24gdGhlIGNvbmNyZXRlIGZvcm1hdCB1c2VkLlxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBzb3VyY2VDb250ZW50KCk6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3QsIHdldGhlciBzZXR0aW5nIG9mIHNvdXJjZSBjb250ZW50IGlzIHN1cHBvcnRlZC5cclxuICAgICAqIElmIG5vdCwgc2V0U291cmNlQ29udGVudCBpbiB0cmFucy11bml0IHdpbGwgZG8gbm90aGluZy5cclxuICAgICAqIHh0YiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMsIGFsbCBvdGhlciBmb3JtYXRzIGRvLlxyXG4gICAgICovXHJcbiAgICBzdXBwb3J0c1NldFNvdXJjZUNvbnRlbnQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgbmV3IHNvdXJjZSBjb250ZW50IGluIHRoZSB0cmFuc3VuaXQuXHJcbiAgICAgKiBOb3JtYWxseSwgdGhpcyBpcyBkb25lIGJ5IG5nLWV4dHJhY3QuXHJcbiAgICAgKiBNZXRob2Qgb25seSBleGlzdHMgdG8gYWxsb3cgeGxpZmZtZXJnZSB0byBtZXJnZSBtaXNzaW5nIGNoYW5nZWQgc291cmNlIGNvbnRlbnQuXHJcbiAgICAgKiBAcGFyYW0gbmV3Q29udGVudCB0aGUgbmV3IGNvbnRlbnQuXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IHNldFNvdXJjZUNvbnRlbnQobmV3Q29udGVudDogc3RyaW5nKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvcmlnaW5hbCB0ZXh0IHZhbHVlLCB0aGF0IGlzIHRvIGJlIHRyYW5zbGF0ZWQsIGFzIG5vcm1hbGl6ZWQgbWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNvdXJjZUNvbnRlbnROb3JtYWxpemVkKCk6IFBhcnNlZE1lc3NhZ2Uge1xyXG4gICAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZCh0aGlzLl9zb3VyY2VDb250ZW50Tm9ybWFsaXplZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlQ29udGVudE5vcm1hbGl6ZWQgPSB0aGlzLmNyZWF0ZVNvdXJjZUNvbnRlbnROb3JtYWxpemVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb250ZW50Tm9ybWFsaXplZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvcmlnaW5hbCB0ZXh0IHZhbHVlLCB0aGF0IGlzIHRvIGJlIHRyYW5zbGF0ZWQsIGFzIG5vcm1hbGl6ZWQgbWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3QgY3JlYXRlU291cmNlQ29udGVudE5vcm1hbGl6ZWQoKTogUGFyc2VkTWVzc2FnZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0cmFuc2xhdGVkIHZhbHVlLlxyXG4gICAgICogQ29udGFpbnMgYWxsIG1hcmt1cCwgZGVwZW5kcyBvbiB0aGUgY29uY3JldGUgZm9ybWF0IHVzZWQuXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IHRhcmdldENvbnRlbnQoKTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRyYW5zbGF0ZWQgdmFsdWUgYXMgbm9ybWFsaXplZCBtZXNzYWdlLlxyXG4gICAgICogQWxsIHBsYWNlaG9sZGVycyBhcmUgcmVwbGFjZWQgd2l0aCB7e259fSAoc3RhcnRpbmcgYXQgMClcclxuICAgICAqIGFuZCBhbGwgZW1iZWRkZWQgaHRtbCBpcyByZXBsYWNlZCBieSBkaXJlY3QgaHRtbCBtYXJrdXAuXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IHRhcmdldENvbnRlbnROb3JtYWxpemVkKCk6IElOb3JtYWxpemVkTWVzc2FnZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXRlIG9mIHRoZSB0cmFuc2xhdGlvbiBhcyBzdG9yZWQgaW4gdGhlIHhtbC5cclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3QgbmF0aXZlVGFyZ2V0U3RhdGUoKTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGUgb2YgdGhlIHRyYW5zbGF0aW9uLlxyXG4gICAgICogKG9uIG9mIG5ldywgdHJhbnNsYXRlZCwgZmluYWwpXHJcbiAgICAgKiBSZXR1cm4gdmFsdWVzIGFyZSBkZWZpbmVkIGFzIENvbnN0YW50cyBTVEFURV8uLi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRhcmdldFN0YXRlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgbmF0aXZlU3RhdGUgPSB0aGlzLm5hdGl2ZVRhcmdldFN0YXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwTmF0aXZlU3RhdGVUb1N0YXRlKG5hdGl2ZVN0YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hcCBhbiBhYnN0cmFjdCBzdGF0ZSAobmV3LCB0cmFuc2xhdGVkLCBmaW5hbCkgdG8gYSBjb25jcmV0ZSBzdGF0ZSB1c2VkIGluIHRoZSB4bWwuXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzdGF0ZSB0byBiZSB1c2VkIGluIHRoZSB4bWwuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgb25lIG9mIENvbnN0YW50cy5TVEFURS4uLlxyXG4gICAgICogQHJldHVybnMgYSBuYXRpdmUgc3RhdGUgKGRlcGVuZHMgb24gY29uY3JldGUgZm9ybWF0KVxyXG4gICAgICogQHRocm93cyBlcnJvciwgaWYgc3RhdGUgaXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IG1hcFN0YXRlVG9OYXRpdmVTdGF0ZShzdGF0ZTogc3RyaW5nKTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFwIGEgbmF0aXZlIHN0YXRlIChmb3VuZCBpbiB0aGUgZG9jdW1lbnQpIHRvIGFuIGFic3RyYWN0IHN0YXRlIChuZXcsIHRyYW5zbGF0ZWQsIGZpbmFsKS5cclxuICAgICAqIFJldHVybnMgdGhlIGFic3RyYWN0IHN0YXRlLlxyXG4gICAgICogQHBhcmFtIG5hdGl2ZVN0YXRlIG5hdGl2ZVN0YXRlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBtYXBOYXRpdmVTdGF0ZVRvU3RhdGUobmF0aXZlU3RhdGU6IHN0cmluZyk6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIHNldCBzdGF0ZSBpbiB4bWwuXHJcbiAgICAgKiBAcGFyYW0gbmF0aXZlU3RhdGUgbmF0aXZlU3RhdGVcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHNldE5hdGl2ZVRhcmdldFN0YXRlKG5hdGl2ZVN0YXRlOiBzdHJpbmcpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW9kaWZ5IHRoZSB0YXJnZXQgc3RhdGUuXHJcbiAgICAgKiBAcGFyYW0gbmV3U3RhdGUgb25lIG9mIHRoZSAzIGFsbG93ZWQgdGFyZ2V0IHN0YXRlcyBuZXcsIHRyYW5zbGF0ZWQsIGZpbmFsLlxyXG4gICAgICogQ29uc3RhbnRzIFNUQVRFXy4uLlxyXG4gICAgICogSW52YWxpZCBzdGF0ZXMgdGhyb3cgYW4gZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHNldFRhcmdldFN0YXRlKG5ld1N0YXRlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNldE5hdGl2ZVRhcmdldFN0YXRlKHRoaXMubWFwU3RhdGVUb05hdGl2ZVN0YXRlKG5ld1N0YXRlKSk7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRpb25NZXNzYWdlc0ZpbGUoKSBpbnN0YW5jZW9mIEFic3RyYWN0VHJhbnNsYXRpb25NZXNzYWdlc0ZpbGUpIHtcclxuICAgICAgICAgICAgKDxBYnN0cmFjdFRyYW5zbGF0aW9uTWVzc2FnZXNGaWxlPiB0aGlzLnRyYW5zbGF0aW9uTWVzc2FnZXNGaWxlKCkpLmNvdW50TnVtYmVycygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbCB0aGUgc291cmNlIGVsZW1lbnRzIGluIHRoZSB0cmFucyB1bml0LlxyXG4gICAgICogVGhlIHNvdXJjZSBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZS5cclxuICAgICAqIEl0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBhIGxpbmUgbnVtYmVyIHdpdGggdGhlIHBvc2l0aW9uIGluc2lkZSB0aGUgdGVtcGxhdGUuXHJcbiAgICAgKiBJdCBpcyBqdXN0IGEgaGVscCBmb3IgdHJhbnNsYXRvcnMgdG8gZmluZCB0aGUgY29udGV4dCBmb3IgdGhlIHRyYW5zbGF0aW9uLlxyXG4gICAgICogVGhpcyBpcyBzZXQgd2hlbiB1c2luZyBBbmd1bGFyIDQuMCBvciBncmVhdGVyLlxyXG4gICAgICogT3RoZXJ3aXNlIGl0IGp1c3QgcmV0dXJucyBhbiBlbXB0eSBhcnJheS5cclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3Qgc291cmNlUmVmZXJlbmNlcygpOiB7c291cmNlZmlsZTogc3RyaW5nLCBsaW5lbnVtYmVyOiBudW1iZXJ9W107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0LCB3ZXRoZXIgc2V0dGluZyBvZiBzb3VyY2UgcmVmcyBpcyBzdXBwb3J0ZWQuXHJcbiAgICAgKiBJZiBub3QsIHNldFNvdXJjZVJlZmVyZW5jZXMgd2lsbCBkbyBub3RoaW5nLlxyXG4gICAgICogeHRiIGRvZXMgbm90IHN1cHBvcnQgdGhpcywgYWxsIG90aGVyIGZvcm1hdHMgZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdXBwb3J0c1NldFNvdXJjZVJlZmVyZW5jZXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgc291cmNlIHJlZiBlbGVtZW50cyBpbiB0aGUgdHJhbnN1bml0LlxyXG4gICAgICogTm9ybWFsbHksIHRoaXMgaXMgZG9uZSBieSBuZy1leHRyYWN0LlxyXG4gICAgICogTWV0aG9kIG9ubHkgZXhpc3RzIHRvIGFsbG93IHhsaWZmbWVyZ2UgdG8gbWVyZ2UgbWlzc2luZyBzb3VyY2UgcmVmcy5cclxuICAgICAqIEBwYXJhbSBzb3VyY2VSZWZzIHRoZSBzb3VyY2VyZWZzIHRvIHNldC4gT2xkIG9uZXMgYXJlIHJlbW92ZWQuXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IHNldFNvdXJjZVJlZmVyZW5jZXMoc291cmNlUmVmczoge3NvdXJjZWZpbGU6IHN0cmluZywgbGluZW51bWJlcjogbnVtYmVyfVtdKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBzZXQgaW4gdGhlIHRlbXBsYXRlIGFzIHZhbHVlIG9mIHRoZSBpMThuLWF0dHJpYnV0ZS5cclxuICAgICAqIGUuZy4gaTE4bj1cIm15ZGVzY3JpcHRpb25cIi5cclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3QgZGVzY3JpcHRpb24oKTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lYW5pbmcgKGludGVudCkgc2V0IGluIHRoZSB0ZW1wbGF0ZSBhcyB2YWx1ZSBvZiB0aGUgaTE4bi1hdHRyaWJ1dGUuXHJcbiAgICAgKiBUaGlzIGlzIHRoZSBwYXJ0IGluIGZyb250IG9mIHRoZSB8IHN5bWJvbC5cclxuICAgICAqIGUuZy4gaTE4bj1cIm1lYW5pbmd8bXlkZXNjcmlwdGlvblwiLlxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBtZWFuaW5nKCk6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3QsIHdldGhlciBzZXR0aW5nIG9mIGRlc2NyaXB0aW9uIGFuZCBtZWFuaW5nIGlzIHN1cHBvcnRlZC5cclxuICAgICAqIElmIG5vdCwgc2V0RGVzY3JpcHRpb24gYW5kIHNldE1lYW5pbmcgd2lsbCBkbyBub3RoaW5nLlxyXG4gICAgICogeHRiIGRvZXMgbm90IHN1cHBvcnQgdGhpcywgYWxsIG90aGVyIGZvcm1hdHMgZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdXBwb3J0c1NldERlc2NyaXB0aW9uQW5kTWVhbmluZygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoYW5nZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBvZiB0cmFucy11bml0LlxyXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlIG1lYW5pbmcgcHJvcGVydHkgb2YgdHJhbnMtdW5pdC5cclxuICAgICAqIEBwYXJhbSBtZWFuaW5nIG1lYW5pbmdcclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3Qgc2V0TWVhbmluZyhtZWFuaW5nOiBzdHJpbmcpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGFsbCBub3RlcyBvZiB0aGUgdHJhbnMtdW5pdC5cclxuICAgICAqIE5vdGVzIGFyZSByZW1hcmtzIG1hZGUgYnkgYSB0cmFuc2xhdG9yLlxyXG4gICAgICogKGRlc2NyaXB0aW9uIGFuZCBtZWFuaW5nIGFyZSBub3QgaW5jbHVkZWQgaGVyZSEpXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IG5vdGVzKCk6IElOb3RlW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0LCB3ZXRoZXIgc2V0dGluZyBvZiBub3RlcyBpcyBzdXBwb3J0ZWQuXHJcbiAgICAgKiBJZiBub3QsIHNldE5vdGVzIHdpbGwgZG8gbm90aGluZy5cclxuICAgICAqIHh0YiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMsIGFsbCBvdGhlciBmb3JtYXRzIGRvLlxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBzdXBwb3J0c1NldE5vdGVzKCk6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgbm90ZXMgdG8gdHJhbnMgdW5pdC5cclxuICAgICAqIEBwYXJhbSBuZXdOb3RlcyB0aGUgbm90ZXMgdG8gYWRkLlxyXG4gICAgICogQHRocm93cyBhbiBFcnJvciBpZiBhbnkgbm90ZSBjb250YWlucyBkZXNjcHJpcHRpb24gb3IgbWVhbmluZyBhcyBmcm9tIGF0dHJpYnV0ZS5cclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3Qgc2V0Tm90ZXMobmV3Tm90ZXM6IElOb3RlW10pO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgbm90ZXNcclxuICAgICAqIEBwYXJhbSBuZXdOb3RlcyB0aGUgbm90ZXMgdG8gYWRkLlxyXG4gICAgICogQHRocm93cyBhbiBFcnJvciBpZiBhbnkgbm90ZSBjb250YWlucyBkZXNjcmlwdGlvbiBvciBtZWFuaW5nIGFzIGZyb20gYXR0cmlidXRlLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY2hlY2tOb3RlcyhuZXdOb3RlczogSU5vdGVbXSkge1xyXG4gICAgICAgIC8vIGNoZWNrIGZyb20gdmFsdWVzXHJcbiAgICAgICAgY29uc3QgZXJyb3JJbkZyb21Ob3RlID0gbmV3Tm90ZXMuZmluZCgobm90ZSkgPT4gbm90ZS5mcm9tID09PSAnZGVzY3JpcHRpb24nIHx8IG5vdGUuZnJvbSA9PT0gJ21lYW5pbmcnKTtcclxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGVycm9ySW5Gcm9tTm90ZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXNjcmlwdGlvbiBvciBtZWFuaW5nIGFyZSBub3QgYWxsb3dlZCBhcyBmcm9tIGF0dHRyaWJ1dGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVhbCB4bWwgZWxlbWVudCB1c2VkIGZvciB0aGUgdHJhbnMgdW5pdC5cclxuICAgICAqIChpbnRlcm5hbCB1c2FnZSBvbmx5LCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgbmVlZCB0aGlzKVxyXG4gICAgICogQHJldHVybiByZWFsIHhtbCBlbGVtZW50IHVzZWQgZm9yIHRoZSB0cmFucyB1bml0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXNYbWxFbGVtZW50KCk6IEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29weSBzb3VyY2UgdG8gdGFyZ2V0IHRvIHVzZSBpdCBhcyBkdW1teSB0cmFuc2xhdGlvbi5cclxuICAgICAqIFJldHVybnMgYSBjaGFuZ2VkIGNvcHkgb2YgdGhpcyB0cmFucyB1bml0LlxyXG4gICAgICogcmVjZWl2ZXIgaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgKiAoaW50ZXJuYWwgdXNhZ2Ugb25seSwgYSBjbGllbnQgc2hvdWxkIGNhbGwgaW1wb3J0TmV3VHJhbnNVbml0IG9uIElUcmFuc2xhdGlvbk1lc3NhZ2VGaWxlKVxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCBjbG9uZVdpdGhTb3VyY2VBc1RhcmdldChpc0RlZmF1bHRMYW5nOiBib29sZWFuLCBjb3B5Q29udGVudDogYm9vbGVhbiwgdGFyZ2V0RmlsZTogSVRyYW5zbGF0aW9uTWVzc2FnZXNGaWxlKTogQWJzdHJhY3RUcmFuc1VuaXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3B5IHNvdXJjZSB0byB0YXJnZXQgdG8gdXNlIGl0IGFzIGR1bW15IHRyYW5zbGF0aW9uLlxyXG4gICAgICogKGludGVybmFsIHVzYWdlIG9ubHksIGEgY2xpZW50IHNob3VsZCBjYWxsIGNyZWF0ZVRyYW5zbGF0aW9uRmlsZUZvckxhbmcgb24gSVRyYW5zbGF0aW9uTWVzc2FnZUZpbGUpXHJcbiAgICAgKi9cclxuICAgIGFic3RyYWN0IHVzZVNvdXJjZUFzVGFyZ2V0KGlzRGVmYXVsdExhbmc6IGJvb2xlYW4sIGNvcHlDb250ZW50OiBib29sZWFuKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zbGF0ZSB0aGUgdHJhbnMgdW5pdC5cclxuICAgICAqIEBwYXJhbSB0cmFuc2xhdGlvbiB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgb3IgKHByZWZlcnJlZCkgYSBub3JtYWxpemVkIG1lc3NhZ2UuXHJcbiAgICAgKiBUaGUgcHVyZSBzdHJpbmcgY2FuIGNvbnRhaW4gYW55IG1hcmt1cCBhbmQgd2lsbCBub3QgYmUgY2hlY2tlZC5cclxuICAgICAqIFNvIGl0IGNhbiBkYW1hZ2UgdGhlIGRvY3VtZW50LlxyXG4gICAgICogQSBub3JtYWxpemVkIG1lc3NhZ2UgcHJldmVudHMgdGhpcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRyYW5zbGF0ZSh0cmFuc2xhdGlvbjogc3RyaW5nIHwgSU5vcm1hbGl6ZWRNZXNzYWdlKSB7XHJcbiAgICAgICAgbGV0IHRyYW5zbGF0aW9uTmF0aXZlOiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKGlzU3RyaW5nKHRyYW5zbGF0aW9uKSkge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGlvbk5hdGl2ZSA9IDxzdHJpbmc+IHRyYW5zbGF0aW9uO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uTmF0aXZlID0gKDxJTm9ybWFsaXplZE1lc3NhZ2U+IHRyYW5zbGF0aW9uKS5hc05hdGl2ZVN0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZU5hdGl2ZSh0cmFuc2xhdGlvbk5hdGl2ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRUYXJnZXRTdGF0ZShTVEFURV9UUkFOU0xBVEVEKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBhIHBhcnNlciB1c2VkIGZvciBub3JtYWxpemVkIG1lc3NhZ2VzLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgbWVzc2FnZVBhcnNlcigpOiBBYnN0cmFjdE1lc3NhZ2VQYXJzZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0LCB3ZXRoZXIgbWVzc2FnZSBsb29rcyBsaWtlIElDVSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZVxyXG4gICAgICogQHJldHVybiB3ZXRoZXIgbWVzc2FnZSBsb29rcyBsaWtlIElDVSBtZXNzYWdlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNJQ1VNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VQYXJzZXIoKS5pc0lDVU1lc3NhZ2VTdGFydChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdHJhbnNsYXRpb24gdG8gYSBnaXZlbiBzdHJpbmcgKGluY2x1ZGluZyBtYXJrdXApLlxyXG4gICAgICogQHBhcmFtIHRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCB0cmFuc2xhdGVOYXRpdmUodHJhbnNsYXRpb246IHN0cmluZyk7XHJcbn1cclxuIl19