@datorama/akita
Version:
State Management Tailored-Made for JS Applications
336 lines • 23.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { AkitaPlugin } from '../plugin';
import { QueryEntity } from '../../queryEntity';
import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
import { distinctUntilChanged, map, skip } from 'rxjs/operators';
import { isUndefined } from '../../isUndefined';
import { coerceArray } from '../../coerceArray';
import { isFunction } from '../../isFunction';
import { logAction } from '../../actions';
/** @type {?} */
export var dirtyCheckDefaultParams = {
comparator: (/**
* @param {?} head
* @param {?} current
* @return {?}
*/
function (head, current) { return JSON.stringify(head) !== JSON.stringify(current); })
};
/**
* @param {?} nestedObj
* @param {?} path
* @return {?}
*/
export function getNestedPath(nestedObj, path) {
/** @type {?} */
var pathAsArray = path.split('.');
return pathAsArray.reduce((/**
* @param {?} obj
* @param {?} key
* @return {?}
*/
function (obj, key) { return (obj && obj[key] !== 'undefined' ? obj[key] : undefined); }), nestedObj);
}
/**
* @template State
*/
var /**
* @template State
*/
DirtyCheckPlugin = /** @class */ (function (_super) {
tslib_1.__extends(DirtyCheckPlugin, _super);
function DirtyCheckPlugin(query, params, _entityId) {
var _this = _super.call(this, query) || this;
_this.query = query;
_this.params = params;
_this._entityId = _entityId;
_this.dirty = new BehaviorSubject(false);
_this.active = false;
_this._reset = new Subject();
_this.isDirty$ = _this.dirty.asObservable().pipe(distinctUntilChanged());
_this.reset$ = _this._reset.asObservable();
_this.params = tslib_1.__assign({}, dirtyCheckDefaultParams, params);
if (_this.params.watchProperty) {
/** @type {?} */
var watchProp = (/** @type {?} */ (coerceArray(_this.params.watchProperty)));
if (query instanceof QueryEntity && watchProp.includes('entities') && !watchProp.includes('ids')) {
watchProp.push('ids');
}
_this.params.watchProperty = watchProp;
}
return _this;
}
/**
* @param {?=} params
* @return {?}
*/
DirtyCheckPlugin.prototype.reset = /**
* @param {?=} params
* @return {?}
*/
function (params) {
if (params === void 0) { params = {}; }
/** @type {?} */
var currentValue = this.head;
if (isFunction(params.updateFn)) {
if (this.isEntityBased(this._entityId)) {
currentValue = params.updateFn(this.head, ((/** @type {?} */ (this.getQuery()))).getEntity(this._entityId));
}
else {
currentValue = params.updateFn(this.head, ((/** @type {?} */ (this.getQuery()))).getValue());
}
}
logAction("@DirtyCheck - Revert");
this.updateStore(currentValue, this._entityId);
this._reset.next();
};
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
DirtyCheckPlugin.prototype.setHead = /**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
if (!(/** @type {?} */ (this)).active) {
(/** @type {?} */ (this)).activate();
(/** @type {?} */ (this)).active = true;
}
else {
(/** @type {?} */ (this)).head = (/** @type {?} */ (this))._getHead();
}
(/** @type {?} */ (this)).updateDirtiness(false);
return (/** @type {?} */ (this));
};
/**
* @return {?}
*/
DirtyCheckPlugin.prototype.isDirty = /**
* @return {?}
*/
function () {
return !!this.dirty.value;
};
/**
* @return {?}
*/
DirtyCheckPlugin.prototype.hasHead = /**
* @return {?}
*/
function () {
return !!this.getHead();
};
/**
* @return {?}
*/
DirtyCheckPlugin.prototype.destroy = /**
* @return {?}
*/
function () {
this.head = null;
this.subscription && this.subscription.unsubscribe();
this._reset && this._reset.complete();
};
/**
* @param {?} path
* @return {?}
*/
DirtyCheckPlugin.prototype.isPathDirty = /**
* @param {?} path
* @return {?}
*/
function (path) {
/** @type {?} */
var head = this.getHead();
/** @type {?} */
var current = ((/** @type {?} */ (this.getQuery()))).getValue();
/** @type {?} */
var currentPathValue = getNestedPath(current, path);
/** @type {?} */
var headPathValue = getNestedPath(head, path);
return this.params.comparator(currentPathValue, headPathValue);
};
/**
* @protected
* @return {?}
*/
DirtyCheckPlugin.prototype.getHead = /**
* @protected
* @return {?}
*/
function () {
return this.head;
};
/**
* @private
* @return {?}
*/
DirtyCheckPlugin.prototype.activate = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.head = this._getHead();
/**
* if we are tracking specific properties select only the relevant ones
* @type {?}
*/
var source = this.params.watchProperty
? ((/** @type {?} */ (this.params.watchProperty))).map((/**
* @param {?} prop
* @return {?}
*/
function (prop) {
return _this.query
.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state[prop]; }))
.pipe(map((/**
* @param {?} val
* @return {?}
*/
function (val) { return ({
val: val,
__akitaKey: prop
}); })));
}))
: [this.selectSource(this._entityId)];
this.subscription = combineLatest.apply(void 0, tslib_1.__spread(source)).pipe(skip(1))
.subscribe((/**
* @param {?} currentState
* @return {?}
*/
function (currentState) {
if (isUndefined(_this.head))
return;
/**
* __akitaKey is used to determine if we are tracking a specific property or a store change
* @type {?}
*/
var isChange = currentState.some((/**
* @param {?} state
* @return {?}
*/
function (state) {
/** @type {?} */
var head = state.__akitaKey ? _this.head[(/** @type {?} */ (state.__akitaKey))] : _this.head;
/** @type {?} */
var compareTo = state.__akitaKey ? state.val : state;
return _this.params.comparator(head, compareTo);
}));
_this.updateDirtiness(isChange);
}));
};
/**
* @private
* @param {?} isDirty
* @return {?}
*/
DirtyCheckPlugin.prototype.updateDirtiness = /**
* @private
* @param {?} isDirty
* @return {?}
*/
function (isDirty) {
this.dirty.next(isDirty);
};
/**
* @private
* @return {?}
*/
DirtyCheckPlugin.prototype._getHead = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var head = this.getSource(this._entityId);
if (this.params.watchProperty) {
head = this.getWatchedValues((/** @type {?} */ (head)));
}
return head;
};
/**
* @private
* @param {?} source
* @return {?}
*/
DirtyCheckPlugin.prototype.getWatchedValues = /**
* @private
* @param {?} source
* @return {?}
*/
function (source) {
return ((/** @type {?} */ (this.params.watchProperty))).reduce((/**
* @param {?} watched
* @param {?} prop
* @return {?}
*/
function (watched, prop) {
watched[prop] = source[prop];
return watched;
}), (/** @type {?} */ ({})));
};
return DirtyCheckPlugin;
}(AkitaPlugin));
/**
* @template State
*/
export { DirtyCheckPlugin };
if (false) {
/**
* @type {?}
* @private
*/
DirtyCheckPlugin.prototype.head;
/**
* @type {?}
* @private
*/
DirtyCheckPlugin.prototype.dirty;
/**
* @type {?}
* @private
*/
DirtyCheckPlugin.prototype.subscription;
/**
* @type {?}
* @private
*/
DirtyCheckPlugin.prototype.active;
/**
* @type {?}
* @private
*/
DirtyCheckPlugin.prototype._reset;
/** @type {?} */
DirtyCheckPlugin.prototype.isDirty$;
/** @type {?} */
DirtyCheckPlugin.prototype.reset$;
/**
* @type {?}
* @protected
*/
DirtyCheckPlugin.prototype.query;
/**
* @type {?}
* @private
*/
DirtyCheckPlugin.prototype.params;
/**
* @type {?}
* @private
*/
DirtyCheckPlugin.prototype._entityId;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlydHlDaGVja1BsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9ha2l0YS8iLCJzb3VyY2VzIjpbInNyYy9wbHVnaW5zL2RpcnR5Q2hlY2svZGlydHlDaGVja1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQVcsTUFBTSxXQUFXLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDekYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVcxQyxNQUFNLEtBQU8sdUJBQXVCLEdBQUc7SUFDckMsVUFBVTs7Ozs7SUFBRSxVQUFDLElBQUksRUFBRSxPQUFPLElBQUssT0FBQSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQWhELENBQWdELENBQUE7Q0FDaEY7Ozs7OztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsU0FBUyxFQUFFLElBQVk7O1FBQzdDLFdBQVcsR0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUM3QyxPQUFPLFdBQVcsQ0FBQyxNQUFNOzs7OztJQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENB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QUUsa0NBQXdDOzs7OztJQUFFLHFDQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFraXRhUGx1Z2luLCBRdWVyaWVzIH0gZnJvbSAnLi4vcGx1Z2luJztcbmltcG9ydCB7IFF1ZXJ5RW50aXR5IH0gZnJvbSAnLi4vLi4vcXVlcnlFbnRpdHknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHNraXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJy4uLy4uL2lzVW5kZWZpbmVkJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi4vLi4vcXVlcnknO1xuaW1wb3J0IHsgY29lcmNlQXJyYXkgfSBmcm9tICcuLi8uLi9jb2VyY2VBcnJheSc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi4vLi4vaXNGdW5jdGlvbic7XG5pbXBvcnQgeyBsb2dBY3Rpb24gfSBmcm9tICcuLi8uLi9hY3Rpb25zJztcblxudHlwZSBIZWFkPFN0YXRlID0gYW55PiA9IFN0YXRlIHwgUGFydGlhbDxTdGF0ZT47XG5cbmV4cG9ydCB0eXBlIERpcnR5Q2hlY2tDb21wYXJhdG9yPFN0YXRlPiA9IChoZWFkOiBTdGF0ZSwgY3VycmVudDogU3RhdGUpID0+IGJvb2xlYW47XG5cbmV4cG9ydCB0eXBlIERpcnR5Q2hlY2tQYXJhbXM8U3RvcmVTdGF0ZSA9IGFueT4gPSB7XG4gIGNvbXBhcmF0b3I/OiBEaXJ0eUNoZWNrQ29tcGFyYXRvcjxTdG9yZVN0YXRlPjtcbiAgd2F0Y2hQcm9wZXJ0eT86IGtleW9mIFN0b3JlU3RhdGUgfCAoa2V5b2YgU3RvcmVTdGF0ZSlbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXJ0eUNoZWNrRGVmYXVsdFBhcmFtcyA9IHtcbiAgY29tcGFyYXRvcjogKGhlYWQsIGN1cnJlbnQpID0+IEpTT04uc3RyaW5naWZ5KGhlYWQpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFBhdGgobmVzdGVkT2JqLCBwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGF0aEFzQXJyYXk6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLicpO1xuICByZXR1cm4gcGF0aEFzQXJyYXkucmVkdWNlKChvYmosIGtleSkgPT4gKG9iaiAmJiBvYmpba2V5XSAhPT0gJ3VuZGVmaW5lZCcgPyBvYmpba2V5XSA6IHVuZGVmaW5lZCksIG5lc3RlZE9iaik7XG59XG5cbmV4cG9ydCB0eXBlIERpcnR5Q2hlY2tSZXNldFBhcmFtczxTdG9yZVN0YXRlID0gYW55PiA9IHtcbiAgdXBkYXRlRm4/OiBTdG9yZVN0YXRlIHwgKChoZWFkOiBTdG9yZVN0YXRlLCBjdXJyZW50OiBTdG9yZVN0YXRlKSA9PiBhbnkpO1xufTtcblxuZXhwb3J0IGNsYXNzIERpcnR5Q2hlY2tQbHVnaW48U3RhdGUgPSBhbnk+IGV4dGVuZHMgQWtpdGFQbHVnaW48U3RhdGU+IHtcbiAgcHJpdmF0ZSBoZWFkOiBIZWFkPFN0YXRlPjtcbiAgcHJpdmF0ZSBkaXJ0eSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGFjdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXNldCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgaXNEaXJ0eSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmRpcnR5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHJlc2V0JCA9IHRoaXMuX3Jlc2V0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVyeTogUXVlcmllczxTdGF0ZT4sIHByaXZhdGUgcGFyYW1zPzogRGlydHlDaGVja1BhcmFtczxTdGF0ZT4sIHByaXZhdGUgX2VudGl0eUlkPzogYW55KSB7XG4gICAgc3VwZXIocXVlcnkpO1xuICAgIHRoaXMucGFyYW1zID0geyAuLi5kaXJ0eUNoZWNrRGVmYXVsdFBhcmFtcywgLi4ucGFyYW1zIH07XG4gICAgaWYgKHRoaXMucGFyYW1zLndhdGNoUHJvcGVydHkpIHtcbiAgICAgIGxldCB3YXRjaFByb3AgPSBjb2VyY2VBcnJheSh0aGlzLnBhcmFtcy53YXRjaFByb3BlcnR5KSBhcyBhbnlbXTtcbiAgICAgIGlmIChxdWVyeSBpbnN0YW5jZW9mIFF1ZXJ5RW50aXR5ICYmIHdhdGNoUHJvcC5pbmNsdWRlcygnZW50aXRpZXMnKSAmJiAhd2F0Y2hQcm9wLmluY2x1ZGVzKCdpZHMnKSkge1xuICAgICAgICB3YXRjaFByb3AucHVzaCgnaWRzJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmFtcy53YXRjaFByb3BlcnR5ID0gd2F0Y2hQcm9wO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KHBhcmFtczogRGlydHlDaGVja1Jlc2V0UGFyYW1zID0ge30pIHtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gdGhpcy5oZWFkO1xuICAgIGlmIChpc0Z1bmN0aW9uKHBhcmFtcy51cGRhdGVGbikpIHtcbiAgICAgIGlmICh0aGlzLmlzRW50aXR5QmFzZWQodGhpcy5fZW50aXR5SWQpKSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHBhcmFtcy51cGRhdGVGbih0aGlzLmhlYWQsICh0aGlzLmdldFF1ZXJ5KCkgYXMgUXVlcnlFbnRpdHk8U3RhdGU+KS5nZXRFbnRpdHkodGhpcy5fZW50aXR5SWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHBhcmFtcy51cGRhdGVGbih0aGlzLmhlYWQsICh0aGlzLmdldFF1ZXJ5KCkgYXMgUXVlcnk8U3RhdGU+KS5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nQWN0aW9uKGBARGlydHlDaGVjayAtIFJldmVydGApO1xuICAgIHRoaXMudXBkYXRlU3RvcmUoY3VycmVudFZhbHVlLCB0aGlzLl9lbnRpdHlJZCk7XG4gICAgdGhpcy5fcmVzZXQubmV4dCgpO1xuICB9XG5cbiAgc2V0SGVhZCgpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZCA9IHRoaXMuX2dldEhlYWQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEaXJ0aW5lc3MoZmFsc2UpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaXNEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRpcnR5LnZhbHVlO1xuICB9XG5cbiAgaGFzSGVhZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldEhlYWQoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiAmJiB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3Jlc2V0ICYmIHRoaXMuX3Jlc2V0LmNvbXBsZXRlKCk7XG4gIH1cblxuICBpc1BhdGhEaXJ0eShwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBoZWFkID0gdGhpcy5nZXRIZWFkKCk7XG4gICAgY29uc3QgY3VycmVudCA9ICh0aGlzLmdldFF1ZXJ5KCkgYXMgUXVlcnk8U3RhdGU+KS5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRQYXRoVmFsdWUgPSBnZXROZXN0ZWRQYXRoKGN1cnJlbnQsIHBhdGgpO1xuICAgIGNvbnN0IGhlYWRQYXRoVmFsdWUgPSBnZXROZXN0ZWRQYXRoKGhlYWQsIHBhdGgpO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmNvbXBhcmF0b3IoY3VycmVudFBhdGhWYWx1ZSwgaGVhZFBhdGhWYWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SGVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmhlYWQgPSB0aGlzLl9nZXRIZWFkKCk7XG4gICAgLyoqIGlmIHdlIGFyZSB0cmFja2luZyBzcGVjaWZpYyBwcm9wZXJ0aWVzIHNlbGVjdCBvbmx5IHRoZSByZWxldmFudCBvbmVzICovXG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5wYXJhbXMud2F0Y2hQcm9wZXJ0eVxuICAgICAgPyAodGhpcy5wYXJhbXMud2F0Y2hQcm9wZXJ0eSBhcyAoa2V5b2YgU3RhdGUpW10pLm1hcChwcm9wID0+XG4gICAgICAgICAgdGhpcy5xdWVyeVxuICAgICAgICAgICAgLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZVtwcm9wXSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAodmFsID0+ICh7XG4gICAgICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgICAgIF9fYWtpdGFLZXk6IHByb3BcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDogW3RoaXMuc2VsZWN0U291cmNlKHRoaXMuX2VudGl0eUlkKV07XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KC4uLnNvdXJjZSlcbiAgICAgIC5waXBlKHNraXAoMSkpXG4gICAgICAuc3Vic2NyaWJlKChjdXJyZW50U3RhdGU6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh0aGlzLmhlYWQpKSByZXR1cm47XG4gICAgICAgIC8qKiBfX2FraXRhS2V5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHdlIGFyZSB0cmFja2luZyBhIHNwZWNpZmljIHByb3BlcnR5IG9yIGEgc3RvcmUgY2hhbmdlICovXG4gICAgICAgIGNvbnN0IGlzQ2hhbmdlID0gY3VycmVudFN0YXRlLnNvbWUoc3RhdGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGhlYWQgPSBzdGF0ZS5fX2FraXRhS2V5ID8gdGhpcy5oZWFkW3N0YXRlLl9fYWtpdGFLZXkgYXMgYW55XSA6IHRoaXMuaGVhZDtcbiAgICAgICAgICBjb25zdCBjb21wYXJlVG8gPSBzdGF0ZS5fX2FraXRhS2V5ID8gc3RhdGUudmFsIDogc3RhdGU7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMuY29tcGFyYXRvcihoZWFkLCBjb21wYXJlVG8pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZURpcnRpbmVzcyhpc0NoYW5nZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlydGluZXNzKGlzRGlydHk6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpcnR5Lm5leHQoaXNEaXJ0eSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRIZWFkKCk6IEhlYWQ8U3RhdGU+IHtcbiAgICBsZXQgaGVhZDogSGVhZDxTdGF0ZT4gPSB0aGlzLmdldFNvdXJjZSh0aGlzLl9lbnRpdHlJZCk7XG4gICAgaWYgKHRoaXMucGFyYW1zLndhdGNoUHJvcGVydHkpIHtcbiAgICAgIGhlYWQgPSB0aGlzLmdldFdhdGNoZWRWYWx1ZXMoaGVhZCBhcyBTdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBoZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYXRjaGVkVmFsdWVzKHNvdXJjZTogU3RhdGUpOiBQYXJ0aWFsPFN0YXRlPiB7XG4gICAgcmV0dXJuICh0aGlzLnBhcmFtcy53YXRjaFByb3BlcnR5IGFzIChrZXlvZiBTdGF0ZSlbXSkucmVkdWNlKFxuICAgICAgKHdhdGNoZWQsIHByb3ApID0+IHtcbiAgICAgICAgd2F0Y2hlZFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgcmV0dXJuIHdhdGNoZWQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUGFydGlhbDxTdGF0ZT5cbiAgICApO1xuICB9XG59XG4iXX0=