@miracledevs/paradigm-web-angular
Version:
An angular wrapper with base functionality and helper services.
407 lines • 28.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*!
* Paradigm Framework - Angular Wrapper
* Copyright (c) 2017 Miracle Devs, Inc
* Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Angular/blob/master/LICENSE)
*/
import { Injectable } from '@angular/core';
import { ServiceBase } from './base.service';
import { Dictionary, ArrayList, Guid, ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared';
import { getMessageName } from '../decorators/message';
import * as i0 from "@angular/core";
/**
* Represents a message bus registration token.
* @template T
*/
var /**
* Represents a message bus registration token.
* @template T
*/
RegistrationToken = /** @class */ (function () {
/**
* Creates a new instance of @see RegistrationToken
* @param messageBus a reference to the message bus.
* @param type the message type.
*/
function RegistrationToken(messageBus, type) {
this.messageBus = messageBus;
this.innerType = type;
this.innerGuid = Guid.new();
}
Object.defineProperty(RegistrationToken.prototype, "type", {
/**
* Gets the message type.
*/
get: /**
* Gets the message type.
* @return {?}
*/
function () {
return this.innerType;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RegistrationToken.prototype, "guid", {
/**
* Gets the registration guid.
*/
get: /**
* Gets the registration guid.
* @return {?}
*/
function () {
return this.innerGuid;
},
enumerable: true,
configurable: true
});
/**
* Removes the callback from the message bus.
*/
/**
* Removes the callback from the message bus.
* @return {?}
*/
RegistrationToken.prototype.unregister = /**
* Removes the callback from the message bus.
* @return {?}
*/
function () {
this.messageBus.unregister(this);
};
return RegistrationToken;
}());
/**
* Represents a message bus registration token.
* @template T
*/
export { RegistrationToken };
if (false) {
/**
* A reference to the \@see MessageBusService.
* @type {?}
* @private
*/
RegistrationToken.prototype.messageBus;
/**
* The inner message type.
* @type {?}
* @private
*/
RegistrationToken.prototype.innerType;
/**
* A guid identifying this registration.
* @type {?}
* @private
*/
RegistrationToken.prototype.innerGuid;
}
/**
* Represents a message bus callback handler.
* It holds a method that must be called when certain
* message is received.
* @template T
*/
var /**
* Represents a message bus callback handler.
* It holds a method that must be called when certain
* message is received.
* @template T
*/
MessageBusHandler = /** @class */ (function () {
/**
* Creates a new instance of @see MessageBusHandler
* @param messageBus a reference to the message bus.
* @param type the message type.
* @param handler the message handler.
*/
function MessageBusHandler(messageBus, type, handler) {
this.innerHandler = handler;
this.innerToken = new RegistrationToken(messageBus, type);
}
Object.defineProperty(MessageBusHandler.prototype, "token", {
/**
* Gets the registration token that identifies this handler.
*/
get: /**
* Gets the registration token that identifies this handler.
* @return {?}
*/
function () { return this.innerToken; },
enumerable: true,
configurable: true
});
Object.defineProperty(MessageBusHandler.prototype, "handler", {
/**
* Gets the handler function that should be called when the message is received.
*/
get: /**
* Gets the handler function that should be called when the message is received.
* @return {?}
*/
function () { return this.innerHandler; },
enumerable: true,
configurable: true
});
return MessageBusHandler;
}());
/**
* Represents a message bus callback handler.
* It holds a method that must be called when certain
* message is received.
* @template T
*/
export { MessageBusHandler };
if (false) {
/**
* The registration token that identifies this handler.
* @type {?}
* @private
*/
MessageBusHandler.prototype.innerToken;
/**
* The handler or function that should be called when the message is received.
* @type {?}
* @private
*/
MessageBusHandler.prototype.innerHandler;
}
var MessageBusService = /** @class */ (function (_super) {
tslib_1.__extends(MessageBusService, _super);
/**
* Creates a new instance of @see MessageBusService
*/
function MessageBusService() {
var _this = _super.call(this) || this;
_this.handlers = new Dictionary();
return _this;
}
/**
* Gets the amount of messages registered.
*/
/**
* Gets the amount of messages registered.
* @return {?}
*/
MessageBusService.prototype.count = /**
* Gets the amount of messages registered.
* @return {?}
*/
function () {
return this.handlers.count();
};
/**
* Indicates if the given message type is registered and has handlers associated to it.
* @param messageType the message type.
*/
/**
* Indicates if the given message type is registered and has handlers associated to it.
* @template T
* @param {?} messageType the message type.
* @return {?}
*/
MessageBusService.prototype.isRegistered = /**
* Indicates if the given message type is registered and has handlers associated to it.
* @template T
* @param {?} messageType the message type.
* @return {?}
*/
function (messageType) {
/** @type {?} */
var type = getMessageName(messageType);
return this.handlers.containsKey(type);
};
/**
* Gets the amount of handler or observers a given message has.
* @param messageType the message type.
*/
/**
* Gets the amount of handler or observers a given message has.
* @template T
* @param {?} messageType the message type.
* @return {?}
*/
MessageBusService.prototype.handlerCount = /**
* Gets the amount of handler or observers a given message has.
* @template T
* @param {?} messageType the message type.
* @return {?}
*/
function (messageType) {
/** @type {?} */
var type = getMessageName(messageType);
if (!this.handlers.containsKey(type)) {
return 0;
}
return this.handlers.get(type).count();
};
/**
* Registers a new message handler.
* The handler will be called every time a message of @see messageType is called.
* @param messageType the message type.
* @param handler the message handler.
*/
/**
* Registers a new message handler.
* The handler will be called every time a message of \@see messageType is called.
* @template T
* @param {?} messageType the message type.
* @param {?} handler the message handler.
* @return {?}
*/
MessageBusService.prototype.register = /**
* Registers a new message handler.
* The handler will be called every time a message of \@see messageType is called.
* @template T
* @param {?} messageType the message type.
* @param {?} handler the message handler.
* @return {?}
*/
function (messageType, handler) {
/** @type {?} */
var type = getMessageName(messageType);
if (!this.handlers.containsKey(type)) {
this.handlers.add(type, new ArrayList());
}
/** @type {?} */
var messageBusHandler = new MessageBusHandler(this, messageType, handler);
this.handlers.get(type).add(messageBusHandler);
return messageBusHandler.token;
};
/**
* Removes a handler registration from the collection.
* @param token the registration token.
*/
/**
* Removes a handler registration from the collection.
* @template T
* @param {?} token the registration token.
* @return {?}
*/
MessageBusService.prototype.unregister = /**
* Removes a handler registration from the collection.
* @template T
* @param {?} token the registration token.
* @return {?}
*/
function (token) {
/** @type {?} */
var type = getMessageName(token.type);
if (!this.handlers.containsKey(type)) {
throw new Error('Token has been already unregistered.');
}
/** @type {?} */
var handler = this.handlers.get(type);
handler.removeAll((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.token.guid === token.guid; }));
if (!handler.any()) {
this.handlers.remove(type);
}
};
/**
* Unregisters all the message handlers.
*/
/**
* Unregisters all the message handlers.
* @return {?}
*/
MessageBusService.prototype.unregisterAll = /**
* Unregisters all the message handlers.
* @return {?}
*/
function () {
this.handlers.clear();
};
/**
* Sends a message to all the registered handlers.
* @param message the message to be sent.
* @param token if specified, the message will be sent only to one handler.
*/
/**
* Sends a message to all the registered handlers.
* @template T
* @param {?} message the message to be sent.
* @param {?=} token if specified, the message will be sent only to one handler.
* @return {?}
*/
MessageBusService.prototype.send = /**
* Sends a message to all the registered handlers.
* @template T
* @param {?} message the message to be sent.
* @param {?=} token if specified, the message will be sent only to one handler.
* @return {?}
*/
function (message, token) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var type, handlers, accepted, i, handler;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (ObjectExtensions.isNull(message)) {
throw new Error('Can not send a null message.');
}
if (ObjectExtensions.isNull(message.constructor)) {
throw new Error('Message does not have a constructor, and the system can not infer the type.');
}
type = getMessageName((/** @type {?} */ (message.constructor)));
if (!this.handlers.containsKey(type)) {
return [2 /*return*/, false];
}
handlers = this.handlers.get(type)
.where((/**
* @param {?} x
* @return {?}
*/
function (x) { return token == null || token.guid === x.token.guid; }))
.select((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.handler; }));
accepted = false;
i = (handlers.count() - 1);
_a.label = 1;
case 1:
if (!(i >= 0)) return [3 /*break*/, 4];
handler = handlers.get(i);
accepted = true;
return [4 /*yield*/, handler(message)];
case 2:
_a.sent();
_a.label = 3;
case 3:
i--;
return [3 /*break*/, 1];
case 4: return [2 /*return*/, accepted];
}
});
});
};
MessageBusService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
MessageBusService.ctorParameters = function () { return []; };
/** @nocollapse */ MessageBusService.ngInjectableDef = i0.defineInjectable({ factory: function MessageBusService_Factory() { return new MessageBusService(); }, token: MessageBusService, providedIn: "root" });
return MessageBusService;
}(ServiceBase));
export { MessageBusService };
if (false) {
/**
* A collection of message types and all their handlers or observers.
* @type {?}
* @private
*/
MessageBusService.prototype.handlers;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9tZXNzYWdlLWJ1cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQVF2RDs7Ozs7SUFpQ0k7Ozs7T0FJRztJQUNILDJCQUFZLFVBQTZCLEVBQUUsSUFBYTtRQUVwRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBdkJELHNCQUFJLG1DQUFJO1FBSFI7O1dBRUc7Ozs7O1FBQ0g7WUFFSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQzs7O09BQUE7SUFLRCxzQkFBSSxtQ0FBSTtRQUhSOztXQUVHOzs7OztRQUNIO1lBRUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLENBQUM7OztPQUFBO0lBY0Q7O09BRUc7Ozs7O0lBQ0gsc0NBQVU7Ozs7SUFBVjtRQUVJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDTCx3QkFBQztBQUFELENBQUMsQUFwREQsSUFvREM7Ozs7Ozs7Ozs7OztJQS9DRyx1Q0FBc0M7Ozs7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RCxNQUFNOzs7O3dCQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE9BQU8sRUFBVCxDQUFTLEVBQUM7d0JBRXZCLFFBQVEsR0FBRyxLQUFLO3dCQUVYLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Ozs2QkFBRSxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUE7d0JBRWpDLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIscUJBQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFBOzt3QkFBdEIsU0FBc0IsQ0FBQzs7O3dCQUprQixDQUFDLEVBQUUsQ0FBQTs7NEJBT2hELHNCQUFPLFFBQVEsRUFBQzs7OztLQUNuQjs7Z0JBOUlKLFVBQVUsU0FBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7Ozs7OzRCQWpIRDtDQThQQyxBQS9JRCxDQUd1QyxXQUFXLEdBNElqRDtTQTVJWSxpQkFBaUI7Ozs7Ozs7SUFLMUIscUNBQXdFIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLkFuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcbmltcG9ydCB7IERpY3Rpb25hcnksIEFycmF5TGlzdCwgR3VpZCwgT2JqZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0BtaXJhY2xlZGV2cy9wYXJhZGlnbS11aS13ZWItc2hhcmVkJztcbmltcG9ydCB7IGdldE1lc3NhZ2VOYW1lIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9tZXNzYWdlJztcblxuXG5leHBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBidXMgcmVnaXN0cmF0aW9uIHRva2VuLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uVG9rZW48VD5cbntcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQHNlZSBNZXNzYWdlQnVzU2VydmljZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlubmVyIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyVHlwZTogVHlwZTxUPjtcblxuICAgIC8qKlxuICAgICAqIEEgZ3VpZCBpZGVudGlmeWluZyB0aGlzIHJlZ2lzdHJhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyR3VpZDogR3VpZDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpOiBUeXBlPFQ+XG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lclR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcmVnaXN0cmF0aW9uIGd1aWQuXG4gICAgICovXG4gICAgZ2V0IGd1aWQoKTogR3VpZFxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJHdWlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBSZWdpc3RyYXRpb25Ub2tlblxuICAgICAqIEBwYXJhbSBtZXNzYWdlQnVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtZXNzYWdlIGJ1cy5cbiAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlLCB0eXBlOiBUeXBlPFQ+KVxuICAgIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy5pbm5lclR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlubmVyR3VpZCA9IEd1aWQubmV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgbWVzc2FnZSBidXMuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcigpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMudW5yZWdpc3Rlcih0aGlzKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgYnVzIGNhbGxiYWNrIGhhbmRsZXIuXG4gKiBJdCBob2xkcyBhIG1ldGhvZCB0aGF0IG11c3QgYmUgY2FsbGVkIHdoZW4gY2VydGFpblxuICogbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2VCdXNIYW5kbGVyPFQ+XG57XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lzdHJhdGlvbiB0b2tlbiB0aGF0IGlkZW50aWZpZXMgdGhpcyBoYW5kbGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5uZXJUb2tlbjogUmVnaXN0cmF0aW9uVG9rZW48VD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGFuZGxlciBvciBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVySGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8VD47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByZWdpc3RyYXRpb24gdG9rZW4gdGhhdCBpZGVudGlmaWVzIHRoaXMgaGFuZGxlci5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKTogUmVnaXN0cmF0aW9uVG9rZW48VD4geyByZXR1cm4gdGhpcy5pbm5lclRva2VuOyB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIGdldCBoYW5kbGVyKCk6IE1lc3NhZ2VIYW5kbGVyPFQ+IHsgcmV0dXJuIHRoaXMuaW5uZXJIYW5kbGVyOyB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgTWVzc2FnZUJ1c0hhbmRsZXJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1cyBhIHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZSBidXMuXG4gICAgICogQHBhcmFtIHR5cGUgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlLCB0eXBlOiBUeXBlPFQ+LCBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPilcbiAgICB7XG4gICAgICAgIHRoaXMuaW5uZXJIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy5pbm5lclRva2VuID0gbmV3IFJlZ2lzdHJhdGlvblRva2VuKG1lc3NhZ2VCdXMsIHR5cGUpO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlQnVzU2VydmljZSBleHRlbmRzIFNlcnZpY2VCYXNlXG57XG4gICAgLyoqXG4gICAgICogQSBjb2xsZWN0aW9uIG9mIG1lc3NhZ2UgdHlwZXMgYW5kIGFsbCB0aGVpciBoYW5kbGVycyBvciBvYnNlcnZlcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVyczogRGljdGlvbmFyeTxzdHJpbmcsIEFycmF5TGlzdDxNZXNzYWdlQnVzSGFuZGxlcjxhbnk+Pj47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgTWVzc2FnZUJ1c1NlcnZpY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBBcnJheUxpc3Q8TWVzc2FnZUJ1c0hhbmRsZXI8YW55Pj4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYW1vdW50IG9mIG1lc3NhZ2VzIHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgY291bnQoKTogbnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5jb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2l2ZW4gbWVzc2FnZSB0eXBlIGlzIHJlZ2lzdGVyZWQgYW5kIGhhcyBoYW5kbGVycyBhc3NvY2lhdGVkIHRvIGl0LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGlzUmVnaXN0ZXJlZDxUPihtZXNzYWdlVHlwZTogVHlwZTxUPik6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRNZXNzYWdlTmFtZShtZXNzYWdlVHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmNvbnRhaW5zS2V5KHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFtb3VudCBvZiBoYW5kbGVyIG9yIG9ic2VydmVycyBhIGdpdmVuIG1lc3NhZ2UgaGFzLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGhhbmRsZXJDb3VudDxUPihtZXNzYWdlVHlwZTogVHlwZTxUPik6IG51bWJlclxuICAgIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldE1lc3NhZ2VOYW1lKG1lc3NhZ2VUeXBlKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuY29udGFpbnNLZXkodHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGUpLmNvdW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbmV3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICAgKiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgbWVzc2FnZSBvZiBAc2VlIG1lc3NhZ2VUeXBlIGlzIGNhbGxlZC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZVR5cGUgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyPFQ+KG1lc3NhZ2VUeXBlOiBUeXBlPFQ+LCBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPik6IFJlZ2lzdHJhdGlvblRva2VuPFQ+XG4gICAge1xuICAgICAgICBjb25zdCB0eXBlID0gZ2V0TWVzc2FnZU5hbWUobWVzc2FnZVR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5jb250YWluc0tleSh0eXBlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5hZGQodHlwZSwgbmV3IEFycmF5TGlzdDxNZXNzYWdlQnVzSGFuZGxlcjxUPj4oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlQnVzSGFuZGxlciA9IG5ldyBNZXNzYWdlQnVzSGFuZGxlcih0aGlzLCBtZXNzYWdlVHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGUpLmFkZChtZXNzYWdlQnVzSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdXNIYW5kbGVyLnRva2VuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB0b2tlbiB0aGUgcmVnaXN0cmF0aW9uIHRva2VuLlxuICAgICAqL1xuICAgIHVucmVnaXN0ZXI8VD4odG9rZW46IFJlZ2lzdHJhdGlvblRva2VuPFQ+KTogdm9pZFxuICAgIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldE1lc3NhZ2VOYW1lKHRva2VuLnR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5jb250YWluc0tleSh0eXBlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBoYXMgYmVlbiBhbHJlYWR5IHVucmVnaXN0ZXJlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmdldCh0eXBlKTtcbiAgICAgICAgaGFuZGxlci5yZW1vdmVBbGwoeCA9PiB4LnRva2VuLmd1aWQgPT09IHRva2VuLmd1aWQpO1xuXG4gICAgICAgIGlmICghaGFuZGxlci5hbnkoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5yZW1vdmUodHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyBhbGwgdGhlIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAgICovXG4gICAgdW5yZWdpc3RlckFsbCgpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBzZW50LlxuICAgICAqIEBwYXJhbSB0b2tlbiBpZiBzcGVjaWZpZWQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCBvbmx5IHRvIG9uZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmQ8VD4obWVzc2FnZTogVCwgdG9rZW4/OiBSZWdpc3RyYXRpb25Ub2tlbjxUPik6IFByb21pc2U8Ym9vbGVhbj5cbiAgICB7XG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChtZXNzYWdlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNlbmQgYSBudWxsIG1lc3NhZ2UuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0RXh0ZW5zaW9ucy5pc051bGwobWVzc2FnZS5jb25zdHJ1Y3RvcikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IsIGFuZCB0aGUgc3lzdGVtIGNhbiBub3QgaW5mZXIgdGhlIHR5cGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlID0gZ2V0TWVzc2FnZU5hbWUobWVzc2FnZS5jb25zdHJ1Y3RvciBhcyBUeXBlPFQ+KTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuY29udGFpbnNLZXkodHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQodHlwZSlcbiAgICAgICAgICAgIC53aGVyZSh4ID0+IHRva2VuID09IG51bGwgfHwgdG9rZW4uZ3VpZCA9PT0geC50b2tlbi5ndWlkKVxuICAgICAgICAgICAgLnNlbGVjdCh4ID0+IHguaGFuZGxlcik7XG5cbiAgICAgICAgbGV0IGFjY2VwdGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IChoYW5kbGVycy5jb3VudCgpIC0gMSk7IGkgPj0gMDsgaS0tKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMuZ2V0KGkpO1xuICAgICAgICAgICAgYWNjZXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlcihtZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2NlcHRlZDtcbiAgICB9XG59XG4iXX0=