@linid-dm/directory-manager-client-core
Version:
Core package by providing a set of angular components for the Directory Manager app.
656 lines • 69.8 kB
JavaScript
import { __decorate } from "tslib";
/**
* Copyright (C) 2020-2024 Linagora
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version, provided you comply with the Additional Terms applicable for
* LinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU
* Affero General Public License, subsections (b), (c), and (e), pursuant to
* which these Appropriate Legal Notices must notably (i) retain the display of
* the "LinID™" trademark/logo at the top of the interface window, the display
* of the “You are using the Open Source and free version of LinID™, powered by
* Linagora © 2009–2013. Contribute to LinID R&D by subscribing to an Enterprise
* offer!” infobox and in the e-mails sent with the Program, notice appended to
* any type of outbound messages (e.g. e-mail and meeting requests) as well as
* in the LinID Directory Manager user interface, (ii) retain all hypertext
* links between LinID Directory Manager and https://linid.org/, as well as
* between LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA
* intellectual property rights over its trademarks and commercial brands. Other
* Additional Terms apply, see <http://www.linagora.com/licenses/> for more
* details.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License and
* its applicable Additional Terms for LinID Directory Manager along with this
* program. If not, see <http://www.gnu.org/licenses/> for the GNU Affero
* General Public License version 3 and <http://www.linagora.com/licenses/> for
* the Additional Terms applicable to the LinID Directory Manager software.
*/
import { Injectable } from '@angular/core';
import { Action, Selector, State } from '@ngxs/store';
import { emptyJsTable, putById, toJsTable, updateById, } from '../../helpers/jstable.helper';
import * as Data from './data.actions';
import * as i0 from "@angular/core";
const _persistentUiDataRowFactory = () => {
return {
filterValue: '',
searchForm: '',
expandedTreeNodesUuids: [],
advancedSearchChips: [],
};
};
export function initDataStateDefaultValues() {
return {
...emptyJsTable(),
selectedResourceTypeId: null,
selectedEntryIds: null,
selectedEntryParentIds: null,
rootIdSelectedResourceType: null,
isFetchingResources: false,
isFetchingResourcesError: false,
isFetchingResourcesSuccess: false,
resources: null,
entriesIdsMatchingAdvancedSearch: {},
isFetchingDataDetail: false,
isFetchingDataDetailError: false,
isFetchingDataDetailSuccess: false,
dataDetail: null,
};
}
let DataState = class DataState {
static getDataState(state) {
return state;
}
static getSelectedResourceTypeId(state) {
return state.selectedResourceTypeId;
}
static getSelectedEntryIds(state) {
return state.selectedEntryIds;
}
static getSelectedEntryId(state) {
return state.selectedEntryIds.id;
}
static getSelectedEntryExternalId(state) {
return state.selectedEntryIds.externalId;
}
static getSelectedEntryParentIds(state) {
return state.selectedEntryParentIds;
}
static getSelectedEntryParentId(state) {
return state.selectedEntryParentIds.id;
}
static getSelectedEntryParentExternalId(state) {
return state.selectedEntryParentIds.externalId;
}
static getRootIdSelectedResourceType(state) {
return state.rootIdSelectedResourceType;
}
static isFetchingResources(state) {
return state.isFetchingResources;
}
static isFetchingResourcesSuccess(state) {
return state.isFetchingResourcesSuccess;
}
static isFetchingResourcesError(state) {
return state.isFetchingResourcesError;
}
static getResources(state) {
return state.resources;
}
static getEntriesIdsMatchingAdvancedSearch(state) {
return state.entriesIdsMatchingAdvancedSearch;
}
static isFetchingDataDetail(state) {
return state.isFetchingDataDetail;
}
static isFetchingDataDetailSuccess(state) {
return state.isFetchingDataDetailSuccess;
}
static isFetchingDataDetailError(state) {
return state.isFetchingDataDetailError;
}
static getDataDetail(state) {
return state.dataDetail;
}
static getDataById(state) {
return state.byId;
}
static getDataAllIds(state) {
return state.allIds;
}
static getDataJsTable(state) {
return {
byId: state.byId,
allIds: state.allIds,
};
}
static getAdvancedSearchChips(state) {
return state.byId[state.rootIdSelectedResourceType].advancedSearchChips;
}
static getSearchFormValue(state) {
return state.byId[state.rootIdSelectedResourceType].searchForm;
}
static isAdvancedSearchActivated(state) {
return (state.byId[state.rootIdSelectedResourceType].searchForm !== '' ||
state.byId[state.rootIdSelectedResourceType].advancedSearchChips.length >
0);
}
setSelectedResourceTypeId(ctx, action) {
ctx.setState({
...ctx.getState(),
selectedResourceTypeId: action.payload.id,
});
}
resetSelectedResourceTypeId(ctx) {
ctx.setState({
...ctx.getState(),
selectedResourceTypeId: null,
});
}
setSelectedEntryIds(ctx, action) {
ctx.setState({
...ctx.getState(),
selectedEntryIds: action.payload.ids,
});
}
resetSelectedEntryIds(ctx) {
ctx.setState({
...ctx.getState(),
selectedEntryIds: null,
});
}
setSelectedEntryId(ctx, action) {
ctx.setState({
...ctx.getState(),
selectedEntryIds: {
...ctx.getState().selectedEntryIds,
id: action.payload.id,
},
});
}
resetSelectedEntryId(ctx) {
ctx.setState({
...ctx.getState(),
selectedEntryIds: {
...ctx.getState().selectedEntryIds,
id: null,
},
});
}
setSelectedEntryExternalId(ctx, action) {
ctx.setState({
...ctx.getState(),
selectedEntryIds: {
...ctx.getState().selectedEntryIds,
externalId: action.payload.externalId,
},
});
}
resetSelectedEntryExternalId(ctx) {
ctx.setState({
...ctx.getState(),
selectedEntryIds: {
...ctx.getState().selectedEntryIds,
externalId: null,
},
});
}
setSelectedEntryParentIds(ctx, action) {
ctx.setState({
...ctx.getState(),
selectedEntryParentIds: action.payload.ids,
});
}
resetSelectedEntryParentIds(ctx) {
ctx.setState({
...ctx.getState(),
selectedEntryParentIds: null,
});
}
setSelectedEntryParentId(ctx, action) {
ctx.setState({
...ctx.getState(),
selectedEntryParentIds: {
...ctx.getState().selectedEntryParentIds,
id: action.payload.id,
},
});
}
resetSelectedEntryParentId(ctx) {
ctx.setState({
...ctx.getState(),
selectedEntryParentIds: {
...ctx.getState().selectedEntryParentIds,
id: null,
},
});
}
setSelectedEntryParentExternalId(ctx, action) {
ctx.setState({
...ctx.getState(),
selectedEntryParentIds: {
...ctx.getState().selectedEntryParentIds,
externalId: action.payload.externalId,
},
});
}
resetSelectedEntryParentExternalId(ctx) {
ctx.setState({
...ctx.getState(),
selectedEntryParentIds: {
...ctx.getState().selectedEntryParentIds,
externalId: null,
},
});
}
setRootIdSelectedResourceType(ctx, action) {
ctx.setState({
...ctx.getState(),
rootIdSelectedResourceType: action.payload.id,
});
}
resetIdRootSelectedResourceType(ctx) {
ctx.setState({
...ctx.getState(),
rootIdSelectedResourceType: null,
});
}
initDataJsTable(ctx, action) {
const jsTable = toJsTable(action.payload.resourcesTypesIds.reduce((acc, resourceTypeId) => ({
...acc,
[resourceTypeId]: _persistentUiDataRowFactory(),
}), {}));
ctx.setState({
...ctx.getState(),
...jsTable,
});
}
toggleFoldTreeNode(ctx, action) {
const jsTable = action.payload.isFolding
? updateById(ctx.getState(), action.payload.dataTypeId, {
expandedTreeNodesUuids: [
...ctx
.getState()
.byId[action.payload.dataTypeId].expandedTreeNodesUuids.filter((link) => link !== action.payload.treeNodeId),
],
})
: putById(ctx.getState(), action.payload.dataTypeId, {
expandedTreeNodesUuids: [
...ctx.getState().byId[action.payload.dataTypeId]
.expandedTreeNodesUuids,
action.payload.treeNodeId,
],
}, _persistentUiDataRowFactory);
ctx.setState({
...ctx.getState(),
...jsTable,
});
}
setFilterValue(ctx, action) {
const jsTable = updateById(ctx.getState(), action.payload.dataTypeId, {
filterValue: action.payload.filterValue,
});
ctx.setState({
...ctx.getState(),
...jsTable,
});
}
setSearchFormValue(ctx, action) {
const jsTable = updateById(ctx.getState(), action.payload.dataTypeId, {
searchForm: action.payload.searchForm,
});
ctx.setState({
...ctx.getState(),
...jsTable,
});
}
setAdvancedSearchChips(ctx, action) {
const jsTable = updateById(ctx.getState(), action.payload.dataTypeId, {
advancedSearchChips: action.payload.advancedSearchChips,
});
ctx.setState({
...ctx.getState(),
...jsTable,
});
}
resetSearchFormValue(ctx, action) {
const jsTable = updateById(ctx.getState(), action.payload.dataTypeId, {
searchForm: '',
});
ctx.setState({
...ctx.getState(),
...jsTable,
});
}
removeAdvancedSearchChip(ctx, action) {
const jsTable = updateById(ctx.getState(), action.payload.dataTypeId, {
advancedSearchChips: [
...ctx
.getState()
.byId[action.payload.dataTypeId].advancedSearchChips.filter((chip) => {
const chipModelRef = chip.associatedFieldId ?? chip.modelRef;
return chipModelRef !== action.payload.modelRef;
}),
],
});
ctx.setState({
...ctx.getState(),
...jsTable,
});
}
resetAdvancedSearchChips(ctx, action) {
const jsTable = updateById(ctx.getState(), action.payload.dataTypeId, { advancedSearchChips: [] });
ctx.setState({
...ctx.getState(),
...jsTable,
});
}
filterResources(ctx) {
ctx.setState({
...ctx.getState(),
isFetchingResources: true,
isFetchingResourcesSuccess: false,
isFetchingResourcesError: false,
});
}
fetchResources(ctx) {
ctx.setState({
...ctx.getState(),
resources: null,
entriesIdsMatchingAdvancedSearch: {},
isFetchingResources: true,
isFetchingResourcesSuccess: false,
isFetchingResourcesError: false,
});
}
stopFilteringResources(ctx) {
ctx.setState({
...ctx.getState(),
isFetchingResources: false,
});
}
addEntryIdMatchingAdvancedSearch(ctx, action) {
ctx.setState({
...ctx.getState(),
entriesIdsMatchingAdvancedSearch: {
...ctx.getState().entriesIdsMatchingAdvancedSearch,
[action.payload.entryId]: true,
},
});
}
removeEntriesIdsMatchingAdvancedSearch(ctx, action) {
action.payload.entriesIds.forEach((id) => delete ctx.getState().entriesIdsMatchingAdvancedSearch[id]);
}
fetchResourcesSuccess(ctx, action) {
ctx.setState({
...ctx.getState(),
resources: action.payload.resources,
entriesIdsMatchingAdvancedSearch: action.payload.entriesIdsMatchingAdvancedSearch,
isFetchingResources: false,
isFetchingResourcesSuccess: true,
});
}
fetchResourcesError(ctx) {
ctx.setState({
...ctx.getState(),
resources: null,
entriesIdsMatchingAdvancedSearch: {},
isFetchingResources: false,
isFetchingResourcesError: true,
});
}
setResources(ctx, action) {
ctx.setState({
...ctx.getState(),
resources: action.payload.resources,
});
}
resetResources(ctx) {
ctx.setState({
...ctx.getState(),
resources: null,
entriesIdsMatchingAdvancedSearch: {},
});
}
fetchDataDetail(ctx) {
ctx.setState({
...ctx.getState(),
dataDetail: null,
isFetchingDataDetail: true,
isFetchingDataDetailSuccess: false,
isFetchingDataDetailError: false,
});
}
fetchDataDetailSuccess(ctx) {
ctx.setState({
...ctx.getState(),
isFetchingDataDetail: false,
isFetchingDataDetailSuccess: true,
});
}
fetchDataDetailError(ctx) {
ctx.setState({
...ctx.getState(),
dataDetail: null,
isFetchingDataDetail: false,
isFetchingDataDetailError: true,
});
}
setDataDetail(ctx, action) {
ctx.setState({
...ctx.getState(),
dataDetail: action.payload.dataDetail,
});
}
resetDataDetail(ctx) {
ctx.setState({
...ctx.getState(),
dataDetail: null,
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: DataState, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: DataState }); }
};
__decorate([
Action(Data.SetSelectedResourceTypeId)
], DataState.prototype, "setSelectedResourceTypeId", null);
__decorate([
Action(Data.ResetSelectedResourceTypeId)
], DataState.prototype, "resetSelectedResourceTypeId", null);
__decorate([
Action(Data.SetSelectedEntryIds)
], DataState.prototype, "setSelectedEntryIds", null);
__decorate([
Action(Data.ResetSelectedEntryIds)
], DataState.prototype, "resetSelectedEntryIds", null);
__decorate([
Action(Data.SetSelectedEntryId)
], DataState.prototype, "setSelectedEntryId", null);
__decorate([
Action(Data.ResetSelectedEntryId)
], DataState.prototype, "resetSelectedEntryId", null);
__decorate([
Action(Data.SetSelectedEntryExternalId)
], DataState.prototype, "setSelectedEntryExternalId", null);
__decorate([
Action(Data.ResetSelectedEntryExternalId)
], DataState.prototype, "resetSelectedEntryExternalId", null);
__decorate([
Action(Data.SetSelectedEntryParentIds)
], DataState.prototype, "setSelectedEntryParentIds", null);
__decorate([
Action(Data.ResetSelectedEntryParentIds)
], DataState.prototype, "resetSelectedEntryParentIds", null);
__decorate([
Action(Data.SetSelectedEntryParentId)
], DataState.prototype, "setSelectedEntryParentId", null);
__decorate([
Action(Data.ResetSelectedEntryParentId)
], DataState.prototype, "resetSelectedEntryParentId", null);
__decorate([
Action(Data.SetSelectedEntryParentExternalId)
], DataState.prototype, "setSelectedEntryParentExternalId", null);
__decorate([
Action(Data.ResetSelectedEntryParentExternalId)
], DataState.prototype, "resetSelectedEntryParentExternalId", null);
__decorate([
Action(Data.SetRootIdSelectedResourceType)
], DataState.prototype, "setRootIdSelectedResourceType", null);
__decorate([
Action(Data.ResetRootIdSelectedResourceType)
], DataState.prototype, "resetIdRootSelectedResourceType", null);
__decorate([
Action(Data.InitDataJsTable)
], DataState.prototype, "initDataJsTable", null);
__decorate([
Action(Data.ToggleFoldTreeNode)
], DataState.prototype, "toggleFoldTreeNode", null);
__decorate([
Action(Data.SetFilterValue)
], DataState.prototype, "setFilterValue", null);
__decorate([
Action(Data.SetSearchFormValue)
], DataState.prototype, "setSearchFormValue", null);
__decorate([
Action(Data.SetAdvancedSearchChips)
], DataState.prototype, "setAdvancedSearchChips", null);
__decorate([
Action(Data.ResetSearchFormValue)
], DataState.prototype, "resetSearchFormValue", null);
__decorate([
Action(Data.RemoveAdvancedSearchChip)
], DataState.prototype, "removeAdvancedSearchChip", null);
__decorate([
Action(Data.ResetAdvancedSearchChips)
], DataState.prototype, "resetAdvancedSearchChips", null);
__decorate([
Action(Data.FilterResources)
], DataState.prototype, "filterResources", null);
__decorate([
Action(Data.FetchResources)
], DataState.prototype, "fetchResources", null);
__decorate([
Action([Data.StopFilteringResources])
], DataState.prototype, "stopFilteringResources", null);
__decorate([
Action(Data.AddEntryIdMatchingAdvancedSearch)
], DataState.prototype, "addEntryIdMatchingAdvancedSearch", null);
__decorate([
Action(Data.RemoveEntriesIdsMatchingAdvancedSearch)
], DataState.prototype, "removeEntriesIdsMatchingAdvancedSearch", null);
__decorate([
Action(Data.FetchResourcesSuccess)
], DataState.prototype, "fetchResourcesSuccess", null);
__decorate([
Action(Data.FetchResourcesError)
], DataState.prototype, "fetchResourcesError", null);
__decorate([
Action(Data.SetResources)
], DataState.prototype, "setResources", null);
__decorate([
Action(Data.ResetResources)
], DataState.prototype, "resetResources", null);
__decorate([
Action(Data.FetchDataDetail)
], DataState.prototype, "fetchDataDetail", null);
__decorate([
Action(Data.FetchDataDetailSuccess)
], DataState.prototype, "fetchDataDetailSuccess", null);
__decorate([
Action(Data.FetchDataDetailError)
], DataState.prototype, "fetchDataDetailError", null);
__decorate([
Action(Data.SetDataDetail)
], DataState.prototype, "setDataDetail", null);
__decorate([
Action(Data.ResetDataDetail)
], DataState.prototype, "resetDataDetail", null);
__decorate([
Selector()
], DataState, "getDataState", null);
__decorate([
Selector()
], DataState, "getSelectedResourceTypeId", null);
__decorate([
Selector()
], DataState, "getSelectedEntryIds", null);
__decorate([
Selector()
], DataState, "getSelectedEntryId", null);
__decorate([
Selector()
], DataState, "getSelectedEntryExternalId", null);
__decorate([
Selector()
], DataState, "getSelectedEntryParentIds", null);
__decorate([
Selector()
], DataState, "getSelectedEntryParentId", null);
__decorate([
Selector()
], DataState, "getSelectedEntryParentExternalId", null);
__decorate([
Selector()
], DataState, "getRootIdSelectedResourceType", null);
__decorate([
Selector()
], DataState, "isFetchingResources", null);
__decorate([
Selector()
], DataState, "isFetchingResourcesSuccess", null);
__decorate([
Selector()
], DataState, "isFetchingResourcesError", null);
__decorate([
Selector()
], DataState, "getResources", null);
__decorate([
Selector()
], DataState, "getEntriesIdsMatchingAdvancedSearch", null);
__decorate([
Selector()
], DataState, "isFetchingDataDetail", null);
__decorate([
Selector()
], DataState, "isFetchingDataDetailSuccess", null);
__decorate([
Selector()
], DataState, "isFetchingDataDetailError", null);
__decorate([
Selector()
], DataState, "getDataDetail", null);
__decorate([
Selector()
], DataState, "getDataById", null);
__decorate([
Selector()
], DataState, "getDataAllIds", null);
__decorate([
Selector()
], DataState, "getDataJsTable", null);
__decorate([
Selector()
], DataState, "getAdvancedSearchChips", null);
__decorate([
Selector()
], DataState, "getSearchFormValue", null);
__decorate([
Selector()
], DataState, "isAdvancedSearchActivated", null);
DataState = __decorate([
State({
name: 'data',
defaults: initDataStateDefaultValues(),
})
], DataState);
export { DataState };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: DataState, decorators: [{
type: Injectable
}], propDecorators: { setSelectedResourceTypeId: [], resetSelectedResourceTypeId: [], setSelectedEntryIds: [], resetSelectedEntryIds: [], setSelectedEntryId: [], resetSelectedEntryId: [], setSelectedEntryExternalId: [], resetSelectedEntryExternalId: [], setSelectedEntryParentIds: [], resetSelectedEntryParentIds: [], setSelectedEntryParentId: [], resetSelectedEntryParentId: [], setSelectedEntryParentExternalId: [], resetSelectedEntryParentExternalId: [], setRootIdSelectedResourceType: [], resetIdRootSelectedResourceType: [], initDataJsTable: [], toggleFoldTreeNode: [], setFilterValue: [], setSearchFormValue: [], setAdvancedSearchChips: [], resetSearchFormValue: [], removeAdvancedSearchChip: [], resetAdvancedSearchChips: [], filterResources: [], fetchResources: [], stopFilteringResources: [], addEntryIdMatchingAdvancedSearch: [], removeEntriesIdsMatchingAdvancedSearch: [], fetchResourcesSuccess: [], fetchResourcesError: [], setResources: [], resetResources: [], fetchDataDetail: [], fetchDataDetailSuccess: [], fetchDataDetailError: [], setDataDetail: [], resetDataDetail: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS5zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xpYnMvY2xpZW50LWNvcmUvc3JjL2xpYi9zaGFyZWQvc3RhdGVzL2RhdGEvZGF0YS5zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWdCLE1BQU0sYUFBYSxDQUFDO0FBQ3BFLE9BQU8sRUFFTCxZQUFZLEVBQ1osT0FBTyxFQUNQLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSw4QkFBOEIsQ0FBQztBQVN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGdCQUFnQixDQUFDOztBQWtCdkMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLEVBQUU7SUFDdkMsT0FBTztRQUNMLFdBQVcsRUFBRSxFQUFFO1FBQ2YsVUFBVSxFQUFFLEVBQUU7UUFDZCxzQkFBc0IsRUFBRSxFQUFFO1FBQzFCLG1CQUFtQixFQUFFLEVBQUU7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsT0FBTztRQUNMLEdBQUcsWUFBWSxFQUFxQjtRQUNwQyxzQkFBc0IsRUFBRSxJQUFJO1FBQzVCLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsc0JBQXNCLEVBQUUsSUFBSTtRQUM1QiwwQkFBMEIsRUFBRSxJQUFJO1FBQ2hDLG1CQUFtQixFQUFFLEtBQUs7UUFDMUIsd0JBQXdCLEVBQUUsS0FBSztRQUMvQiwwQkFBMEIsRUFBRSxLQUFLO1FBQ2pDLFNBQVMsRUFBRSxJQUFJO1FBQ2YsZ0NBQWdDLEVBQUUsRUFBRTtRQUNwQyxvQkFBb0IsRUFBRSxLQUFLO1FBQzNCLHlCQUF5QixFQUFFLEtBQUs7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QUFvQixNQWtCcEIsd0JBQXdCLE1BNEJ4Qix3QkFBd0IsTUFnQnhCLGVBQWUsTUFVZixjQUFjLE1BWWQsc0JBQXNCLE1BUXRCLGdDQUFnQyxNQWNoQyxzQ0FBc0MsTUFVdEMscUJBQXFCLE1BZXJCLG1CQUFtQixNQVduQixZQUFZLE1BV1osY0FBYyxNQVNkLGVBQWUsTUFXZixzQkFBc0IsTUFTdEIsb0JBQW9CLE1BVXBCLGFBQWEsTUFXYixlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyNCBMaW5hZ29yYVxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyXG4gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55XG4gKiBsYXRlciB2ZXJzaW9uLCBwcm92aWRlZCB5b3UgY29tcGx5IHdpdGggdGhlIEFkZGl0aW9uYWwgVGVybXMgYXBwbGljYWJsZSBmb3JcbiAqIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIHNvZnR3YXJlIGJ5IExJTkFHT1JBIHB1cnN1YW50IHRvIFNlY3Rpb24gNyBvZiB0aGUgR05VXG4gKiBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgc3Vic2VjdGlvbnMgKGIpLCAoYyksIGFuZCAoZSksIHB1cnN1YW50IHRvXG4gKiB3aGljaCB0aGVzZSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzIG11c3Qgbm90YWJseSAoaSkgcmV0YWluIHRoZSBkaXNwbGF5IG9mXG4gKiB0aGUgXCJMaW5JROKEolwiIHRyYWRlbWFyay9sb2dvIGF0IHRoZSB0b3Agb2YgdGhlIGludGVyZmFjZSB3aW5kb3csIHRoZSBkaXNwbGF5XG4gKiBvZiB0aGUg4oCcWW91IGFyZSB1c2luZyB0aGUgT3BlbiBTb3VyY2UgYW5kIGZyZWUgdmVyc2lvbiBvZiBMaW5JROKEoiwgcG93ZXJlZCBieVxuICogTGluYWdvcmEgwqkgMjAwOeKAkzIwMTMuIENvbnRyaWJ1dGUgdG8gTGluSUQgUiZEIGJ5IHN1YnNjcmliaW5nIHRvIGFuIEVudGVycHJpc2VcbiAqIG9mZmVyIeKAnSBpbmZvYm94IGFuZCBpbiB0aGUgZS1tYWlscyBzZW50IHdpdGggdGhlIFByb2dyYW0sIG5vdGljZSBhcHBlbmRlZCB0b1xuICogYW55IHR5cGUgb2Ygb3V0Ym91bmQgbWVzc2FnZXMgKGUuZy4gZS1tYWlsIGFuZCBtZWV0aW5nIHJlcXVlc3RzKSBhcyB3ZWxsIGFzXG4gKiBpbiB0aGUgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgdXNlciBpbnRlcmZhY2UsIChpaSkgcmV0YWluIGFsbCBoeXBlcnRleHRcbiAqIGxpbmtzIGJldHdlZW4gTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgYW5kIGh0dHBzOi8vbGluaWQub3JnLywgYXMgd2VsbCBhc1xuICogYmV0d2VlbiBMSU5BR09SQSBhbmQgTElOQUdPUkEuY29tLCBhbmQgKGlpaSkgcmVmcmFpbiBmcm9tIGluZnJpbmdpbmcgTElOQUdPUkFcbiAqIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3ZlciBpdHMgdHJhZGVtYXJrcyBhbmQgY29tbWVyY2lhbCBicmFuZHMuIE90aGVyXG4gKiBBZGRpdGlvbmFsIFRlcm1zIGFwcGx5LCBzZWUgPGh0dHA6Ly93d3cubGluYWdvcmEuY29tL2xpY2Vuc2VzLz4gZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXG4gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTU1xuICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kXG4gKiBpdHMgYXBwbGljYWJsZSBBZGRpdGlvbmFsIFRlcm1zIGZvciBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBhbG9uZyB3aXRoIHRoaXNcbiAqIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPiBmb3IgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIGFuZCA8aHR0cDovL3d3dy5saW5hZ29yYS5jb20vbGljZW5zZXMvPiBmb3JcbiAqIHRoZSBBZGRpdGlvbmFsIFRlcm1zIGFwcGxpY2FibGUgdG8gdGhlIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIHNvZnR3YXJlLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbiwgU2VsZWN0b3IsIFN0YXRlLCBTdGF0ZUNvbnRleHQgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQge1xuICBKc1RhYmxlLFxuICBlbXB0eUpzVGFibGUsXG4gIHB1dEJ5SWQsXG4gIHRvSnNUYWJsZSxcbiAgdXBkYXRlQnlJZCxcbn0gZnJvbSAnLi4vLi4vaGVscGVycy9qc3RhYmxlLmhlbHBlcic7XG5pbXBvcnQge1xuICBJRGF0YSxcbiAgSURhdGFJdGVtLFxuICBJRGF0YU5vZGUsXG4gIElFbnRyeUlkcyxcbiAgSVBlcnNpc3RlbnRVaURhdGEsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUFkdmFuY2VkU2VhcmNoQ2hpcCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdWkuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIERhdGEgZnJvbSAnLi9kYXRhLmFjdGlvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdGF0ZU1vZGVsIGV4dGVuZHMgSnNUYWJsZTxJUGVyc2lzdGVudFVpRGF0YT4ge1xuICBzZWxlY3RlZFJlc291cmNlVHlwZUlkOiBzdHJpbmc7XG4gIHNlbGVjdGVkRW50cnlJZHM6IElFbnRyeUlkcztcbiAgc2VsZWN0ZWRFbnRyeVBhcmVudElkczogSUVudHJ5SWRzO1xuICByb290SWRTZWxlY3RlZFJlc291cmNlVHlwZTogc3RyaW5nO1xuICBpc0ZldGNoaW5nUmVzb3VyY2VzOiBib29sZWFuO1xuICBpc0ZldGNoaW5nUmVzb3VyY2VzRXJyb3I6IGJvb2xlYW47XG4gIGlzRmV0Y2hpbmdSZXNvdXJjZXNTdWNjZXNzOiBib29sZWFuO1xuICByZXNvdXJjZXM6IElEYXRhIHwgSURhdGFOb2RlW10gfCBJRGF0YUl0ZW1bXTtcbiAgZW50cmllc0lkc01hdGNoaW5nQWR2YW5jZWRTZWFyY2g6IHsgW2lkOiBzdHJpbmddOiB0cnVlIH07XG4gIGlzRmV0Y2hpbmdEYXRhRGV0YWlsOiBib29sZWFuO1xuICBpc0ZldGNoaW5nRGF0YURldGFpbEVycm9yOiBib29sZWFuO1xuICBpc0ZldGNoaW5nRGF0YURldGFpbFN1Y2Nlc3M6IGJvb2xlYW47XG4gIGRhdGFEZXRhaWw6IGFueTtcbn1cblxuY29uc3QgX3BlcnNpc3RlbnRVaURhdGFSb3dGYWN0b3J5ID0gKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIGZpbHRlclZhbHVlOiAnJyxcbiAgICBzZWFyY2hGb3JtOiAnJyxcbiAgICBleHBhbmRlZFRyZWVOb2Rlc1V1aWRzOiBbXSxcbiAgICBhZHZhbmNlZFNlYXJjaENoaXBzOiBbXSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0RGF0YVN0YXRlRGVmYXVsdFZhbHVlcygpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5lbXB0eUpzVGFibGU8SVBlcnNpc3RlbnRVaURhdGE+KCksXG4gICAgc2VsZWN0ZWRSZXNvdXJjZVR5cGVJZDogbnVsbCxcbiAgICBzZWxlY3RlZEVudHJ5SWRzOiBudWxsLFxuICAgIHNlbGVjdGVkRW50cnlQYXJlbnRJZHM6IG51bGwsXG4gICAgcm9vdElkU2VsZWN0ZWRSZXNvdXJjZVR5cGU6IG51bGwsXG4gICAgaXNGZXRjaGluZ1Jlc291cmNlczogZmFsc2UsXG4gICAgaXNGZXRjaGluZ1Jlc291cmNlc0Vycm9yOiBmYWxzZSxcbiAgICBpc0ZldGNoaW5nUmVzb3VyY2VzU3VjY2VzczogZmFsc2UsXG4gICAgcmVzb3VyY2VzOiBudWxsLFxuICAgIGVudHJpZXNJZHNNYXRjaGluZ0FkdmFuY2VkU2VhcmNoOiB7fSxcbiAgICBpc0ZldGNoaW5nRGF0YURldGFpbDogZmFsc2UsXG4gICAgaXNGZXRjaGluZ0RhdGFEZXRhaWxFcnJvcjogZmFsc2UsXG4gICAgaXNGZXRjaGluZ0RhdGFEZXRhaWxTdWNjZXNzOiBmYWxzZSxcbiAgICBkYXRhRGV0YWlsOiBudWxsLFxuICB9O1xufVxuXG5AU3RhdGU8RGF0YVN0YXRlTW9kZWw+KHtcbiAgbmFtZTogJ2RhdGEnLFxuICBkZWZhdWx0czogaW5pdERhdGFTdGF0ZURlZmF1bHRWYWx1ZXMoKSxcbn0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0YVN0YXRlIHtcbiAgQFNlbGVjdG9yKClcbiAgc3RhdGljIGdldERhdGFTdGF0ZShzdGF0ZTogRGF0YVN0YXRlTW9kZWwpOiBEYXRhU3RhdGVNb2RlbCB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgQFNlbGVjdG9yKClcbiAgc3RhdGljIGdldFNlbGVjdGVkUmVzb3VyY2VUeXBlSWQoc3RhdGU6IERhdGFTdGF0ZU1vZGVsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RhdGUuc2VsZWN0ZWRSZXNvdXJjZVR5cGVJZDtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHN0YXRpYyBnZXRTZWxlY3RlZEVudHJ5SWRzKHN0YXRlOiBEYXRhU3RhdGVNb2RlbCk6IElFbnRyeUlkcyB7XG4gICAgcmV0dXJuIHN0YXRlLnNlbGVjdGVkRW50cnlJZHM7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBzdGF0aWMgZ2V0U2VsZWN0ZWRFbnRyeUlkKHN0YXRlOiBEYXRhU3RhdGVNb2RlbCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0YXRlLnNlbGVjdGVkRW50cnlJZHMuaWQ7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBzdGF0aWMgZ2V0U2VsZWN0ZWRFbnRyeUV4dGVybmFsSWQoc3RhdGU6IERhdGFTdGF0ZU1vZGVsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RhdGUuc2VsZWN0ZWRFbnRyeUlkcy5leHRlcm5hbElkO1xuICB9XG5cbiAgQFNlbGVjdG9yKClcbiAgc3RhdGljIGdldFNlbGVjdGVkRW50cnlQYXJlbnRJZHMoc3RhdGU6IERhdGFTdGF0ZU1vZGVsKTogSUVudHJ5SWRzIHtcbiAgICByZXR1cm4gc3RhdGUuc2VsZWN0ZWRFbnRyeVBhcmVudElkcztcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHN0YXRpYyBnZXRTZWxlY3RlZEVudHJ5UGFyZW50SWQoc3RhdGU6IERhdGFTdGF0ZU1vZGVsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RhdGUuc2VsZWN0ZWRFbnRyeVBhcmVudElkcy5pZDtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHN0YXRpYyBnZXRTZWxlY3RlZEVudHJ5UGFyZW50RXh0ZXJuYWxJZChzdGF0ZTogRGF0YVN0YXRlTW9kZWwpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdGF0ZS5zZWxlY3RlZEVudHJ5UGFyZW50SWRzLmV4dGVybmFsSWQ7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBzdGF0aWMgZ2V0Um9vdElkU2VsZWN0ZWRSZXNvdXJjZVR5cGUoc3RhdGU6IERhdGFTdGF0ZU1vZGVsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RhdGUucm9vdElkU2VsZWN0ZWRSZXNvdXJjZVR5cGU7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBzdGF0aWMgaXNGZXRjaGluZ1Jlc291cmNlcyhzdGF0ZTogRGF0YVN0YXRlTW9kZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RhdGUuaXNGZXRjaGluZ1Jlc291cmNlcztcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHN0YXRpYyBpc0ZldGNoaW5nUmVzb3VyY2VzU3VjY2VzcyhzdGF0ZTogRGF0YVN0YXRlTW9kZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RhdGUuaXNGZXRjaGluZ1Jlc291cmNlc1N1Y2Nlc3M7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBzdGF0aWMgaXNGZXRjaGluZ1Jlc291cmNlc0Vycm9yKHN0YXRlOiBEYXRhU3RhdGVNb2RlbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0ZS5pc0ZldGNoaW5nUmVzb3VyY2VzRXJyb3I7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBzdGF0aWMgZ2V0UmVzb3VyY2VzKFxuICAgIHN0YXRlOiBEYXRhU3RhdGVNb2RlbFxuICApOiBJRGF0YSB8IElEYXRhTm9kZVtdIHwgSU