@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
155 lines • 27 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
/* eslint-disable @typescript-eslint/no-explicit-any */
import { CollectionsUtil } from '../../../../utils';
import { RequestFilterImpl, RequestOrderImpl, RequestPageImpl } from '../../../../common';
import { ErrorStoreImpl } from '../../../error';
import { IDLE } from './component-status.model';
/**
* ** ComponentState implementation will all methods and other utilities.
*/
export class ComponentStateImpl {
/**
* ** Constructor.
*
* <p><b>
* Important:
* </b></p>
* <p>
* If you add new Property in {@link LiteralComponentState}/{@link ComponentState}
* <ul>
* <li>
* Implement field in {@link ComponentStateImpl} and handle null/undefined, assign defaults (required for Collections).
* </li>
* <li>
* Copy/Clone process have to be handled manually (for performance gain) in methods:
*
* {@link ComponentStateImpl.fromLiteralComponentState}
* {@link ComponentStateImpl.cloneDeepLiteral}
* {@link ComponentStateImpl.toLiteral}
* </li>
* </ul>
* </p>
*/
constructor(stateModelProp) {
const stateModel = CollectionsUtil.isDefined(stateModelProp) ? stateModelProp : {};
this.id = stateModel.id;
this.status = stateModel.status ?? IDLE;
this.navigationId = stateModel.navigationId ?? null;
this.routePath = stateModel.routePath;
this.routePathSegments = stateModel.routePathSegments ?? [];
this.search = stateModel.search ?? '';
this.page = stateModel.page ?? RequestPageImpl.empty();
this.order = stateModel.order ?? RequestOrderImpl.empty();
this.filter = stateModel.filter ?? RequestFilterImpl.empty();
this.requestParams = stateModel.requestParams ?? new Map();
this.task = stateModel.task ?? null;
this.errors = stateModel.errors ?? ErrorStoreImpl.empty();
this.data = stateModel.data ?? new Map();
this.uiState = stateModel.uiState ?? new Map();
}
/**
* ** Factory method.
*/
static of(stateModel) {
return new ComponentStateImpl(stateModel);
}
/**
* ** Convert provided {@link LiteralComponentState} into instance of {@link ComponentStateImpl}.
* <p>
* Every literals could be transformed to their original Collection format.
* <ul>
* <li>
* Object literals could be transformed to Map/WeakMap/Set depends of the needs.
* </li>
* <li>
* Array is keep as it is.
* </li>
* </ul>
* </p>
*
* @see CollectionsUtil.transformObjectToMap
* @see CollectionsUtil.transformMapToObject
*/
static fromLiteralComponentState(literalStateModel) {
return ComponentStateImpl.of({
...literalStateModel,
errors: ErrorStoreImpl.fromLiteral(literalStateModel.errors),
page: RequestPageImpl.fromLiteral(literalStateModel.page),
order: RequestOrderImpl.fromLiteral(literalStateModel.order),
filter: RequestFilterImpl.fromLiteral(literalStateModel.filter),
requestParams: CollectionsUtil.transformObjectToMap(literalStateModel.requestParams),
data: CollectionsUtil.transformObjectToMap(literalStateModel.data),
uiState: CollectionsUtil.transformObjectToMap(literalStateModel.uiState)
});
}
/**
* ** Make deep clone from Literal Component State.
*/
static cloneDeepLiteral(literalStateModel) {
return {
id: literalStateModel.id,
status: literalStateModel.status,
data: CollectionsUtil.cloneDeep(literalStateModel.data),
routePath: literalStateModel.routePath,
routePathSegments: [...literalStateModel.routePathSegments],
search: literalStateModel.search,
page: CollectionsUtil.cloneDeep(literalStateModel.page),
order: CollectionsUtil.cloneDeep(literalStateModel.order),
filter: CollectionsUtil.cloneDeep(literalStateModel.filter),
requestParams: CollectionsUtil.cloneDeep(literalStateModel.requestParams),
task: literalStateModel.task,
navigationId: literalStateModel.navigationId,
errors: ErrorStoreImpl.cloneDeepErrorRecords(literalStateModel.errors),
uiState: CollectionsUtil.cloneDeep(literalStateModel.uiState)
};
}
/**
* <p>
* Every Collection should be transformed to format of JSON supported literals, ready for LocalStorage/SessionStorage persist.
* <ul>
* <li>
* Map/WeakMap/Set have to be transform to Object literal.
* </li>
* <li>
* Array is keep as it is.
* </li>
* </ul>
* </p>
*
* @see CollectionsUtil.transformObjectToMap
* @see CollectionsUtil.transformMapToObject
*
* @inheritDoc
*/
toLiteral() {
return {
...this,
page: this.page.toLiteral(),
order: this.order.toLiteral(),
filter: this.filter.toLiteral(),
errors: this.errors.toLiteral(),
requestParams: CollectionsUtil.transformMapToObject(this.requestParams),
data: CollectionsUtil.transformMapToObject(this.data),
uiState: CollectionsUtil.transformMapToObject(this.uiState)
};
}
/**
* @inheritDoc
*/
toLiteralCloneDeep() {
return ComponentStateImpl.cloneDeepLiteral(this.toLiteral());
}
/**
* @inheritDoc
*/
copy(state = {}) {
return ComponentStateImpl.of({
...this,
...state
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXN0YXRlLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29yZS9jb21wb25lbnQvbW9kZWwvc3RhdGUvY29tcG9uZW50LXN0YXRlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsT0FBTyxFQVFILGlCQUFpQixFQUVqQixnQkFBZ0IsRUFFaEIsZUFBZSxFQUNsQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sMEJBQTBCLENBQUM7QUE0TDVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQXVFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXFCRztJQUNILFlBQVksY0FBdUM7UUFDL0MsTUFBTSxVQUFVLEdBQTRCLGVBQWUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTVHLElBQUksQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUM7UUFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxD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QUFFLGlCQUFpQixDQUFDLFlBQVk7WUFDNUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7WUFDdEUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO1NBQ2hFLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsU0FBUztRQUNMLE9BQU87WUFDSCxHQUFHLElBQUk7WUFDUCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDL0IsYUFBYSxFQUFFLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3ZFLElBQUksRUFBRSxlQUFlLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNyRCxPQUFPLEVBQUUsZUFBZSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDOUQsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNkLE9BQU8sa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLFFBQWlDLEVBQUU7UUFDcEMsT0FBTyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDekIsR0FBRyxJQUFJO1lBQ1AsR0FBRyxLQUFLO1NBQ1gsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBDb2xsZWN0aW9uc1V0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmltcG9ydCB7XG4gICAgQ29weSxcbiAgICBFcnJvclJlY29yZCxcbiAgICBFcnJvclN0b3JlLFxuICAgIExpdGVyYWwsXG4gICAgTGl0ZXJhbEFwaVByZWRpY2F0ZXMsXG4gICAgTGl0ZXJhbFJlcXVlc3RQYWdlLFxuICAgIFJlcXVlc3RGaWx0ZXIsXG4gICAgUmVxdWVzdEZpbHRlckltcGwsXG4gICAgUmVxdWVzdE9yZGVyLFxuICAgIFJlcXVlc3RPcmRlckltcGwsXG4gICAgUmVxdWVzdFBhZ2UsXG4gICAgUmVxdWVzdFBhZ2VJbXBsXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbic7XG5cbmltcG9ydCB7IEVycm9yU3RvcmVJbXBsIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3InO1xuXG5pbXBvcnQgeyBJRExFLCBTdGF0dXNUeXBlIH0gZnJvbSAnLi9jb21wb25lbnQtc3RhdHVzLm1vZGVsJztcblxuLyoqXG4gKiAqKiBMaXRlcmFsIENvbXBvbmVudCBTdGF0ZSBpbiBwdXJlc3QgZm9ybWF0IHJlYWR5IGZvciBTdG9yZSBwZXJzaXN0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdGVyYWxDb21wb25lbnRTdGF0ZSB7XG4gICAgLyoqXG4gICAgICogKiogSWRlbnRpZmllciBmb3IgQ29tcG9uZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBTdGF0dXMgZm9yIENvbXBvbmVudCBTdGF0ZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBzdGF0dXM6IFN0YXR1c1R5cGU7XG5cbiAgICAvKipcbiAgICAgKiAqKiBDb21wb25lbnQgU3RhdGUgRGF0YS5cbiAgICAgKiA8cD5cbiAgICAgKiAgICAgLSBGcmVlIGZvcm1hdCBMaXRlcmFsIE9iamVjdC5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0YT86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgICAvKipcbiAgICAgKiAqKiBSb3V0ZSBwYXRoIGZvciBjdXJyZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJvdXRlUGF0aD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICoqIFJvdXRlIHBhdGggc2VnbWVudHMgZm9yIGN1cnJlbnQgU3RhdGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcm91dGVQYXRoU2VnbWVudHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqICoqIFNlYXJjaCBxdWVyeSBmb3IgSHR0cCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBzZWFyY2g/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBQYWdlIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhZ2U/OiBMaXRlcmFsUmVxdWVzdFBhZ2U7XG5cbiAgICAvKipcbiAgICAgKiAqKiBPcmRlciBmb3IgSHR0cCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBvcmRlcj86IExpdGVyYWxBcGlQcmVkaWNhdGVzO1xuXG4gICAgLyoqXG4gICAgICogKiogRmlsdGVyIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZpbHRlcj86IExpdGVyYWxBcGlQcmVkaWNhdGVzO1xuXG4gICAgLyoqXG4gICAgICogKiogT3JkZXIgZm9yIEh0dHAgcmVxdWVzdHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVxdWVzdFBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgICAvKipcbiAgICAgKiAqKiBUYXNrIGlzIHByb3BlcnR5IHRoYXQgZ2l2ZSBiaS1kaXJlY3Rpb25hbCByZWZpbmVtZW50IGNvbnRleHQuXG4gICAgICpcbiAgICAgKiAgICAgIC0gR2l2ZXMgY29udGV4dCB0byBFZmZlY3QgdGhyb3VnaCBBY3Rpb24uXG4gICAgICogICAgICAtIEdpdmVzIGNvbnRleHQgdG8gQ29tcG9uZW50IHRocm91Z2ggQ29tcG9uZW50U3RhdGUgKENvbXBvbmVudE1vZGVsKS5cbiAgICAgKi9cbiAgICByZWFkb25seSB0YXNrPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogKiogUm91dGVyIE5hdmlnYXRpb25JZCBib3VuZCB0byB0aGlzIENvbXBvbmVudCBTdGF0ZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYXZpZ2F0aW9uSWQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiAqKiBFcnJvciBzdG9yZSBmb3IgRXJyb3JSZWNvcmRzIHRoYXQgaGFwcGVuIGluIHN0cmVhbSBtYW5pcHVsYXRpb24gZG93biB0byB0aGUgQ29tcG9uZW50cy5cbiAgICAgKiA8cD5cbiAgICAgKiAgICAgLSBJZGVhbCBmb3Igc3RvcmluZyBIdHRwIGVycm9ycyBhbmQgb3RoZXIgcnVudGltZSBlcnJvcnMsIHNvIENvbXBvbmVudCBjb3VsZCBlYXNpbHkgbGV2ZXJhZ2UgdGhhdCBrbm93bGVkZ2UgYW5kIHNob3cgaW5mbyBmb3IgVXNlci5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgZXJyb3JzPzogRXJyb3JSZWNvcmRbXTtcblxuICAgIC8qKlxuICAgICAqICoqIENvbXBvbmVudCBTdGF0ZSBVaVN0YXRlLCB0aGF0IGhvbGRzIGFsbCBpbmZvcm1hdGlvbiBmb3IgVWlFbGVtZW50cy5cbiAgICAgKiA8cD5cbiAgICAgKiAgICAgLSBGcmVlIGZvcm1hdCBMaXRlcmFsIE9iamVjdCB3aGVyZSBrZXkgaWRlbnRpZmllciBjb3VsZCBiZSAoQ29tcG9uZW50L0h0bWwgRWxlbWVudCkgbmFtZS9pZC9jbGFzcyBldGMuLi5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgdWlTdGF0ZT86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50U3RhdGUgZXh0ZW5kcyBMaXRlcmFsPExpdGVyYWxDb21wb25lbnRTdGF0ZT4sIENvcHk8Q29tcG9uZW50U3RhdGU+IHtcbiAgICAvKipcbiAgICAgKiAqKiBJZGVudGlmaWVyIGZvciBDb21wb25lbnQgU3RhdGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICoqIFN0YXR1cyBmb3IgQ29tcG9uZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHN0YXR1czogU3RhdHVzVHlwZTtcblxuICAgIC8qKlxuICAgICAqICoqIENvbXBvbmVudCBTdGF0ZSBEYXRhLlxuICAgICAqIDxwPlxuICAgICAqICAgICAtIEZyZWUgZm9ybWF0IE1hcC5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0YT86IE1hcDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiAqKiBSb3V0ZSBwYXRoIGZvciBjdXJyZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJvdXRlUGF0aD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqICoqIFJvdXRlIFBhdGggU2VnbWVudHMgZm9yIGN1cnJlbnQgU3RhdGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgcm91dGVQYXRoU2VnbWVudHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqICoqIFNlYXJjaCBxdWVyeSBmb3IgSHR0cCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBzZWFyY2g/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBQYWdlIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhZ2U/OiBSZXF1ZXN0UGFnZTtcblxuICAgIC8qKlxuICAgICAqICoqIE9yZGVyIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9yZGVyPzogUmVxdWVzdE9yZGVyO1xuXG4gICAgLyoqXG4gICAgICogKiogRmlsdGVyIGZvciBIdHRwIHJlcXVlc3RzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZpbHRlcj86IFJlcXVlc3RGaWx0ZXI7XG5cbiAgICAvKipcbiAgICAgKiAqKiBNYXAgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycyBmb3IgSHR0cCByZXF1ZXN0cy5cbiAgICAgKi9cbiAgICByZWFkb25seSByZXF1ZXN0UGFyYW1zPzogTWFwPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqICoqIFRhc2sgaXMgcHJvcGVydHkgdGhhdCBnaXZlIGJpLWRpcmVjdGlvbmFsIHJlZmluZW1lbnQgY29udGV4dC5cbiAgICAgKlxuICAgICAqICAgICAgLSBHaXZlcyBjb250ZXh0IHRvIEVmZmVjdCB0aHJvdWdoIEFjdGlvbi5cbiAgICAgKiAgICAgIC0gR2l2ZXMgY29udGV4dCB0byBDb21wb25lbnQgdGhyb3VnaCBDb21wb25lbnRTdGF0ZSAoQ29tcG9uZW50TW9kZWwpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRhc2s/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAqKiBSb3V0ZXIgTmF2aWdhdGlvbklkIGJvdW5kIHRvIHRoaXMgQ29tcG9uZW50IFN0YXRlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hdmlnYXRpb25JZD86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqICoqIEVycm9yIHN0b3JlIGZvciBFcnJvclJlY29yZHMgdGhhdCBoYXBwZW4gaW4gc3RyZWFtIG1hbmlwdWxhdGlvbiBkb3duIHRvIHRoZSBDb21wb25lbnRzLlxuICAgICAqIDxwPlxuICAgICAqICAgICAtIElkZWFsIGZvciBzdG9yaW5nIEh0dHAgZXJyb3JzIGFuZCBvdGhlciBydW50aW1lIGVycm9ycywgc28gQ29tcG9uZW50IGNvdWxkIGVhc2lseSBsZXZlcmFnZSB0aGF0IGtub3dsZWRnZSBhbmQgc2hvdyBpbmZvIGZvciBVc2VyLlxuICAgICAqIDwvcD5cbiAgICAgKi9cbiAgICByZWFkb25seSBlcnJvcnM/OiBFcnJvclN0b3JlO1xuXG4gICAgLyoqXG4gICAgICogKiogQ29tcG9uZW50IFN0YXRlIFVpU3RhdGUsIHRoYXQgaG9sZHMgYWxsIGluZm9ybWF0aW9uIGZvciBVaUVsZW1lbnRzLlxuICAgICAqIDxwPlxuICAgICAqICAgICAtIEZyZWUgZm9ybWF0IE1hcCB3aGVyZSBrZXkgaWRlbnRpZmllciBjb3VsZCBiZSAoQ29tcG9uZW50L0h0bWwgRWxlbWVudCkgbmFtZS9pZC9jbGFzcyBldGMuLi5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgcmVhZG9ubHkgdWlTdGF0ZT86IE1hcDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHRvTGl0ZXJhbCgpOiBMaXRlcmFsQ29tcG9uZW50U3RhdGU7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHRvTGl0ZXJhbENsb25lRGVlcCgpOiBMaXRlcmFsQ29tcG9uZW50U3RhdGU7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGNvcHkoc3RhdGU/OiBQYXJ0aWFsPENvbXBvbmVudFN0YXRlPik6IENvbXBvbmVudFN0YXRlO1xufVxuXG4vKipcbiAqICoqIENvbXBvbmVudFN0YXRlIGltcGxlbWVudGF0aW9uIHdpbGwgYWxsIG1ldGhvZHMgYW5kIG90aGVyIHV0aWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvbmVudFN0YXRlSW1wbCBpbXBsZW1lbnRzIENvbXBvbmVudFN0YXRlIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHN0YXR1czogU3RhdHVzVHlwZTtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0YTogTWFwPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgcm91dGVQYXRoOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHJvdXRlUGF0aFNlZ21lbnRzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VhcmNoOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhZ2U6IFJlcXVlc3RQYWdlSW1wbDtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgb3JkZXI6IFJlcXVlc3RPcmRlckltcGw7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGZpbHRlcjogUmVxdWVzdEZpbHRlckltcGw7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlcXVlc3RQYXJhbXM6IE1hcDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHRhc2s6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgbmF2aWdhdGlvbklkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGVycm9yczogRXJyb3JTdG9yZTtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgcmVhZG9ubHkgdWlTdGF0ZTogTWFwPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqICoqIENvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogPHA+PGI+XG4gICAgICogICAgIEltcG9ydGFudDpcbiAgICAgKiA8L2I+PC9wPlxuICAgICAqIDxwPlxuICAgICAqICAgICBJZiB5b3UgYWRkIG5ldyBQcm9wZXJ0eSBpbiB7QGxpbmsgTGl0ZXJhbENvbXBvbmVudFN0YXRlfS97QGxpbmsgQ29tcG9uZW50U3RhdGV9XG4gICAgICogIDx1bD5cbiAgICAgKiAgICAgPGxpPlxuICAgICAqICAgICAgICBJbXBsZW1lbnQgZmllbGQgaW4ge0BsaW5rIENvbXBvbmVudFN0YXRlSW1wbH0gYW5kIGhhbmRsZSBudWxsL3VuZGVmaW5lZCwgYXNzaWduIGRlZmF1bHRzIChyZXF1aXJlZCBmb3IgQ29sbGVjdGlvbnMpLlxuICAgICAqICAgICA8L2xpPlxuICAgICAqICAgICA8bGk+XG4gICAgICogICAgICAgIENvcHkvQ2xvbmUgcHJvY2VzcyBoYXZlIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgKGZvciBwZXJmb3JtYW5jZSBnYWluKSBpbiBtZXRob2RzOlxuICAgICAqXG4gICAgICogICAgICAgIHtAbGluayBDb21wb25lbnRTdGF0ZUltcGwuZnJvbUxpdGVyYWxDb21wb25lbnRTdGF0ZX1cbiAgICAgKiAgICAgICAge0BsaW5rIENvbXBvbmVudFN0YXRlSW1wbC5jbG9uZURlZXBMaXRlcmFsfVxuICAgICAqICAgICAgICB7QGxpbmsgQ29tcG9uZW50U3RhdGVJbXBsLnRvTGl0ZXJhbH1cbiAgICAgKiAgICAgPC9saT5cbiAgICAgKiAgPC91bD5cbiAgICAgKiA8L3A+XG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RhdGVNb2RlbFByb3A6IFBhcnRpYWw8Q29tcG9uZW50U3RhdGU+KSB7XG4gICAgICAgIGNvbnN0IHN0YXRlTW9kZWw6IFBhcnRpYWw8Q29tcG9uZW50U3RhdGU+ID0gQ29sbGVjdGlvbnNVdGlsLmlzRGVmaW5lZChzdGF0ZU1vZGVsUHJvcCkgPyBzdGF0ZU1vZGVsUHJvcCA6IHt9O1xuXG4gICAgICAgIHRoaXMuaWQgPSBzdGF0ZU1vZGVsLmlkO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXRlTW9kZWwuc3RhdHVzID8/IElETEU7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbklkID0gc3RhdGVNb2RlbC5uYXZpZ2F0aW9uSWQgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5yb3V0ZVBhdGggPSBzdGF0ZU1vZGVsLnJvdXRlUGF0aDtcbiAgICAgICAgdGhpcy5yb3V0ZVBhdGhTZWdtZW50cyA9IHN0YXRlTW9kZWwucm91dGVQYXRoU2VnbWVudHMgPz8gW107XG4gICAgICAgIHRoaXMuc2VhcmNoID0gc3RhdGVNb2RlbC5zZWFyY2ggPz8gJyc7XG4gICAgICAgIHRoaXMucGFnZSA9IHN0YXRlTW9kZWwucGFnZSA/PyBSZXF1ZXN0UGFnZUltcGwuZW1wdHkoKTtcbiAgICAgICAgdGhpcy5vcmRlciA9IHN0YXRlTW9kZWwub3JkZXIgPz8gUmVxdWVzdE9yZGVySW1wbC5lbXB0eSgpO1xuICAgICAgICB0aGlzLmZpbHRlciA9IHN0YXRlTW9kZWwuZmlsdGVyID8/IFJlcXVlc3RGaWx0ZXJJbXBsLmVtcHR5KCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFBhcmFtcyA9IHN0YXRlTW9kZWwucmVxdWVzdFBhcmFtcyA/PyBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICB0aGlzLnRhc2sgPSBzdGF0ZU1vZGVsLnRhc2sgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBzdGF0ZU1vZGVsLmVycm9ycyA/PyBFcnJvclN0b3JlSW1wbC5lbXB0eSgpO1xuICAgICAgICB0aGlzLmRhdGEgPSBzdGF0ZU1vZGVsLmRhdGEgPz8gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgdGhpcy51aVN0YXRlID0gc3RhdGVNb2RlbC51aVN0YXRlID8/IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogRmFjdG9yeSBtZXRob2QuXG4gICAgICovXG4gICAgc3RhdGljIG9mKHN0YXRlTW9kZWw6IFBhcnRpYWw8Q29tcG9uZW50U3RhdGU+KTogQ29tcG9uZW50U3RhdGVJbXBsIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTdGF0ZUltcGwoc3RhdGVNb2RlbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogQ29udmVydCBwcm92aWRlZCB7QGxpbmsgTGl0ZXJhbENvbXBvbmVudFN0YXRlfSBpbnRvIGluc3RhbmNlIG9mIHtAbGluayBDb21wb25lbnRTdGF0ZUltcGx9LlxuICAgICAqIDxwPlxuICAgICAqICAgICBFdmVyeSBsaXRlcmFscyBjb3VsZCBiZSB0cmFuc2Zvcm1lZCB0byB0aGVpciBvcmlnaW5hbCBDb2xsZWN0aW9uIGZvcm1hdC5cbiAgICAgKiAgICAgPHVsPlxuICAgICAqICAgICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICAgIE9iamVjdCBsaXRlcmFscyBjb3VsZCBiZSB0cmFuc2Zvcm1lZCB0byBNYXAvV2Vha01hcC9TZXQgZGVwZW5kcyBvZiB0aGUgbmVlZHMuXG4gICAgICogICAgICAgICA8L2xpPlxuICAgICAqICAgICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICAgIEFycmF5IGlzIGtlZXAgYXMgaXQgaXMuXG4gICAgICogICAgICAgICA8L2xpPlxuICAgICAqICAgICA8L3VsPlxuICAgICAqIDwvcD5cbiAgICAgKlxuICAgICAqIEBzZWUgQ29sbGVjdGlvbnNVdGlsLnRyYW5zZm9ybU9iamVjdFRvTWFwXG4gICAgICogQHNlZSBDb2xsZWN0aW9uc1V0aWwudHJhbnNmb3JtTWFwVG9PYmplY3RcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUxpdGVyYWxDb21wb25lbnRTdGF0ZShsaXRlcmFsU3RhdGVNb2RlbDogTGl0ZXJhbENvbXBvbmVudFN0YXRlKTogQ29tcG9uZW50U3RhdGVJbXBsIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudFN0YXRlSW1wbC5vZih7XG4gICAgICAgICAgICAuLi5saXRlcmFsU3RhdGVNb2RlbCxcbiAgICAgICAgICAgIGVycm9yczogRXJyb3JTdG9yZUltcGwuZnJvbUxpdGVyYWwobGl0ZXJhbFN0YXRlTW9kZWwuZXJyb3JzKSxcbiAgICAgICAgICAgIHBhZ2U6IFJlcXVlc3RQYWdlSW1wbC5mcm9tTGl0ZXJhbChsaXRlcmFsU3RhdGVNb2RlbC5wYWdlKSxcbiAgICAgICAgICAgIG9yZGVyOiBSZXF1ZXN0T3JkZXJJbXBsLmZyb21MaXRlcmFsKGxpdGVyYWxTdGF0ZU1vZGVsLm9yZGVyKSxcbiAgICAgICAgICAgIGZpbHRlcjogUmVxdWVzdEZpbHRlckltcGwuZnJvbUxpdGVyYWwobGl0ZXJhbFN0YXRlTW9kZWwuZmlsdGVyKSxcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbXM6IENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1PYmplY3RUb01hcChsaXRlcmFsU3RhdGVNb2RlbC5yZXF1ZXN0UGFyYW1zKSxcbiAgICAgICAgICAgIGRhdGE6IENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1PYmplY3RUb01hcChsaXRlcmFsU3RhdGVNb2RlbC5kYXRhKSxcbiAgICAgICAgICAgIHVpU3RhdGU6IENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1PYmplY3RUb01hcChsaXRlcmFsU3RhdGVNb2RlbC51aVN0YXRlKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAqKiBNYWtlIGRlZXAgY2xvbmUgZnJvbSBMaXRlcmFsIENvbXBvbmVudCBTdGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xvbmVEZWVwTGl0ZXJhbChsaXRlcmFsU3RhdGVNb2RlbDogTGl0ZXJhbENvbXBvbmVudFN0YXRlKTogTGl0ZXJhbENvbXBvbmVudFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBsaXRlcmFsU3RhdGVNb2RlbC5pZCxcbiAgICAgICAgICAgIHN0YXR1czogbGl0ZXJhbFN0YXRlTW9kZWwuc3RhdHVzLFxuICAgICAgICAgICAgZGF0YTogQ29sbGVjdGlvbnNVdGlsLmNsb25lRGVlcChsaXRlcmFsU3RhdGVNb2RlbC5kYXRhKSxcbiAgICAgICAgICAgIHJvdXRlUGF0aDogbGl0ZXJhbFN0YXRlTW9kZWwucm91dGVQYXRoLFxuICAgICAgICAgICAgcm91dGVQYXRoU2VnbWVudHM6IFsuLi5saXRlcmFsU3RhdGVNb2RlbC5yb3V0ZVBhdGhTZWdtZW50c10sXG4gICAgICAgICAgICBzZWFyY2g6IGxpdGVyYWxTdGF0ZU1vZGVsLnNlYXJjaCxcbiAgICAgICAgICAgIHBhZ2U6IENvbGxlY3Rpb25zVXRpbC5jbG9uZURlZXAobGl0ZXJhbFN0YXRlTW9kZWwucGFnZSksXG4gICAgICAgICAgICBvcmRlcjogQ29sbGVjdGlvbnNVdGlsLmNsb25lRGVlcChsaXRlcmFsU3RhdGVNb2RlbC5vcmRlciksXG4gICAgICAgICAgICBmaWx0ZXI6IENvbGxlY3Rpb25zVXRpbC5jbG9uZURlZXAobGl0ZXJhbFN0YXRlTW9kZWwuZmlsdGVyKSxcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbXM6IENvbGxlY3Rpb25zVXRpbC5jbG9uZURlZXAobGl0ZXJhbFN0YXRlTW9kZWwucmVxdWVzdFBhcmFtcyksXG4gICAgICAgICAgICB0YXNrOiBsaXRlcmFsU3RhdGVNb2RlbC50YXNrLFxuICAgICAgICAgICAgbmF2aWdhdGlvbklkOiBsaXRlcmFsU3RhdGVNb2RlbC5uYXZpZ2F0aW9uSWQsXG4gICAgICAgICAgICBlcnJvcnM6IEVycm9yU3RvcmVJbXBsLmNsb25lRGVlcEVycm9yUmVjb3JkcyhsaXRlcmFsU3RhdGVNb2RlbC5lcnJvcnMpLFxuICAgICAgICAgICAgdWlTdGF0ZTogQ29sbGVjdGlvbnNVdGlsLmNsb25lRGVlcChsaXRlcmFsU3RhdGVNb2RlbC51aVN0YXRlKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxwPlxuICAgICAqICAgICBFdmVyeSBDb2xsZWN0aW9uIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCB0byBmb3JtYXQgb2YgSlNPTiBzdXBwb3J0ZWQgbGl0ZXJhbHMsIHJlYWR5IGZvciBMb2NhbFN0b3JhZ2UvU2Vzc2lvblN0b3JhZ2UgcGVyc2lzdC5cbiAgICAgKiAgICAgPHVsPlxuICAgICAqICAgICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICAgIE1hcC9XZWFrTWFwL1NldCBoYXZlIHRvIGJlIHRyYW5zZm9ybSB0byBPYmplY3QgbGl0ZXJhbC5cbiAgICAgKiAgICAgICAgIDwvbGk+XG4gICAgICogICAgICAgICA8bGk+XG4gICAgICogICAgICAgICAgICAgQXJyYXkgaXMga2VlcCBhcyBpdCBpcy5cbiAgICAgKiAgICAgICAgIDwvbGk+XG4gICAgICogICAgIDwvdWw+XG4gICAgICogPC9wPlxuICAgICAqXG4gICAgICogQHNlZSBDb2xsZWN0aW9uc1V0aWwudHJhbnNmb3JtT2JqZWN0VG9NYXBcbiAgICAgKiBAc2VlIENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1NYXBUb09iamVjdFxuICAgICAqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICB0b0xpdGVyYWwoKTogTGl0ZXJhbENvbXBvbmVudFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UudG9MaXRlcmFsKCksXG4gICAgICAgICAgICBvcmRlcjogdGhpcy5vcmRlci50b0xpdGVyYWwoKSxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy5maWx0ZXIudG9MaXRlcmFsKCksXG4gICAgICAgICAgICBlcnJvcnM6IHRoaXMuZXJyb3JzLnRvTGl0ZXJhbCgpLFxuICAgICAgICAgICAgcmVxdWVzdFBhcmFtczogQ29sbGVjdGlvbnNVdGlsLnRyYW5zZm9ybU1hcFRvT2JqZWN0KHRoaXMucmVxdWVzdFBhcmFtcyksXG4gICAgICAgICAgICBkYXRhOiBDb2xsZWN0aW9uc1V0aWwudHJhbnNmb3JtTWFwVG9PYmplY3QodGhpcy5kYXRhKSxcbiAgICAgICAgICAgIHVpU3RhdGU6IENvbGxlY3Rpb25zVXRpbC50cmFuc2Zvcm1NYXBUb09iamVjdCh0aGlzLnVpU3RhdGUpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICB0b0xpdGVyYWxDbG9uZURlZXAoKTogTGl0ZXJhbENvbXBvbmVudFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudFN0YXRlSW1wbC5jbG9uZURlZXBMaXRlcmFsKHRoaXMudG9MaXRlcmFsKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgY29weShzdGF0ZTogUGFydGlhbDxDb21wb25lbnRTdGF0ZT4gPSB7fSk6IENvbXBvbmVudFN0YXRlSW1wbCB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnRTdGF0ZUltcGwub2Yoe1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIC4uLnN0YXRlXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==