UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

647 lines 33.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { BehaviorSubject } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { assertStoreHasName } from './errors'; import { commit, isTransactionInProcess } from './transaction'; import { deepFreeze } from './deepFreeze'; import { configKey } from './storeConfig'; import { getAkitaConfig } from './config'; import { isPlainObject } from './isPlainObject'; import { isFunction } from './isFunction'; import { dispatchAdded, dispatchDeleted, dispatchUpdate } from './dispatchers'; import { __stores__ } from './stores'; import { resetCustomAction, setAction } from './actions'; import { isNotBrowser } from './root'; import { __DEV__, isDev } from './env'; /** * * Store for managing any type of data * * \@example * * export interface SessionState { * token: string; * userDetails: UserDetails * } * * export function createInitialState(): SessionState { * return { * token: '', * userDetails: null * }; * } * * \@StoreConfig({ name: 'session' }) * export class SessionStore extends Store<SessionState> { * constructor() { * super(createInitialState()); * } * } * @template S */ var /** * * Store for managing any type of data * * \@example * * export interface SessionState { * token: string; * userDetails: UserDetails * } * * export function createInitialState(): SessionState { * return { * token: '', * userDetails: null * }; * } * * \@StoreConfig({ name: 'session' }) * export class SessionStore extends Store<SessionState> { * constructor() { * super(createInitialState()); * } * } * @template S */ Store = /** @class */ (function () { function Store(initialState, options) { if (options === void 0) { options = {}; } this.options = options; this.inTransaction = false; this.cache = { active: new BehaviorSubject(false), ttl: null }; this.onInit((/** @type {?} */ (initialState))); } /** * Set the loading state * * @example * * store.setLoading(true) * */ /** * Set the loading state * * \@example * * store.setLoading(true) * * @param {?=} loading * @return {?} */ Store.prototype.setLoading = /** * Set the loading state * * \@example * * store.setLoading(true) * * @param {?=} loading * @return {?} */ function (loading) { if (loading === void 0) { loading = false; } if (loading !== ((/** @type {?} */ (this._value()))).loading) { isDev() && setAction('Set Loading'); this._setState((/** * @param {?} state * @return {?} */ function (state) { return ((/** @type {?} */ (tslib_1.__assign({}, state, { loading: loading })))); })); } }; /** * * Set whether the data is cached * * @example * * store.setHasCache(true) * store.setHasCache(false) * store.setHasCache(true, { restartTTL: true }) * */ /** * * Set whether the data is cached * * \@example * * store.setHasCache(true) * store.setHasCache(false) * store.setHasCache(true, { restartTTL: true }) * * @param {?} hasCache * @param {?=} options * @return {?} */ Store.prototype.setHasCache = /** * * Set whether the data is cached * * \@example * * store.setHasCache(true) * store.setHasCache(false) * store.setHasCache(true, { restartTTL: true }) * * @param {?} hasCache * @param {?=} options * @return {?} */ function (hasCache, options) { var _this = this; if (options === void 0) { options = { restartTTL: false }; } if (hasCache !== this.cache.active.value) { this.cache.active.next(hasCache); } if (options.restartTTL) { /** @type {?} */ var ttlConfig = this.cacheConfig && this.cacheConfig.ttl; if (ttlConfig) { if (this.cache.ttl !== null) { clearTimeout(this.cache.ttl); } this.cache.ttl = (/** @type {?} */ (setTimeout((/** * @return {?} */ function () { return _this.setHasCache(false); }), ttlConfig))); } } }; /** * Set the error state * * @example * * store.setError({text: 'unable to load data' }) * */ /** * Set the error state * * \@example * * store.setError({text: 'unable to load data' }) * * @template T * @param {?} error * @return {?} */ Store.prototype.setError = /** * Set the error state * * \@example * * store.setError({text: 'unable to load data' }) * * @template T * @param {?} error * @return {?} */ function (error) { if (error !== ((/** @type {?} */ (this._value()))).error) { isDev() && setAction('Set Error'); this._setState((/** * @param {?} state * @return {?} */ function (state) { return ((/** @type {?} */ (tslib_1.__assign({}, state, { error: error })))); })); } }; // @internal // @internal /** * @template R * @param {?} project * @return {?} */ Store.prototype._select = // @internal /** * @template R * @param {?} project * @return {?} */ function (project) { return this.store.asObservable().pipe(map(project), distinctUntilChanged()); }; // @internal // @internal /** * @return {?} */ Store.prototype._value = // @internal /** * @return {?} */ function () { return this.storeValue; }; // @internal // @internal /** * @return {?} */ Store.prototype._cache = // @internal /** * @return {?} */ function () { return this.cache.active; }; Object.defineProperty(Store.prototype, "config", { // @internal get: // @internal /** * @return {?} */ function () { return this.constructor[configKey] || {}; }, enumerable: true, configurable: true }); Object.defineProperty(Store.prototype, "storeName", { // @internal get: // @internal /** * @return {?} */ function () { return ((/** @type {?} */ (this.config))).storeName || ((/** @type {?} */ (this.options))).storeName || this.options.name; }, enumerable: true, configurable: true }); Object.defineProperty(Store.prototype, "deepFreeze", { // @internal get: // @internal /** * @return {?} */ function () { return this.config.deepFreezeFn || this.options.deepFreezeFn || deepFreeze; }, enumerable: true, configurable: true }); Object.defineProperty(Store.prototype, "cacheConfig", { // @internal get: // @internal /** * @return {?} */ function () { return this.config.cache || this.options.cache; }, enumerable: true, configurable: true }); Object.defineProperty(Store.prototype, "resettable", { // @internal get: // @internal /** * @return {?} */ function () { return this.config.resettable || this.options.resettable; }, enumerable: true, configurable: true }); // @internal // @internal /** * @param {?} newStateFn * @param {?=} _dispatchAction * @return {?} */ Store.prototype._setState = // @internal /** * @param {?} newStateFn * @param {?=} _dispatchAction * @return {?} */ function (newStateFn, _dispatchAction) { if (_dispatchAction === void 0) { _dispatchAction = true; } this.storeValue = __DEV__ ? this.deepFreeze(newStateFn(this._value())) : newStateFn(this._value()); if (!this.store) { this.store = new BehaviorSubject(this.storeValue); return; } if (isTransactionInProcess()) { this.handleTransaction(); return; } this.dispatch(this.storeValue, _dispatchAction); }; /** * * Reset the current store back to the initial value * * @example * * store.reset() * */ /** * * Reset the current store back to the initial value * * \@example * * store.reset() * * @return {?} */ Store.prototype.reset = /** * * Reset the current store back to the initial value * * \@example * * store.reset() * * @return {?} */ function () { var _this = this; if (this.isResettable()) { isDev() && setAction('Reset'); this._setState((/** * @return {?} */ function () { return Object.assign({}, _this._initialState); })); this.setHasCache(false); } else { isDev() && console.warn("You need to enable the reset functionality"); } }; /** * @param {?} stateOrCallback * @return {?} */ Store.prototype.update = /** * @param {?} stateOrCallback * @return {?} */ function (stateOrCallback) { var _this = this; isDev() && setAction('Update'); this._setState((/** * @param {?} state * @return {?} */ function (state) { /** @type {?} */ var newState = isFunction(stateOrCallback) ? stateOrCallback(state) : stateOrCallback; /** @type {?} */ var merged = _this.akitaPreUpdate(state, (/** @type {?} */ (tslib_1.__assign({}, state, newState)))); return isPlainObject(state) ? merged : new ((/** @type {?} */ (state))).constructor(merged); })); }; /** * @param {?} newOptions * @return {?} */ Store.prototype.updateStoreConfig = /** * @param {?} newOptions * @return {?} */ function (newOptions) { this.options = tslib_1.__assign({}, this.options, newOptions); }; // @internal // @internal /** * @param {?} _ * @param {?} nextState * @return {?} */ Store.prototype.akitaPreUpdate = // @internal /** * @param {?} _ * @param {?} nextState * @return {?} */ function (_, nextState) { return nextState; }; /** * @return {?} */ Store.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroy(); }; /** * * Destroy the store * * @example * * store.destroy() * */ /** * * Destroy the store * * \@example * * store.destroy() * * @return {?} */ Store.prototype.destroy = /** * * Destroy the store * * \@example * * store.destroy() * * @return {?} */ function () { if (isNotBrowser) return; if (!((/** @type {?} */ (window))).hmrEnabled && this === __stores__[this.storeName]) { delete __stores__[this.storeName]; dispatchDeleted(this.storeName); this.setHasCache(false); this.cache.active.complete(); } }; /** * @private * @param {?} initialState * @return {?} */ Store.prototype.onInit = /** * @private * @param {?} initialState * @return {?} */ function (initialState) { __stores__[this.storeName] = this; this._setState((/** * @return {?} */ function () { return initialState; })); dispatchAdded(this.storeName); if (this.isResettable()) { this._initialState = initialState; } isDev() && assertStoreHasName(this.storeName, this.constructor.name); }; /** * @private * @param {?} state * @param {?=} _dispatchAction * @return {?} */ Store.prototype.dispatch = /** * @private * @param {?} state * @param {?=} _dispatchAction * @return {?} */ function (state, _dispatchAction) { if (_dispatchAction === void 0) { _dispatchAction = true; } this.store.next(state); if (_dispatchAction) { dispatchUpdate(this.storeName); resetCustomAction(); } }; /** * @private * @return {?} */ Store.prototype.watchTransaction = /** * @private * @return {?} */ function () { var _this = this; commit().subscribe((/** * @return {?} */ function () { _this.inTransaction = false; _this.dispatch(_this._value()); })); }; /** * @private * @return {?} */ Store.prototype.isResettable = /** * @private * @return {?} */ function () { if (this.resettable === false) { return false; } return this.resettable || getAkitaConfig().resettable; }; /** * @private * @return {?} */ Store.prototype.handleTransaction = /** * @private * @return {?} */ function () { if (!this.inTransaction) { this.watchTransaction(); this.inTransaction = true; } }; return Store; }()); /** * * Store for managing any type of data * * \@example * * export interface SessionState { * token: string; * userDetails: UserDetails * } * * export function createInitialState(): SessionState { * return { * token: '', * userDetails: null * }; * } * * \@StoreConfig({ name: 'session' }) * export class SessionStore extends Store<SessionState> { * constructor() { * super(createInitialState()); * } * } * @template S */ export { Store }; if (false) { /** * @type {?} * @private */ Store.prototype.store; /** * @type {?} * @private */ Store.prototype.storeValue; /** * @type {?} * @private */ Store.prototype.inTransaction; /** * @type {?} * @private */ Store.prototype._initialState; /** * @type {?} * @protected */ Store.prototype.cache; /** * @type {?} * @protected */ Store.prototype.options; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvIiwic291cmNlcyI6WyJzcmMvc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQnZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFVRSxlQUFZLFlBQXdCLEVBQVksT0FBeUM7UUFBekMsd0JBQUEsRUFBQSxZQUF5QztRQUF6QyxZQUFPLEdBQVAsT0FBTyxDQUFrQztRQVBqRixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUVwQixVQUFLLEdBQWU7WUFDNUIsTUFBTSxFQUFFLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQztZQUMzQyxHQUFHLEVBQUUsSUFBSTtTQUNWLENBQUM7UUFHQSxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFBLFlBQVksRUFBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7Ozs7Ozs7Ozs7O0lBQ0gsMEJBQVU7Ozs7Ozs7Ozs7SUFBVixVQUFXLE9BQWU7UUFBZix3QkFBQSxFQUFBLGVBQWU7UUFDeEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxtQkFBQSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQTRCLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDbkUsS0FBSyxFQUFFLElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxTQUFTOzs7O1lBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxDQUFDLHdDQUFLLEtBQUssSUFBRSxPQUFPLFNBQUEsS0FBOEIsQ0FBQyxFQUFuRCxDQUFtRCxFQUFDLENBQUM7U0FDOUU7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRzs7Ozs7Ozs7Ozs7Ozs7O0lBQ0gsMkJBQVc7Ozs7Ozs7Ozs7Ozs7O0lBQVgsVUFBWSxRQUFpQixFQUFFLE9BQXdEO1FBQXZGLGlCQWNDO1FBZDhCLHdCQUFBLEVBQUEsWUFBcUMsVUFBVSxFQUFFLEtBQUssRUFBRTtRQUNyRixJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFOztnQkFDaEIsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHO1lBQzFELElBQUksU0FBUyxFQUFFO2dCQUNiLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFO29CQUMzQixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDOUI7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsbUJBQUssVUFBVTs7O2dCQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUF2QixDQUF1QixHQUFFLFNBQVMsQ0FBQyxFQUFBLENBQUM7YUFDNUU7U0FDRjtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HOzs7Ozs7Ozs7Ozs7SUFDSCx3QkFBUTs7Ozs7Ozs7Ozs7SUFBUixVQUFZLEtBQVE7UUFDbEIsSUFBSSxLQUFLLEtBQUssQ0FBQyxtQkFBQSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQXNCLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDekQsS0FBSyxFQUFFLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTOzs7O1lBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxDQUFDLHdDQUFLLEtBQUssSUFBRSxLQUFLLE9BQUEsS0FBd0IsQ0FBQyxFQUEzQyxDQUEyQyxFQUFDLENBQUM7U0FDdEU7SUFDSCxDQUFDO0lBRUQsWUFBWTs7Ozs7OztJQUNaLHVCQUFPOzs7Ozs7O0lBQVAsVUFBVyxPQUF3QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUNuQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQ1osb0JBQW9CLEVBQUUsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUFZOzs7OztJQUNaLHNCQUFNOzs7OztJQUFOO1FBQ0UsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxZQUFZOzs7OztJQUNaLHNCQUFNOzs7OztJQUFOO1FBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBR0Qsc0JBQUkseUJBQU07UUFEVixZQUFZOzs7Ozs7UUFDWjtZQUNFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0MsQ0FBQzs7O09BQUE7SUFHRCxzQkFBSSw0QkFBUztRQURiLFlBQVk7Ozs7OztRQUNaO1lBQ0UsT0FBTyxDQUFDLG1CQUFBLElBQUksQ0FBQyxNQUFNLEVBQThDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxtQkFBQSxJQUFJLENBQUMsT0FBTyxFQUE4QyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzlLLENBQUM7OztPQUFBO0lBR0Qsc0JBQUksNkJBQVU7UUFEZCxZQUFZOzs7Ozs7UUFDWjtZQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDO1FBQzdFLENBQUM7OztPQUFBO0lBR0Qsc0JBQUksOEJBQVc7UUFEZixZQUFZOzs7Ozs7UUFDWjtZQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDakQsQ0FBQzs7O09BQUE7SUFHRCxzQkFBSSw2QkFBVTtRQURkLFlBQVk7Ozs7OztRQUNaO1lBQ0UsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUMzRCxDQUFDOzs7T0FBQTtJQUVELFlBQVk7Ozs7Ozs7SUFDWix5QkFBUzs7Ozs7OztJQUFULFVBQVUsVUFBcUMsRUFBRSxlQUFzQjtRQUF0QixnQ0FBQSxFQUFBLHNCQUFzQjtRQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRW5HLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsT0FBTztTQUNSO1FBRUQsSUFBSSxzQkFBc0IsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7Ozs7Ozs7Ozs7O0lBQ0gscUJBQUs7Ozs7Ozs7Ozs7SUFBTDtRQUFBLGlCQVFDO1FBUEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDdkIsS0FBSyxFQUFFLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTOzs7WUFBQyxjQUFNLE9BQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSSxDQUFDLGFBQWEsQ0FBQyxFQUFyQyxDQUFxQyxFQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0wsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQzs7Ozs7SUFvQkQsc0JBQU07Ozs7SUFBTixVQUFPLGVBQW9EO1FBQTNELGlCQVFDO1FBUEMsS0FBSyxFQUFFLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxTQUFTOzs7O1FBQUMsVUFBQSxLQUFLOztnQkFDWixRQUFRLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWU7O2dCQUNqRixNQUFNLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsd0NBQUssS0FBSyxFQUFLLFFBQVEsR0FBTyxDQUFDO1lBQ3pFLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBQSxLQUFLLEVBQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQsaUNBQWlCOzs7O0lBQWpCLFVBQWtCLFVBQXVDO1FBQ3ZELElBQUksQ0FBQyxPQUFPLHdCQUFRLElBQUksQ0FBQyxPQUFPLEVBQUssVUFBVSxDQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELFlBQVk7Ozs7Ozs7SUFDWiw4QkFBYzs7Ozs7OztJQUFkLFVBQWUsQ0FBYyxFQUFFLFNBQXNCO1FBQ25ELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Ozs7SUFFRCwyQkFBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHOzs7Ozs7Ozs7OztJQUNILHVCQUFPOzs7Ozs7Ozs7O0lBQVA7UUFDRSxJQUFJLFlBQVk7WUFBRSxPQUFPO1FBQ3pCLElBQUksQ0FBQyxDQUFDLG1CQUFBLE1BQU0sRUFBTyxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUksS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3RFLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDOUI7SUFDSCxDQUFDOzs7Ozs7SUFFTyxzQkFBTTs7Ozs7SUFBZCxVQUFlLFlBQWU7UUFDNUIsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLFNBQVM7OztRQUFDLGNBQU0sT0FBQSxZQUFZLEVBQVosQ0FBWSxFQUFDLENBQUM7UUFDbkMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztTQUNuQztRQUNELEtBQUssRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RSxDQUFDOzs7Ozs7O0lBRU8sd0JBQVE7Ozs7OztJQUFoQixVQUFpQixLQUFRLEVBQUUsZUFBc0I7UUFBdEIsZ0NBQUEsRUFBQSxzQkFBc0I7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxlQUFlLEVBQUU7WUFDbkIsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQixpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQzs7Ozs7SUFFTyxnQ0FBZ0I7Ozs7SUFBeEI7UUFBQSxpQkFLQztRQUpDLE1BQU0sRUFBRSxDQUFDLFNBQVM7OztRQUFDO1lBQ2pCLEtBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLEtBQUksQ0FBQyxRQUFRLENBQUMsS0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7OztJQUVPLDRCQUFZOzs7O0lBQXBCO1FBQ0UsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRTtZQUM3QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLGNBQWMsRUFBRSxDQUFDLFVBQVUsQ0FBQztJQUN4RCxDQUFDOzs7OztJQUVPLGlDQUFpQjs7OztJQUF6QjtRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUNILFlBQUM7QUFBRCxDQUFDLEFBeFBELElBd1BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF2UEMsc0JBQTRDOzs7OztJQUM1QywyQkFBc0I7Ozs7O0lBQ3RCLDhCQUE4Qjs7Ozs7SUFDOUIsOEJBQXlCOzs7OztJQUN6QixzQkFHRTs7Ozs7SUFFb0Msd0JBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RvcmVDYWNoZSwgVXBkYXRlU3RhdGVDYWxsYmFjayB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgYXNzZXJ0U3RvcmVIYXNOYW1lIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgY29tbWl0LCBpc1RyYW5zYWN0aW9uSW5Qcm9jZXNzIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSAnLi9kZWVwRnJlZXplJztcbmltcG9ydCB7IGNvbmZpZ0tleSwgU3RvcmVDb25maWdPcHRpb25zLCBVcGRhdGFibGVTdG9yZUNvbmZpZ09wdGlvbnMgfSBmcm9tICcuL3N0b3JlQ29uZmlnJztcbmltcG9ydCB7IGdldEFraXRhQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gJy4vaXNQbGFpbk9iamVjdCc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pc0Z1bmN0aW9uJztcbmltcG9ydCB7IGRpc3BhdGNoQWRkZWQsIGRpc3BhdGNoRGVsZXRlZCwgZGlzcGF0Y2hVcGRhdGUgfSBmcm9tICcuL2Rpc3BhdGNoZXJzJztcbmltcG9ydCB7IF9fc3RvcmVzX18gfSBmcm9tICcuL3N0b3Jlcyc7XG5pbXBvcnQgeyByZXNldEN1c3RvbUFjdGlvbiwgc2V0QWN0aW9uIH0gZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCB7IGlzTm90QnJvd3NlciB9IGZyb20gJy4vcm9vdCc7XG5pbXBvcnQgeyBfX0RFVl9fLCBpc0RldiB9IGZyb20gJy4vZW52JztcblxuLyoqXG4gKlxuICogU3RvcmUgZm9yIG1hbmFnaW5nIGFueSB0eXBlIG9mIGRhdGFcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblN0YXRlIHtcbiAqICAgdG9rZW46IHN0cmluZztcbiAqICAgdXNlckRldGFpbHM6IFVzZXJEZXRhaWxzXG4gKiB9XG4gKlxuICogZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZSgpOiBTZXNzaW9uU3RhdGUge1xuICogIHJldHVybiB7XG4gKiAgICB0b2tlbjogJycsXG4gKiAgICB1c2VyRGV0YWlsczogbnVsbFxuICogIH07XG4gKiB9XG4gKlxuICogQFN0b3JlQ29uZmlnKHsgbmFtZTogJ3Nlc3Npb24nIH0pXG4gKiBleHBvcnQgY2xhc3MgU2Vzc2lvblN0b3JlIGV4dGVuZHMgU3RvcmU8U2Vzc2lvblN0YXRlPiB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgc3VwZXIoY3JlYXRlSW5pdGlhbFN0YXRlKCkpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yZTxTID0gYW55PiB7XG4gIHByaXZhdGUgc3RvcmU6IEJlaGF2aW9yU3ViamVjdDxSZWFkb25seTxTPj47XG4gIHByaXZhdGUgc3RvcmVWYWx1ZTogUztcbiAgcHJpdmF0ZSBpblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogUztcbiAgcHJvdGVjdGVkIGNhY2hlOiBTdG9yZUNhY2hlID0ge1xuICAgIGFjdGl2ZTogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgdHRsOiBudWxsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFN0YXRlOiBQYXJ0aWFsPFM+LCBwcm90ZWN0ZWQgb3B0aW9uczogUGFydGlhbDxTdG9yZUNvbmZpZ09wdGlvbnM+ID0ge30pIHtcbiAgICB0aGlzLm9uSW5pdChpbml0aWFsU3RhdGUgYXMgUyk7XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgbG9hZGluZyBzdGF0ZVxuICAgKlxuICAgKiAgQGV4YW1wbGVcbiAgICpcbiAgICogIHN0b3JlLnNldExvYWRpbmcodHJ1ZSlcbiAgICpcbiAgICovXG4gIHNldExvYWRpbmcobG9hZGluZyA9IGZhbHNlKSB7XG4gICAgaWYgKGxvYWRpbmcgIT09ICh0aGlzLl92YWx1ZSgpIGFzIFMgJiB7IGxvYWRpbmc6IGJvb2xlYW4gfSkubG9hZGluZykge1xuICAgICAgaXNEZXYoKSAmJiBzZXRBY3Rpb24oJ1NldCBMb2FkaW5nJyk7XG4gICAgICB0aGlzLl9zZXRTdGF0ZShzdGF0ZSA9PiAoeyAuLi5zdGF0ZSwgbG9hZGluZyB9IGFzIFMgJiB7IGxvYWRpbmc6IGJvb2xlYW4gfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBTZXQgd2hldGhlciB0aGUgZGF0YSBpcyBjYWNoZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogc3RvcmUuc2V0SGFzQ2FjaGUodHJ1ZSlcbiAgICogc3RvcmUuc2V0SGFzQ2FjaGUoZmFsc2UpXG4gICAqIHN0b3JlLnNldEhhc0NhY2hlKHRydWUsIHsgcmVzdGFydFRUTDogdHJ1ZSB9KVxuICAgKlxuICAgKi9cbiAgc2V0SGFzQ2FjaGUoaGFzQ2FjaGU6IGJvb2xlYW4sIG9wdGlvbnM6IHsgcmVzdGFydFRUTDogYm9vbGVhbiB9ID0geyByZXN0YXJ0VFRMOiBmYWxzZSB9KSB7XG4gICAgaWYgKGhhc0NhY2hlICE9PSB0aGlzLmNhY2hlLmFjdGl2ZS52YWx1ZSkge1xuICAgICAgdGhpcy5jYWNoZS5hY3RpdmUubmV4dChoYXNDYWNoZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVzdGFydFRUTCkge1xuICAgICAgY29uc3QgdHRsQ29uZmlnID0gdGhpcy5jYWNoZUNvbmZpZyAmJiB0aGlzLmNhY2hlQ29uZmlnLnR0bDtcbiAgICAgIGlmICh0dGxDb25maWcpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGUudHRsICE9PSBudWxsKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FjaGUudHRsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlLnR0bCA9IDxhbnk+c2V0VGltZW91dCgoKSA9PiB0aGlzLnNldEhhc0NhY2hlKGZhbHNlKSwgdHRsQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgZXJyb3Igc3RhdGVcbiAgICpcbiAgICogIEBleGFtcGxlXG4gICAqXG4gICAqICBzdG9yZS5zZXRFcnJvcih7dGV4dDogJ3VuYWJsZSB0byBsb2FkIGRhdGEnIH0pXG4gICAqXG4gICAqL1xuICBzZXRFcnJvcjxUPihlcnJvcjogVCkge1xuICAgIGlmIChlcnJvciAhPT0gKHRoaXMuX3ZhbHVlKCkgYXMgUyAmIHsgZXJyb3I6IGFueSB9KS5lcnJvcikge1xuICAgICAgaXNEZXYoKSAmJiBzZXRBY3Rpb24oJ1NldCBFcnJvcicpO1xuICAgICAgdGhpcy5fc2V0U3RhdGUoc3RhdGUgPT4gKHsgLi4uc3RhdGUsIGVycm9yIH0gYXMgUyAmIHsgZXJyb3I6IGFueSB9KSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIF9zZWxlY3Q8Uj4ocHJvamVjdDogKHN0b3JlOiBTKSA9PiBSKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIG1hcChwcm9qZWN0KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIF92YWx1ZSgpOiBTIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZVZhbHVlO1xuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIF9jYWNoZSgpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNhY2hlLmFjdGl2ZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgY29uZmlnKCk6IFN0b3JlQ29uZmlnT3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3JbY29uZmlnS2V5XSB8fCB7fTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgc3RvcmVOYW1lKCkge1xuICAgIHJldHVybiAodGhpcy5jb25maWcgYXMgU3RvcmVDb25maWdPcHRpb25zICYgeyBzdG9yZU5hbWU6IHN0cmluZyB9KS5zdG9yZU5hbWUgfHwgKHRoaXMub3B0aW9ucyBhcyBTdG9yZUNvbmZpZ09wdGlvbnMgJiB7IHN0b3JlTmFtZTogc3RyaW5nIH0pLnN0b3JlTmFtZSB8fCB0aGlzLm9wdGlvbnMubmFtZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgZGVlcEZyZWV6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGVlcEZyZWV6ZUZuIHx8IHRoaXMub3B0aW9ucy5kZWVwRnJlZXplRm4gfHwgZGVlcEZyZWV6ZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgY2FjaGVDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNhY2hlIHx8IHRoaXMub3B0aW9ucy5jYWNoZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgcmVzZXR0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVzZXR0YWJsZSB8fCB0aGlzLm9wdGlvbnMucmVzZXR0YWJsZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBfc2V0U3RhdGUobmV3U3RhdGVGbjogKHN0YXRlOiBSZWFkb25seTxTPikgPT4gUywgX2Rpc3BhdGNoQWN0aW9uID0gdHJ1ZSkge1xuICAgIHRoaXMuc3RvcmVWYWx1ZSA9IF9fREVWX18gPyB0aGlzLmRlZXBGcmVlemUobmV3U3RhdGVGbih0aGlzLl92YWx1ZSgpKSkgOiBuZXdTdGF0ZUZuKHRoaXMuX3ZhbHVlKCkpO1xuXG4gICAgaWYgKCF0aGlzLnN0b3JlKSB7XG4gICAgICB0aGlzLnN0b3JlID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLnN0b3JlVmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1RyYW5zYWN0aW9uSW5Qcm9jZXNzKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlVHJhbnNhY3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoKHRoaXMuc3RvcmVWYWx1ZSwgX2Rpc3BhdGNoQWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBSZXNldCB0aGUgY3VycmVudCBzdG9yZSBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHN0b3JlLnJlc2V0KClcbiAgICpcbiAgICovXG4gIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLmlzUmVzZXR0YWJsZSgpKSB7XG4gICAgICBpc0RldigpICYmIHNldEFjdGlvbignUmVzZXQnKTtcbiAgICAgIHRoaXMuX3NldFN0YXRlKCgpID0+IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2luaXRpYWxTdGF0ZSkpO1xuICAgICAgdGhpcy5zZXRIYXNDYWNoZShmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRGV2KCkgJiYgY29uc29sZS53YXJuKGBZb3UgbmVlZCB0byBlbmFibGUgdGhlIHJlc2V0IGZ1bmN0aW9uYWxpdHlgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXBkYXRlIHRoZSBzdG9yZSdzIHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICogICByZXR1cm4gey4uLn1cbiAgICogfSlcbiAgICovXG4gIHVwZGF0ZShzdGF0ZUNhbGxiYWNrOiBVcGRhdGVTdGF0ZUNhbGxiYWNrPFM+KTtcbiAgLyoqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICB0aGlzLnN0b3JlLnVwZGF0ZSh7IHRva2VuOiB0b2tlbiB9KVxuICAgKi9cbiAgdXBkYXRlKHN0YXRlOiBQYXJ0aWFsPFM+KTtcbiAgdXBkYXRlKHN0YXRlT3JDYWxsYmFjazogUGFydGlhbDxTPiB8IFVwZGF0ZVN0YXRlQ2FsbGJhY2s8Uz4pIHtcbiAgICBpc0RldigpICYmIHNldEFjdGlvbignVXBkYXRlJyk7XG5cbiAgICB0aGlzLl9zZXRTdGF0ZShzdGF0ZSA9PiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IGlzRnVuY3Rpb24oc3RhdGVPckNhbGxiYWNrKSA/IHN0YXRlT3JDYWxsYmFjayhzdGF0ZSkgOiBzdGF0ZU9yQ2FsbGJhY2s7XG4gICAgICBjb25zdCBtZXJnZWQgPSB0aGlzLmFraXRhUHJlVXBkYXRlKHN0YXRlLCB7IC4uLnN0YXRlLCAuLi5uZXdTdGF0ZSB9IGFzIFMpO1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3Qoc3RhdGUpID8gbWVyZ2VkIDogbmV3IChzdGF0ZSBhcyBhbnkpLmNvbnN0cnVjdG9yKG1lcmdlZCk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVTdG9yZUNvbmZpZyhuZXdPcHRpb25zOiBVcGRhdGFibGVTdG9yZUNvbmZpZ09wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucywgLi4ubmV3T3B0aW9ucyB9O1xuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIGFraXRhUHJlVXBkYXRlKF86IFJlYWRvbmx5PFM+LCBuZXh0U3RhdGU6IFJlYWRvbmx5PFM+KTogUyB7XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIERlc3Ryb3kgdGhlIHN0b3JlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHN0b3JlLmRlc3Ryb3koKVxuICAgKlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAoaXNOb3RCcm93c2VyKSByZXR1cm47XG4gICAgaWYgKCEod2luZG93IGFzIGFueSkuaG1yRW5hYmxlZCAmJiB0aGlzID09PSBfX3N0b3Jlc19fW3RoaXMuc3RvcmVOYW1lXSkge1xuICAgICAgZGVsZXRlIF9fc3RvcmVzX19bdGhpcy5zdG9yZU5hbWVdO1xuICAgICAgZGlzcGF0Y2hEZWxldGVkKHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgIHRoaXMuc2V0SGFzQ2FjaGUoZmFsc2UpO1xuICAgICAgdGhpcy5jYWNoZS5hY3RpdmUuY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uSW5pdChpbml0aWFsU3RhdGU6IFMpIHtcbiAgICBfX3N0b3Jlc19fW3RoaXMuc3RvcmVOYW1lXSA9IHRoaXM7XG4gICAgdGhpcy5fc2V0U3RhdGUoKCkgPT4gaW5pdGlhbFN0YXRlKTtcbiAgICBkaXNwYXRjaEFkZGVkKHRoaXMuc3RvcmVOYW1lKTtcbiAgICBpZiAodGhpcy5pc1Jlc2V0dGFibGUoKSkge1xuICAgICAgdGhpcy5faW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIH1cbiAgICBpc0RldigpICYmIGFzc2VydFN0b3JlSGFzTmFtZSh0aGlzLnN0b3JlTmFtZSwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2goc3RhdGU6IFMsIF9kaXNwYXRjaEFjdGlvbiA9IHRydWUpIHtcbiAgICB0aGlzLnN0b3JlLm5leHQoc3RhdGUpO1xuICAgIGlmIChfZGlzcGF0Y2hBY3Rpb24pIHtcbiAgICAgIGRpc3BhdGNoVXBkYXRlKHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgIHJlc2V0Q3VzdG9tQWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaFRyYW5zYWN0aW9uKCkge1xuICAgIGNvbW1pdCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlzcGF0Y2godGhpcy5fdmFsdWUoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzUmVzZXR0YWJsZSgpIHtcbiAgICBpZiAodGhpcy5yZXNldHRhYmxlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNldHRhYmxlIHx8IGdldEFraXRhQ29uZmlnKCkucmVzZXR0YWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHJhbnNhY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmluVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRoaXMud2F0Y2hUcmFuc2FjdGlvbigpO1xuICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==