@angular-architects/ngrx-toolkit 18.1.0 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -12
- package/fesm2022/angular-architects-ngrx-toolkit-redux-connector.mjs +15 -15
- package/fesm2022/angular-architects-ngrx-toolkit-redux-connector.mjs.map +1 -1
- package/fesm2022/angular-architects-ngrx-toolkit.mjs +487 -78
- package/fesm2022/angular-architects-ngrx-toolkit.mjs.map +1 -1
- package/index.d.ts +9 -2
- package/lib/devtools/features/with-disabled-name-indicies.d.ts +27 -0
- package/lib/devtools/features/with-glitch-tracking.d.ts +30 -0
- package/lib/devtools/features/with-mapper.d.ts +28 -0
- package/lib/devtools/internal/current-action-names.d.ts +1 -0
- package/lib/devtools/internal/default-tracker.d.ts +13 -0
- package/lib/devtools/internal/devtools-feature.d.ts +24 -0
- package/lib/devtools/internal/devtools-syncer.service.d.ts +35 -0
- package/lib/devtools/internal/glitch-tracker.service.d.ts +18 -0
- package/lib/devtools/internal/models.d.ts +25 -0
- package/lib/devtools/rename-devtools-name.d.ts +7 -0
- package/lib/devtools/update-state.d.ts +17 -0
- package/lib/devtools/with-dev-tools-stub.d.ts +5 -0
- package/lib/devtools/with-devtools.d.ts +30 -0
- package/lib/shared/prettify.d.ts +1 -1
- package/lib/shared/throw-if-null.d.ts +1 -0
- package/lib/with-call-state.d.ts +2 -2
- package/lib/with-data-service.d.ts +3 -3
- package/lib/with-pagination.d.ts +4 -4
- package/lib/with-reset.d.ts +29 -0
- package/lib/with-storage-sync.d.ts +2 -2
- package/lib/with-undo-redo.d.ts +4 -3
- package/package.json +6 -7
- package/redux-connector/src/lib/create-redux.d.ts +4 -4
- package/redux-connector/src/lib/model.d.ts +5 -0
- package/redux-connector/src/lib/rxjs-interop/redux-method.d.ts +5 -2
- package/redux-connector/src/lib/signal-redux-store.d.ts +10 -2
- package/redux-connector/src/lib/util.d.ts +2 -2
- package/esm2022/angular-architects-ngrx-toolkit.mjs +0 -5
- package/esm2022/index.mjs +0 -8
- package/esm2022/lib/assertions/assertions.mjs +0 -6
- package/esm2022/lib/shared/prettify.mjs +0 -2
- package/esm2022/lib/shared/signal-store-models.mjs +0 -2
- package/esm2022/lib/with-call-state.mjs +0 -60
- package/esm2022/lib/with-data-service.mjs +0 -202
- package/esm2022/lib/with-devtools.mjs +0 -92
- package/esm2022/lib/with-pagination.mjs +0 -209
- package/esm2022/lib/with-redux.mjs +0 -100
- package/esm2022/lib/with-storage-sync.mjs +0 -56
- package/esm2022/lib/with-undo-redo.mjs +0 -113
- package/esm2022/redux-connector/angular-architects-ngrx-toolkit-redux-connector.mjs +0 -5
- package/esm2022/redux-connector/index.mjs +0 -3
- package/esm2022/redux-connector/src/lib/create-redux.mjs +0 -41
- package/esm2022/redux-connector/src/lib/model.mjs +0 -2
- package/esm2022/redux-connector/src/lib/rxjs-interop/redux-method.mjs +0 -22
- package/esm2022/redux-connector/src/lib/signal-redux-store.mjs +0 -43
- package/esm2022/redux-connector/src/lib/util.mjs +0 -13
- package/lib/with-devtools.d.ts +0 -38
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { computed, inject } from '@angular/core';
|
|
2
|
-
import { patchState, signalStoreFeature, withComputed, withMethods, withState, } from '@ngrx/signals';
|
|
3
|
-
import { getCallStateKeys, setError, setLoaded, setLoading, } from './with-call-state';
|
|
4
|
-
import { setAllEntities, addEntity, updateEntity, removeEntity, } from '@ngrx/signals/entities';
|
|
5
|
-
export function capitalize(str) {
|
|
6
|
-
return str ? str[0].toUpperCase() + str.substring(1) : str;
|
|
7
|
-
}
|
|
8
|
-
export function getDataServiceKeys(options) {
|
|
9
|
-
const filterKey = options.collection
|
|
10
|
-
? `${options.collection}Filter`
|
|
11
|
-
: 'filter';
|
|
12
|
-
const selectedIdsKey = options.collection
|
|
13
|
-
? `selected${capitalize(options.collection)}Ids`
|
|
14
|
-
: 'selectedIds';
|
|
15
|
-
const selectedEntitiesKey = options.collection
|
|
16
|
-
? `selected${capitalize(options.collection)}Entities`
|
|
17
|
-
: 'selectedEntities';
|
|
18
|
-
const updateFilterKey = options.collection
|
|
19
|
-
? `update${capitalize(options.collection)}Filter`
|
|
20
|
-
: 'updateFilter';
|
|
21
|
-
const updateSelectedKey = options.collection
|
|
22
|
-
? `updateSelected${capitalize(options.collection)}Entities`
|
|
23
|
-
: 'updateSelected';
|
|
24
|
-
const loadKey = options.collection
|
|
25
|
-
? `load${capitalize(options.collection)}Entities`
|
|
26
|
-
: 'load';
|
|
27
|
-
const currentKey = options.collection
|
|
28
|
-
? `current${capitalize(options.collection)}`
|
|
29
|
-
: 'current';
|
|
30
|
-
const loadByIdKey = options.collection
|
|
31
|
-
? `load${capitalize(options.collection)}ById`
|
|
32
|
-
: 'loadById';
|
|
33
|
-
const setCurrentKey = options.collection
|
|
34
|
-
? `setCurrent${capitalize(options.collection)}`
|
|
35
|
-
: 'setCurrent';
|
|
36
|
-
const createKey = options.collection
|
|
37
|
-
? `create${capitalize(options.collection)}`
|
|
38
|
-
: 'create';
|
|
39
|
-
const updateKey = options.collection
|
|
40
|
-
? `update${capitalize(options.collection)}`
|
|
41
|
-
: 'update';
|
|
42
|
-
const updateAllKey = options.collection
|
|
43
|
-
? `updateAll${capitalize(options.collection)}`
|
|
44
|
-
: 'updateAll';
|
|
45
|
-
const deleteKey = options.collection
|
|
46
|
-
? `delete${capitalize(options.collection)}`
|
|
47
|
-
: 'delete';
|
|
48
|
-
// TODO: Take these from @ngrx/signals/entities, when they are exported
|
|
49
|
-
const entitiesKey = options.collection
|
|
50
|
-
? `${options.collection}Entities`
|
|
51
|
-
: 'entities';
|
|
52
|
-
const entityMapKey = options.collection
|
|
53
|
-
? `${options.collection}EntityMap`
|
|
54
|
-
: 'entityMap';
|
|
55
|
-
const idsKey = options.collection ? `${options.collection}Ids` : 'ids';
|
|
56
|
-
return {
|
|
57
|
-
filterKey,
|
|
58
|
-
selectedIdsKey,
|
|
59
|
-
selectedEntitiesKey,
|
|
60
|
-
updateFilterKey,
|
|
61
|
-
updateSelectedKey,
|
|
62
|
-
loadKey,
|
|
63
|
-
entitiesKey,
|
|
64
|
-
entityMapKey,
|
|
65
|
-
idsKey,
|
|
66
|
-
currentKey,
|
|
67
|
-
loadByIdKey,
|
|
68
|
-
setCurrentKey,
|
|
69
|
-
createKey,
|
|
70
|
-
updateKey,
|
|
71
|
-
updateAllKey,
|
|
72
|
-
deleteKey,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
-
export function withDataService(options) {
|
|
77
|
-
const { dataServiceType, filter, collection: prefix } = options;
|
|
78
|
-
const { entitiesKey, filterKey, loadKey, selectedEntitiesKey, selectedIdsKey, updateFilterKey, updateSelectedKey, currentKey, createKey, updateKey, updateAllKey, deleteKey, loadByIdKey, setCurrentKey, } = getDataServiceKeys(options);
|
|
79
|
-
const { callStateKey } = getCallStateKeys({ collection: prefix });
|
|
80
|
-
return signalStoreFeature(withState(() => ({
|
|
81
|
-
[filterKey]: filter,
|
|
82
|
-
[selectedIdsKey]: {},
|
|
83
|
-
[currentKey]: undefined,
|
|
84
|
-
})), withComputed((store) => {
|
|
85
|
-
const entities = store[entitiesKey];
|
|
86
|
-
const selectedIds = store[selectedIdsKey];
|
|
87
|
-
return {
|
|
88
|
-
[selectedEntitiesKey]: computed(() => entities().filter((e) => selectedIds()[e.id])),
|
|
89
|
-
};
|
|
90
|
-
}), withMethods((store) => {
|
|
91
|
-
const dataService = inject(dataServiceType);
|
|
92
|
-
return {
|
|
93
|
-
[updateFilterKey]: (filter) => {
|
|
94
|
-
patchState(store, { [filterKey]: filter });
|
|
95
|
-
},
|
|
96
|
-
[updateSelectedKey]: (id, selected) => {
|
|
97
|
-
patchState(store, (state) => ({
|
|
98
|
-
[selectedIdsKey]: {
|
|
99
|
-
...state[selectedIdsKey],
|
|
100
|
-
[id]: selected,
|
|
101
|
-
},
|
|
102
|
-
}));
|
|
103
|
-
},
|
|
104
|
-
[loadKey]: async () => {
|
|
105
|
-
const filter = store[filterKey];
|
|
106
|
-
store[callStateKey] && patchState(store, setLoading(prefix));
|
|
107
|
-
try {
|
|
108
|
-
const result = await dataService.load(filter());
|
|
109
|
-
patchState(store, prefix
|
|
110
|
-
? setAllEntities(result, { collection: prefix })
|
|
111
|
-
: setAllEntities(result));
|
|
112
|
-
store[callStateKey] && patchState(store, setLoaded(prefix));
|
|
113
|
-
}
|
|
114
|
-
catch (e) {
|
|
115
|
-
store[callStateKey] && patchState(store, setError(e, prefix));
|
|
116
|
-
throw e;
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
[loadByIdKey]: async (id) => {
|
|
120
|
-
store[callStateKey] && patchState(store, setLoading(prefix));
|
|
121
|
-
try {
|
|
122
|
-
const current = await dataService.loadById(id);
|
|
123
|
-
store[callStateKey] && patchState(store, setLoaded(prefix));
|
|
124
|
-
patchState(store, { [currentKey]: current });
|
|
125
|
-
}
|
|
126
|
-
catch (e) {
|
|
127
|
-
store[callStateKey] && patchState(store, setError(e, prefix));
|
|
128
|
-
throw e;
|
|
129
|
-
}
|
|
130
|
-
},
|
|
131
|
-
[setCurrentKey]: (current) => {
|
|
132
|
-
patchState(store, { [currentKey]: current });
|
|
133
|
-
},
|
|
134
|
-
[createKey]: async (entity) => {
|
|
135
|
-
patchState(store, { [currentKey]: entity });
|
|
136
|
-
store[callStateKey] && patchState(store, setLoading(prefix));
|
|
137
|
-
try {
|
|
138
|
-
const created = await dataService.create(entity);
|
|
139
|
-
patchState(store, { [currentKey]: created });
|
|
140
|
-
patchState(store, prefix
|
|
141
|
-
? addEntity(created, { collection: prefix })
|
|
142
|
-
: addEntity(created));
|
|
143
|
-
store[callStateKey] && patchState(store, setLoaded(prefix));
|
|
144
|
-
}
|
|
145
|
-
catch (e) {
|
|
146
|
-
store[callStateKey] && patchState(store, setError(e, prefix));
|
|
147
|
-
throw e;
|
|
148
|
-
}
|
|
149
|
-
},
|
|
150
|
-
[updateKey]: async (entity) => {
|
|
151
|
-
patchState(store, { [currentKey]: entity });
|
|
152
|
-
store[callStateKey] && patchState(store, setLoading(prefix));
|
|
153
|
-
try {
|
|
154
|
-
const updated = await dataService.update(entity);
|
|
155
|
-
patchState(store, { [currentKey]: updated });
|
|
156
|
-
const updateArg = {
|
|
157
|
-
id: updated.id,
|
|
158
|
-
changes: updated,
|
|
159
|
-
};
|
|
160
|
-
const updater = (collection) => updateEntity(updateArg, { collection });
|
|
161
|
-
patchState(store, prefix ? updater(prefix) : updateEntity(updateArg));
|
|
162
|
-
store[callStateKey] && patchState(store, setLoaded(prefix));
|
|
163
|
-
}
|
|
164
|
-
catch (e) {
|
|
165
|
-
store[callStateKey] && patchState(store, setError(e, prefix));
|
|
166
|
-
throw e;
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
[updateAllKey]: async (entities) => {
|
|
170
|
-
store[callStateKey] && patchState(store, setLoading(prefix));
|
|
171
|
-
try {
|
|
172
|
-
const result = await dataService.updateAll(entities);
|
|
173
|
-
patchState(store, prefix
|
|
174
|
-
? setAllEntities(result, { collection: prefix })
|
|
175
|
-
: setAllEntities(result));
|
|
176
|
-
store[callStateKey] && patchState(store, setLoaded(prefix));
|
|
177
|
-
}
|
|
178
|
-
catch (e) {
|
|
179
|
-
store[callStateKey] && patchState(store, setError(e, prefix));
|
|
180
|
-
throw e;
|
|
181
|
-
}
|
|
182
|
-
},
|
|
183
|
-
[deleteKey]: async (entity) => {
|
|
184
|
-
patchState(store, { [currentKey]: entity });
|
|
185
|
-
store[callStateKey] && patchState(store, setLoading(prefix));
|
|
186
|
-
try {
|
|
187
|
-
await dataService.delete(entity);
|
|
188
|
-
patchState(store, { [currentKey]: undefined });
|
|
189
|
-
patchState(store, prefix
|
|
190
|
-
? removeEntity(entity.id, { collection: prefix })
|
|
191
|
-
: removeEntity(entity.id));
|
|
192
|
-
store[callStateKey] && patchState(store, setLoaded(prefix));
|
|
193
|
-
}
|
|
194
|
-
catch (e) {
|
|
195
|
-
store[callStateKey] && patchState(store, setError(e, prefix));
|
|
196
|
-
throw e;
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
};
|
|
200
|
-
}));
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kYXRhLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25ncngtdG9vbGtpdC9zcmMvbGliL3dpdGgtZGF0YS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBRUwsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osV0FBVyxFQUNYLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLGNBQWMsRUFFZCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksR0FDYixNQUFNLHdCQUF3QixDQUFDO0FBb0JoQyxNQUFNLFVBQVUsVUFBVSxDQUFDLEdBQVc7SUFDcEMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDN0QsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUFnQztJQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVTtRQUNsQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxRQUFRO1FBQy9CLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDYixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsVUFBVTtRQUN2QyxDQUFDLENBQUMsV0FBVyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLO1FBQ2hELENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDbEIsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsVUFB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O29CQUNGLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUM5RCxNQUFNLENBQUMsQ0FBQztnQkFDVixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDLENBQ0YsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3ZpZGVyVG9rZW4sIFNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgU2lnbmFsU3RvcmVGZWF0dXJlLFxuICBwYXRjaFN0YXRlLFxuICBzaWduYWxTdG9yZUZlYXR1cmUsXG4gIHdpdGhDb21wdXRlZCxcbiAgd2l0aE1ldGhvZHMsXG4gIHdpdGhTdGF0ZSxcbiAgRW1wdHlGZWF0dXJlUmVzdWx0LFxuICBXcml0YWJsZVN0YXRlU291cmNlLFxufSBmcm9tICdAbmdyeC9zaWduYWxzJztcbmltcG9ydCB7XG4gIENhbGxTdGF0ZSxcbiAgZ2V0Q2FsbFN0YXRlS2V5cyxcbiAgc2V0RXJyb3IsXG4gIHNldExvYWRlZCxcbiAgc2V0TG9hZGluZyxcbn0gZnJvbSAnLi93aXRoLWNhbGwtc3RhdGUnO1xuaW1wb3J0IHtcbiAgc2V0QWxsRW50aXRpZXMsXG4gIEVudGl0eUlkLFxuICBhZGRFbnRpdHksXG4gIHVwZGF0ZUVudGl0eSxcbiAgcmVtb3ZlRW50aXR5LFxufSBmcm9tICdAbmdyeC9zaWduYWxzL2VudGl0aWVzJztcbmltcG9ydCB7IEVudGl0eVN0YXRlLCBOYW1lZEVudGl0eUNvbXB1dGVkIH0gZnJvbSAnLi9zaGFyZWQvc2lnbmFsLXN0b3JlLW1vZGVscyc7XG5cbmV4cG9ydCB0eXBlIEZpbHRlciA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuZXhwb3J0IHR5cGUgRW50aXR5ID0geyBpZDogRW50aXR5SWQgfTtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU2VydmljZTxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPiB7XG4gIGxvYWQoZmlsdGVyOiBGKTogUHJvbWlzZTxFW10+O1xuXG4gIGxvYWRCeUlkKGlkOiBFbnRpdHlJZCk6IFByb21pc2U8RT47XG5cbiAgY3JlYXRlKGVudGl0eTogRSk6IFByb21pc2U8RT47XG5cbiAgdXBkYXRlKGVudGl0eTogRSk6IFByb21pc2U8RT47XG5cbiAgdXBkYXRlQWxsKGVudGl0eTogRVtdKTogUHJvbWlzZTxFW10+O1xuXG4gIGRlbGV0ZShlbnRpdHk6IEUpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHIgPyBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSkgOiBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhU2VydmljZUtleXMob3B0aW9uczogeyBjb2xsZWN0aW9uPzogc3RyaW5nIH0pIHtcbiAgY29uc3QgZmlsdGVyS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uXG4gICAgPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259RmlsdGVyYFxuICAgIDogJ2ZpbHRlcic7XG4gIGNvbnN0IHNlbGVjdGVkSWRzS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uXG4gICAgPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1JZHNgXG4gICAgOiAnc2VsZWN0ZWRJZHMnO1xuICBjb25zdCBzZWxlY3RlZEVudGl0aWVzS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uXG4gICAgPyBgc2VsZWN0ZWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1FbnRpdGllc2BcbiAgICA6ICdzZWxlY3RlZEVudGl0aWVzJztcblxuICBjb25zdCB1cGRhdGVGaWx0ZXJLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb25cbiAgICA/IGB1cGRhdGUke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1GaWx0ZXJgXG4gICAgOiAndXBkYXRlRmlsdGVyJztcbiAgY29uc3QgdXBkYXRlU2VsZWN0ZWRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb25cbiAgICA/IGB1cGRhdGVTZWxlY3RlZCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfUVudGl0aWVzYFxuICAgIDogJ3VwZGF0ZVNlbGVjdGVkJztcbiAgY29uc3QgbG9hZEtleSA9IG9wdGlvbnMuY29sbGVjdGlvblxuICAgID8gYGxvYWQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1FbnRpdGllc2BcbiAgICA6ICdsb2FkJztcblxuICBjb25zdCBjdXJyZW50S2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uXG4gICAgPyBgY3VycmVudCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWBcbiAgICA6ICdjdXJyZW50JztcbiAgY29uc3QgbG9hZEJ5SWRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb25cbiAgICA/IGBsb2FkJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9QnlJZGBcbiAgICA6ICdsb2FkQnlJZCc7XG4gIGNvbnN0IHNldEN1cnJlbnRLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb25cbiAgICA/IGBzZXRDdXJyZW50JHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YFxuICAgIDogJ3NldEN1cnJlbnQnO1xuICBjb25zdCBjcmVhdGVLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb25cbiAgICA/IGBjcmVhdGUke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gXG4gICAgOiAnY3JlYXRlJztcbiAgY29uc3QgdXBkYXRlS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uXG4gICAgPyBgdXBkYXRlJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9YFxuICAgIDogJ3VwZGF0ZSc7XG4gIGNvbnN0IHVwZGF0ZUFsbEtleSA9IG9wdGlvbnMuY29sbGVjdGlvblxuICAgID8gYHVwZGF0ZUFsbCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfWBcbiAgICA6ICd1cGRhdGVBbGwnO1xuICBjb25zdCBkZWxldGVLZXkgPSBvcHRpb25zLmNvbGxlY3Rpb25cbiAgICA/IGBkZWxldGUke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1gXG4gICAgOiAnZGVsZXRlJztcblxuICAvLyBUT0RPOiBUYWtlIHRoZXNlIGZyb20gQG5ncngvc2lnbmFscy9lbnRpdGllcywgd2hlbiB0aGV5IGFyZSBleHBvcnRlZFxuICBjb25zdCBlbnRpdGllc0tleSA9IG9wdGlvbnMuY29sbGVjdGlvblxuICAgID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUVudGl0aWVzYFxuICAgIDogJ2VudGl0aWVzJztcbiAgY29uc3QgZW50aXR5TWFwS2V5ID0gb3B0aW9ucy5jb2xsZWN0aW9uXG4gICAgPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259RW50aXR5TWFwYFxuICAgIDogJ2VudGl0eU1hcCc7XG4gIGNvbnN0IGlkc0tleSA9IG9wdGlvbnMuY29sbGVjdGlvbiA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1JZHNgIDogJ2lkcyc7XG5cbiAgcmV0dXJuIHtcbiAgICBmaWx0ZXJLZXksXG4gICAgc2VsZWN0ZWRJZHNLZXksXG4gICAgc2VsZWN0ZWRFbnRpdGllc0tleSxcbiAgICB1cGRhdGVGaWx0ZXJLZXksXG4gICAgdXBkYXRlU2VsZWN0ZWRLZXksXG4gICAgbG9hZEtleSxcbiAgICBlbnRpdGllc0tleSxcbiAgICBlbnRpdHlNYXBLZXksXG4gICAgaWRzS2V5LFxuXG4gICAgY3VycmVudEtleSxcbiAgICBsb2FkQnlJZEtleSxcbiAgICBzZXRDdXJyZW50S2V5LFxuICAgIGNyZWF0ZUtleSxcbiAgICB1cGRhdGVLZXksXG4gICAgdXBkYXRlQWxsS2V5LFxuICAgIGRlbGV0ZUtleSxcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZVN0YXRlPFxuICBFIGV4dGVuZHMgRW50aXR5LFxuICBGIGV4dGVuZHMgRmlsdGVyLFxuICBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nXG4+ID0ge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0t9RmlsdGVyYF06IEY7XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBzZWxlY3RlZCR7Q2FwaXRhbGl6ZTxLPn1JZHNgXTogUmVjb3JkPEVudGl0eUlkLCBib29sZWFuPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYGN1cnJlbnQke0NhcGl0YWxpemU8Sz59YF06IEU7XG59O1xuXG5leHBvcnQgdHlwZSBEYXRhU2VydmljZVN0YXRlPEUgZXh0ZW5kcyBFbnRpdHksIEYgZXh0ZW5kcyBGaWx0ZXI+ID0ge1xuICBmaWx0ZXI6IEY7XG4gIHNlbGVjdGVkSWRzOiBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+O1xuICBjdXJyZW50OiBFO1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YVNlcnZpY2VDb21wdXRlZDxFIGV4dGVuZHMgRW50aXR5PiA9IHtcbiAgc2VsZWN0ZWRFbnRpdGllczogU2lnbmFsPEVbXT47XG59O1xuXG5leHBvcnQgdHlwZSBOYW1lZERhdGFTZXJ2aWNlQ29tcHV0ZWQ8XG4gIEUgZXh0ZW5kcyBFbnRpdHksXG4gIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmdcbj4gPSB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYHNlbGVjdGVkJHtDYXBpdGFsaXplPEs+fUVudGl0aWVzYF06IFNpZ25hbDxFW10+O1xufTtcblxuZXhwb3J0IHR5cGUgTmFtZWREYXRhU2VydmljZU1ldGhvZHM8XG4gIEUgZXh0ZW5kcyBFbnRpdHksXG4gIEYgZXh0ZW5kcyBGaWx0ZXIsXG4gIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmdcbj4gPSB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYHVwZGF0ZSR7Q2FwaXRhbGl6ZTxLPn1GaWx0ZXJgXTogKGZpbHRlcjogRikgPT4gdm9pZDtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYHVwZGF0ZVNlbGVjdGVkJHtDYXBpdGFsaXplPEs+fUVudGl0aWVzYF06IChcbiAgICBpZDogRW50aXR5SWQsXG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW5cbiAgKSA9PiB2b2lkO1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgbG9hZCR7Q2FwaXRhbGl6ZTxLPn1FbnRpdGllc2BdOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgc2V0Q3VycmVudCR7Q2FwaXRhbGl6ZTxLPn1gXTogKGVudGl0eTogRSkgPT4gdm9pZDtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYGxvYWQke0NhcGl0YWxpemU8Sz59QnlJZGBdOiAoXG4gICAgaWQ6IEVudGl0eUlkXG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYGNyZWF0ZSR7Q2FwaXRhbGl6ZTxLPn1gXTogKGVudGl0eTogRSkgPT4gUHJvbWlzZTx2b2lkPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYHVwZGF0ZSR7Q2FwaXRhbGl6ZTxLPn1gXTogKGVudGl0eTogRSkgPT4gUHJvbWlzZTx2b2lkPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYHVwZGF0ZUFsbCR7Q2FwaXRhbGl6ZTxLPn1gXTogKFxuICAgIGVudGl0eTogRVtdXG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYGRlbGV0ZSR7Q2FwaXRhbGl6ZTxLPn1gXTogKGVudGl0eTogRSkgPT4gUHJvbWlzZTx2b2lkPjtcbn07XG5cbmV4cG9ydCB0eXBlIERhdGFTZXJ2aWNlTWV0aG9kczxFIGV4dGVuZHMgRW50aXR5LCBGIGV4dGVuZHMgRmlsdGVyPiA9IHtcbiAgdXBkYXRlRmlsdGVyOiAoZmlsdGVyOiBGKSA9PiB2b2lkO1xuICB1cGRhdGVTZWxlY3RlZDogKGlkOiBFbnRpdHlJZCwgc2VsZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGxvYWQ6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgc2V0Q3VycmVudChlbnRpdHk6IEUpOiB2b2lkO1xuICBsb2FkQnlJZChpZDogRW50aXR5SWQpOiBQcm9taXNlPHZvaWQ+O1xuICBjcmVhdGUoZW50aXR5OiBFKTogUHJvbWlzZTx2b2lkPjtcbiAgdXBkYXRlKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD47XG4gIHVwZGF0ZUFsbChlbnRpdGllczogRVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgZGVsZXRlKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERhdGFTZXJ2aWNlPFxuICBFIGV4dGVuZHMgRW50aXR5LFxuICBGIGV4dGVuZHMgRmlsdGVyLFxuICBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nXG4+KG9wdGlvbnM6IHtcbiAgZGF0YVNlcnZpY2VUeXBlOiBQcm92aWRlclRva2VuPERhdGFTZXJ2aWNlPEUsIEY+PjtcbiAgZmlsdGVyOiBGO1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xufSk6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgLy8gVGhlc2UgYWx0ZXJuYXRpdmVzIGJyZWFrIHR5cGUgaW5mZXJlbmNlOlxuICAvLyBzdGF0ZTogeyBjYWxsU3RhdGU6IENhbGxTdGF0ZSB9ICYgTmFtZWRFbnRpdHlTdGF0ZTxFLCBDb2xsZWN0aW9uPixcbiAgLy8gc3RhdGU6IE5hbWVkRW50aXR5U3RhdGU8RSwgQ29sbGVjdGlvbj4sXG4gIEVtcHR5RmVhdHVyZVJlc3VsdCAmIHsgY29tcHV0ZWQ6IE5hbWVkRW50aXR5Q29tcHV0ZWQ8RSwgQ29sbGVjdGlvbj4gfSxcbiAge1xuICAgIHN0YXRlOiBOYW1lZERhdGFTZXJ2aWNlU3RhdGU8RSwgRiwgQ29sbGVjdGlvbj47XG4gICAgY29tcHV0ZWQ6IE5hbWVkRGF0YVNlcnZpY2VDb21wdXRlZDxFLCBDb2xsZWN0aW9uPjtcbiAgICBtZXRob2RzOiBOYW1lZERhdGFTZXJ2aWNlTWV0aG9kczxFLCBGLCBDb2xsZWN0aW9uPjtcbiAgfVxuPjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGF0YVNlcnZpY2U8RSBleHRlbmRzIEVudGl0eSwgRiBleHRlbmRzIEZpbHRlcj4ob3B0aW9uczoge1xuICBkYXRhU2VydmljZVR5cGU6IFByb3ZpZGVyVG9rZW48RGF0YVNlcnZpY2U8RSwgRj4+O1xuICBmaWx0ZXI6IEY7XG59KTogU2lnbmFsU3RvcmVGZWF0dXJlPFxuICBFbXB0eUZlYXR1cmVSZXN1bHQgJiB7IHN0YXRlOiB7IGNhbGxTdGF0ZTogQ2FsbFN0YXRlIH0gJiBFbnRpdHlTdGF0ZTxFPiB9LFxuICB7XG4gICAgc3RhdGU6IERhdGFTZXJ2aWNlU3RhdGU8RSwgRj47XG4gICAgY29tcHV0ZWQ6IERhdGFTZXJ2aWNlQ29tcHV0ZWQ8RT47XG4gICAgbWV0aG9kczogRGF0YVNlcnZpY2VNZXRob2RzPEUsIEY+O1xuICB9XG4+O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEYXRhU2VydmljZTxcbiAgRSBleHRlbmRzIEVudGl0eSxcbiAgRiBleHRlbmRzIEZpbHRlcixcbiAgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZ1xuPihvcHRpb25zOiB7XG4gIGRhdGFTZXJ2aWNlVHlwZTogUHJvdmlkZXJUb2tlbjxEYXRhU2VydmljZTxFLCBGPj47XG4gIGZpbHRlcjogRjtcbiAgY29sbGVjdGlvbj86IENvbGxlY3Rpb247XG59KTogU2lnbmFsU3RvcmVGZWF0dXJlPGFueSwgYW55PiB7XG4gIGNvbnN0IHsgZGF0YVNlcnZpY2VUeXBlLCBmaWx0ZXIsIGNvbGxlY3Rpb246IHByZWZpeCB9ID0gb3B0aW9ucztcbiAgY29uc3Qge1xuICAgIGVudGl0aWVzS2V5LFxuICAgIGZpbHRlcktleSxcbiAgICBsb2FkS2V5LFxuICAgIHNlbGVjdGVkRW50aXRpZXNLZXksXG4gICAgc2VsZWN0ZWRJZHNLZXksXG4gICAgdXBkYXRlRmlsdGVyS2V5LFxuICAgIHVwZGF0ZVNlbGVjdGVkS2V5LFxuXG4gICAgY3VycmVudEtleSxcbiAgICBjcmVhdGVLZXksXG4gICAgdXBkYXRlS2V5LFxuICAgIHVwZGF0ZUFsbEtleSxcbiAgICBkZWxldGVLZXksXG4gICAgbG9hZEJ5SWRLZXksXG4gICAgc2V0Q3VycmVudEtleSxcbiAgfSA9IGdldERhdGFTZXJ2aWNlS2V5cyhvcHRpb25zKTtcblxuICBjb25zdCB7IGNhbGxTdGF0ZUtleSB9ID0gZ2V0Q2FsbFN0YXRlS2V5cyh7IGNvbGxlY3Rpb246IHByZWZpeCB9KTtcblxuICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxuICAgIHdpdGhTdGF0ZSgoKSA9PiAoe1xuICAgICAgW2ZpbHRlcktleV06IGZpbHRlcixcbiAgICAgIFtzZWxlY3RlZElkc0tleV06IHt9IGFzIFJlY29yZDxFbnRpdHlJZCwgYm9vbGVhbj4sXG4gICAgICBbY3VycmVudEtleV06IHVuZGVmaW5lZCBhcyBFIHwgdW5kZWZpbmVkLFxuICAgIH0pKSxcbiAgICB3aXRoQ29tcHV0ZWQoKHN0b3JlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgY29uc3QgZW50aXRpZXMgPSBzdG9yZVtlbnRpdGllc0tleV0gYXMgU2lnbmFsPEVbXT47XG4gICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHN0b3JlW3NlbGVjdGVkSWRzS2V5XSBhcyBTaWduYWw8XG4gICAgICAgIFJlY29yZDxFbnRpdHlJZCwgYm9vbGVhbj5cbiAgICAgID47XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtzZWxlY3RlZEVudGl0aWVzS2V5XTogY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgICBlbnRpdGllcygpLmZpbHRlcigoZSkgPT4gc2VsZWN0ZWRJZHMoKVtlLmlkXSlcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSksXG4gICAgd2l0aE1ldGhvZHMoXG4gICAgICAoc3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgV3JpdGFibGVTdGF0ZVNvdXJjZTxvYmplY3Q+KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFTZXJ2aWNlID0gaW5qZWN0KGRhdGFTZXJ2aWNlVHlwZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW3VwZGF0ZUZpbHRlcktleV06IChmaWx0ZXI6IEYpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2ZpbHRlcktleV06IGZpbHRlciB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFt1cGRhdGVTZWxlY3RlZEtleV06IChpZDogRW50aXR5SWQsIHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiAoe1xuICAgICAgICAgICAgICBbc2VsZWN0ZWRJZHNLZXldOiB7XG4gICAgICAgICAgICAgICAgLi4uKHN0YXRlW3NlbGVjdGVkSWRzS2V5XSBhcyBSZWNvcmQ8RW50aXR5SWQsIGJvb2xlYW4+KSxcbiAgICAgICAgICAgICAgICBbaWRdOiBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtsb2FkS2V5XTogYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gc3RvcmVbZmlsdGVyS2V5XSBhcyBTaWduYWw8Rj47XG4gICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRhdGFTZXJ2aWNlLmxvYWQoZmlsdGVyKCkpO1xuICAgICAgICAgICAgICBwYXRjaFN0YXRlKFxuICAgICAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgICAgIHByZWZpeFxuICAgICAgICAgICAgICAgICAgPyBzZXRBbGxFbnRpdGllcyhyZXN1bHQsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pXG4gICAgICAgICAgICAgICAgICA6IHNldEFsbEVudGl0aWVzKHJlc3VsdClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbbG9hZEJ5SWRLZXldOiBhc3luYyAoaWQ6IEVudGl0eUlkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBkYXRhU2VydmljZS5sb2FkQnlJZChpZCk7XG4gICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xuICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogY3VycmVudCB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFtzZXRDdXJyZW50S2V5XTogKGN1cnJlbnQ6IEUpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBjdXJyZW50IH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2NyZWF0ZUtleV06IGFzeW5jIChlbnRpdHk6IEUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiBlbnRpdHkgfSk7XG4gICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRpbmcocHJlZml4KSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBkYXRhU2VydmljZS5jcmVhdGUoZW50aXR5KTtcbiAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGNyZWF0ZWQgfSk7XG4gICAgICAgICAgICAgIHBhdGNoU3RhdGUoXG4gICAgICAgICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICAgICAgICA/IGFkZEVudGl0eShjcmVhdGVkLCB7IGNvbGxlY3Rpb246IHByZWZpeCB9KVxuICAgICAgICAgICAgICAgICAgOiBhZGRFbnRpdHkoY3JlYXRlZClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbdXBkYXRlS2V5XTogYXN5bmMgKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGVudGl0eSB9KTtcbiAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IGRhdGFTZXJ2aWNlLnVwZGF0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCB7IFtjdXJyZW50S2V5XTogdXBkYXRlZCB9KTtcblxuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVBcmcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHVwZGF0ZWQuaWQsXG4gICAgICAgICAgICAgICAgY2hhbmdlczogdXBkYXRlZCxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVyID0gKGNvbGxlY3Rpb246IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICB1cGRhdGVFbnRpdHkodXBkYXRlQXJnLCB7IGNvbGxlY3Rpb24gfSk7XG5cbiAgICAgICAgICAgICAgcGF0Y2hTdGF0ZShcbiAgICAgICAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICAgICAgICBwcmVmaXggPyB1cGRhdGVyKHByZWZpeCkgOiB1cGRhdGVFbnRpdHkodXBkYXRlQXJnKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldExvYWRlZChwcmVmaXgpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRFcnJvcihlLCBwcmVmaXgpKTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFt1cGRhdGVBbGxLZXldOiBhc3luYyAoZW50aXRpZXM6IEVbXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkaW5nKHByZWZpeCkpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYXRhU2VydmljZS51cGRhdGVBbGwoZW50aXRpZXMpO1xuICAgICAgICAgICAgICBwYXRjaFN0YXRlKFxuICAgICAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgICAgIHByZWZpeFxuICAgICAgICAgICAgICAgICAgPyBzZXRBbGxFbnRpdGllcyhyZXN1bHQsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pXG4gICAgICAgICAgICAgICAgICA6IHNldEFsbEVudGl0aWVzKHJlc3VsdClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgc3RvcmVbY2FsbFN0YXRlS2V5XSAmJiBwYXRjaFN0YXRlKHN0b3JlLCBzZXRMb2FkZWQocHJlZml4KSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0RXJyb3IoZSwgcHJlZml4KSk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbZGVsZXRlS2V5XTogYXN5bmMgKGVudGl0eTogRSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgeyBbY3VycmVudEtleV06IGVudGl0eSB9KTtcbiAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGluZyhwcmVmaXgpKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgZGF0YVNlcnZpY2UuZGVsZXRlKGVudGl0eSk7XG4gICAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgW2N1cnJlbnRLZXldOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIHBhdGNoU3RhdGUoXG4gICAgICAgICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICAgICAgICA/IHJlbW92ZUVudGl0eShlbnRpdHkuaWQsIHsgY29sbGVjdGlvbjogcHJlZml4IH0pXG4gICAgICAgICAgICAgICAgICA6IHJlbW92ZUVudGl0eShlbnRpdHkuaWQpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHN0b3JlW2NhbGxTdGF0ZUtleV0gJiYgcGF0Y2hTdGF0ZShzdG9yZSwgc2V0TG9hZGVkKHByZWZpeCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBzdG9yZVtjYWxsU3RhdGVLZXldICYmIHBhdGNoU3RhdGUoc3RvcmUsIHNldEVycm9yKGUsIHByZWZpeCkpO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKVxuICApO1xufVxuIl19
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { patchState as originalPatchState, } from '@ngrx/signals';
|
|
2
|
-
import { effect, inject, PLATFORM_ID, signal } from '@angular/core';
|
|
3
|
-
import { isPlatformServer } from '@angular/common';
|
|
4
|
-
const storeRegistry = signal({});
|
|
5
|
-
let currentActionNames = new Set();
|
|
6
|
-
let synchronizationInitialized = false;
|
|
7
|
-
function initSynchronization() {
|
|
8
|
-
effect(() => {
|
|
9
|
-
if (!connection) {
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
const stores = storeRegistry();
|
|
13
|
-
const rootState = {};
|
|
14
|
-
for (const name in stores) {
|
|
15
|
-
const store = stores[name];
|
|
16
|
-
rootState[name] = store();
|
|
17
|
-
}
|
|
18
|
-
const names = Array.from(currentActionNames);
|
|
19
|
-
const type = names.length ? names.join(', ') : 'Store Update';
|
|
20
|
-
currentActionNames = new Set();
|
|
21
|
-
connection.send({ type }, rootState);
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
function getValueFromSymbol(obj, symbol) {
|
|
25
|
-
if (typeof obj === 'object' && obj && symbol in obj) {
|
|
26
|
-
return obj[symbol];
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
function getStoreSignal(store) {
|
|
30
|
-
const [signalStateKey] = Object.getOwnPropertySymbols(store);
|
|
31
|
-
if (!signalStateKey) {
|
|
32
|
-
throw new Error('Cannot find State Signal');
|
|
33
|
-
}
|
|
34
|
-
return getValueFromSymbol(store, signalStateKey);
|
|
35
|
-
}
|
|
36
|
-
let connection;
|
|
37
|
-
/**
|
|
38
|
-
* required for testing. is not exported during build
|
|
39
|
-
*/
|
|
40
|
-
export function reset() {
|
|
41
|
-
connection = undefined;
|
|
42
|
-
synchronizationInitialized = false;
|
|
43
|
-
storeRegistry.set({});
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* @param name store's name as it should appear in the DevTools
|
|
47
|
-
*/
|
|
48
|
-
export function withDevtools(name) {
|
|
49
|
-
return (store) => {
|
|
50
|
-
const isServer = isPlatformServer(inject(PLATFORM_ID));
|
|
51
|
-
if (isServer) {
|
|
52
|
-
return store;
|
|
53
|
-
}
|
|
54
|
-
const extensions = window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
55
|
-
if (!extensions) {
|
|
56
|
-
return store;
|
|
57
|
-
}
|
|
58
|
-
if (!connection) {
|
|
59
|
-
connection = extensions.connect({
|
|
60
|
-
name: 'NgRx Signal Store',
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
const storeSignal = getStoreSignal(store);
|
|
64
|
-
storeRegistry.update((value) => ({
|
|
65
|
-
...value,
|
|
66
|
-
[name]: storeSignal,
|
|
67
|
-
}));
|
|
68
|
-
if (!synchronizationInitialized) {
|
|
69
|
-
initSynchronization();
|
|
70
|
-
synchronizationInitialized = true;
|
|
71
|
-
}
|
|
72
|
-
return store;
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* @deprecated Has been renamed to `updateState`
|
|
77
|
-
*/
|
|
78
|
-
export const patchState = (state, action, ...rest) => {
|
|
79
|
-
updateState(state, action, ...rest);
|
|
80
|
-
};
|
|
81
|
-
/**
|
|
82
|
-
* Wrapper of `patchState` for DevTools integration. Next to updating the state,
|
|
83
|
-
* it also sends the action to the DevTools.
|
|
84
|
-
* @param stateSource state of Signal Store
|
|
85
|
-
* @param action name of action how it will show in DevTools
|
|
86
|
-
* @param updaters updater functions or objects
|
|
87
|
-
*/
|
|
88
|
-
export function updateState(stateSource, action, ...updaters) {
|
|
89
|
-
currentActionNames.add(action);
|
|
90
|
-
return originalPatchState(stateSource, ...updaters);
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kZXZ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1kZXZ0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsVUFBVSxJQUFJLGtCQUFrQixHQUdqQyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBaUJuRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQWtDLEVBQUUsQ0FBQyxDQUFDO0FBRWxFLElBQUksa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUUzQyxJQUFJLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUV2QyxTQUFTLG1CQUFtQjtJQUMxQixNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFDL0IsTUFBTSxTQUFTLEdBQTRCLEVBQUUsQ0FBQztRQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDOUQsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUV2QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsTUFBYztJQUN0RCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BELE9BQVEsR0FBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEtBQWM7SUFDcEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxPQUFPLGtCQUFrQixDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBS0QsSUFBSSxVQUF1QyxDQUFDO0FBRTVDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLEtBQUs7SUFDbkIsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUN2QiwwQkFBMEIsR0FBRyxLQUFLLENBQUM7SUFDbkMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixJQUFZO0lBRVosT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2YsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUM5QixJQUFJLEVBQUUsbUJBQW1CO2FBQzFCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvQixHQUFHLEtBQUs7WUFDUixDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVc7U0FDcEIsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNoQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDO0FBU0Q7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUU7SUFDNUQsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixXQUF1QyxFQUN2QyxNQUFjLEVBQ2QsR0FBRyxRQUVGO0lBRUQsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLE9BQU8sa0JBQWtCLENBQUMsV0FBVyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVtcHR5RmVhdHVyZVJlc3VsdCxcbiAgUGFydGlhbFN0YXRlVXBkYXRlcixcbiAgcGF0Y2hTdGF0ZSBhcyBvcmlnaW5hbFBhdGNoU3RhdGUsXG4gIFNpZ25hbFN0b3JlRmVhdHVyZSxcbiAgV3JpdGFibGVTdGF0ZVNvdXJjZSxcbn0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5pbXBvcnQgeyBlZmZlY3QsIGluamVjdCwgUExBVEZPUk1fSUQsIHNpZ25hbCwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSAnLi9zaGFyZWQvcHJldHRpZnknO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX186XG4gICAgICB8IHtcbiAgICAgICAgICBjb25uZWN0OiAob3B0aW9uczogeyBuYW1lOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgICAgc2VuZDogKGFjdGlvbjogQWN0aW9uLCBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9uID0geyB0eXBlOiBzdHJpbmcgfTtcblxuY29uc3Qgc3RvcmVSZWdpc3RyeSA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+Pih7fSk7XG5cbmxldCBjdXJyZW50QWN0aW9uTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxubGV0IHN5bmNocm9uaXphdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGluaXRTeW5jaHJvbml6YXRpb24oKSB7XG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVzID0gc3RvcmVSZWdpc3RyeSgpO1xuICAgIGNvbnN0IHJvb3RTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gc3RvcmVzKSB7XG4gICAgICBjb25zdCBzdG9yZSA9IHN0b3Jlc1tuYW1lXTtcbiAgICAgIHJvb3RTdGF0ZVtuYW1lXSA9IHN0b3JlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKGN1cnJlbnRBY3Rpb25OYW1lcyk7XG4gICAgY29uc3QgdHlwZSA9IG5hbWVzLmxlbmd0aCA/IG5hbWVzLmpvaW4oJywgJykgOiAnU3RvcmUgVXBkYXRlJztcbiAgICBjdXJyZW50QWN0aW9uTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbm5lY3Rpb24uc2VuZCh7IHR5cGUgfSwgcm9vdFN0YXRlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlRnJvbVN5bWJvbChvYmo6IHVua25vd24sIHN5bWJvbDogc3ltYm9sKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogJiYgc3ltYm9sIGluIG9iaikge1xuICAgIHJldHVybiAob2JqIGFzIHsgW2tleTogc3ltYm9sXTogYW55IH0pW3N5bWJvbF07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RvcmVTaWduYWwoc3RvcmU6IHVua25vd24pOiBTaWduYWw8dW5rbm93bj4ge1xuICBjb25zdCBbc2lnbmFsU3RhdGVLZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzdG9yZSk7XG4gIGlmICghc2lnbmFsU3RhdGVLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIFN0YXRlIFNpZ25hbCcpO1xuICB9XG5cbiAgcmV0dXJuIGdldFZhbHVlRnJvbVN5bWJvbChzdG9yZSwgc2lnbmFsU3RhdGVLZXkpO1xufVxuXG50eXBlIENvbm5lY3RSZXNwb25zZSA9IHtcbiAgc2VuZDogKGFjdGlvbjogQWN0aW9uLCBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59O1xubGV0IGNvbm5lY3Rpb246IENvbm5lY3RSZXNwb25zZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiByZXF1aXJlZCBmb3IgdGVzdGluZy4gaXMgbm90IGV4cG9ydGVkIGR1cmluZyBidWlsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXQoKSB7XG4gIGNvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gIHN5bmNocm9uaXphdGlvbkluaXRpYWxpemVkID0gZmFsc2U7XG4gIHN0b3JlUmVnaXN0cnkuc2V0KHt9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gbmFtZSBzdG9yZSdzIG5hbWUgYXMgaXQgc2hvdWxkIGFwcGVhciBpbiB0aGUgRGV2VG9vbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZXZ0b29sczxJbnB1dCBleHRlbmRzIEVtcHR5RmVhdHVyZVJlc3VsdD4oXG4gIG5hbWU6IHN0cmluZ1xuKTogU2lnbmFsU3RvcmVGZWF0dXJlPElucHV0LCBFbXB0eUZlYXR1cmVSZXN1bHQ+IHtcbiAgcmV0dXJuIChzdG9yZSkgPT4ge1xuICAgIGNvbnN0IGlzU2VydmVyID0gaXNQbGF0Zm9ybVNlcnZlcihpbmplY3QoUExBVEZPUk1fSUQpKTtcbiAgICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlbnNpb25zID0gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX187XG4gICAgaWYgKCFleHRlbnNpb25zKSB7XG4gICAgICByZXR1cm4gc3RvcmU7XG4gICAgfVxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICBjb25uZWN0aW9uID0gZXh0ZW5zaW9ucy5jb25uZWN0KHtcbiAgICAgICAgbmFtZTogJ05nUnggU2lnbmFsIFN0b3JlJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlU2lnbmFsID0gZ2V0U3RvcmVTaWduYWwoc3RvcmUpO1xuICAgIHN0b3JlUmVnaXN0cnkudXBkYXRlKCh2YWx1ZSkgPT4gKHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgW25hbWVdOiBzdG9yZVNpZ25hbCxcbiAgICB9KSk7XG5cbiAgICBpZiAoIXN5bmNocm9uaXphdGlvbkluaXRpYWxpemVkKSB7XG4gICAgICBpbml0U3luY2hyb25pemF0aW9uKCk7XG4gICAgICBzeW5jaHJvbml6YXRpb25Jbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xufVxuXG50eXBlIFBhdGNoRm4gPSB0eXBlb2Ygb3JpZ2luYWxQYXRjaFN0YXRlIGV4dGVuZHMgKFxuICBhcmcxOiBpbmZlciBGaXJzdCxcbiAgLi4uYXJnczogaW5mZXIgUmVzdFxuKSA9PiBpbmZlciBSZXR1cm5lclxuICA/IChzdGF0ZTogRmlyc3QsIGFjdGlvbjogc3RyaW5nLCAuLi5yZXN0OiBSZXN0KSA9PiBSZXR1cm5lclxuICA6IG5ldmVyO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIEhhcyBiZWVuIHJlbmFtZWQgdG8gYHVwZGF0ZVN0YXRlYFxuICovXG5leHBvcnQgY29uc3QgcGF0Y2hTdGF0ZTogUGF0Y2hGbiA9IChzdGF0ZSwgYWN0aW9uLCAuLi5yZXN0KSA9PiB7XG4gIHVwZGF0ZVN0YXRlKHN0YXRlLCBhY3Rpb24sIC4uLnJlc3QpO1xufTtcblxuLyoqXG4gKiBXcmFwcGVyIG9mIGBwYXRjaFN0YXRlYCBmb3IgRGV2VG9vbHMgaW50ZWdyYXRpb24uIE5leHQgdG8gdXBkYXRpbmcgdGhlIHN0YXRlLFxuICogaXQgYWxzbyBzZW5kcyB0aGUgYWN0aW9uIHRvIHRoZSBEZXZUb29scy5cbiAqIEBwYXJhbSBzdGF0ZVNvdXJjZSBzdGF0ZSBvZiBTaWduYWwgU3RvcmVcbiAqIEBwYXJhbSBhY3Rpb24gbmFtZSBvZiBhY3Rpb24gaG93IGl0IHdpbGwgc2hvdyBpbiBEZXZUb29sc1xuICogQHBhcmFtIHVwZGF0ZXJzIHVwZGF0ZXIgZnVuY3Rpb25zIG9yIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlPFN0YXRlIGV4dGVuZHMgb2JqZWN0PihcbiAgc3RhdGVTb3VyY2U6IFdyaXRhYmxlU3RhdGVTb3VyY2U8U3RhdGU+LFxuICBhY3Rpb246IHN0cmluZyxcbiAgLi4udXBkYXRlcnM6IEFycmF5PFxuICAgIFBhcnRpYWw8UHJldHRpZnk8U3RhdGU+PiB8IFBhcnRpYWxTdGF0ZVVwZGF0ZXI8UHJldHRpZnk8U3RhdGU+PlxuICA+XG4pOiB2b2lkIHtcbiAgY3VycmVudEFjdGlvbk5hbWVzLmFkZChhY3Rpb24pO1xuICByZXR1cm4gb3JpZ2luYWxQYXRjaFN0YXRlKHN0YXRlU291cmNlLCAuLi51cGRhdGVycyk7XG59XG4iXX0=
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
/** With pagination comes in two flavors the first one is local pagination or in memory pagination. For example we have 2000 items which we want
|
|
2
|
-
* to display in a table and the response payload is small enough to be stored in the memory. But we can not display all 2000 items at once
|
|
3
|
-
* so we need to paginate the data. The second flavor is server side pagination where the response payload is too large to be stored in the memory
|
|
4
|
-
* and we need to fetch the data from the server in chunks. In the second case we 'could' also cache the data in the memory but that could lead to
|
|
5
|
-
* other problems like memory leaks and stale data. So we will not cache the data in the memory in the second case.
|
|
6
|
-
* This feature implements the local pagination.
|
|
7
|
-
*/
|
|
8
|
-
import { computed } from '@angular/core';
|
|
9
|
-
import { patchState, signalStoreFeature, withComputed, withMethods, withState, } from '@ngrx/signals';
|
|
10
|
-
import { capitalize } from './with-data-service';
|
|
11
|
-
export function withPagination(options) {
|
|
12
|
-
const { pageKey, pageSizeKey, entitiesKey, selectedPageEntitiesKey, totalCountKey, pageCountKey, pageNavigationArrayMaxKey, pageNavigationArrayKey, setPageSizeKey, nextPageKey, previousPageKey, lastPageKey, firstPageKey, gotoPageKey, hasNextPageKey, hasPreviousPageKey, } = createPaginationKeys(options);
|
|
13
|
-
return signalStoreFeature(withState({
|
|
14
|
-
[pageKey]: 0,
|
|
15
|
-
[pageSizeKey]: 10,
|
|
16
|
-
[pageNavigationArrayMaxKey]: 7,
|
|
17
|
-
}), withComputed((store) => {
|
|
18
|
-
const entities = store[entitiesKey];
|
|
19
|
-
const page = store[pageKey];
|
|
20
|
-
const pageSize = store[pageSizeKey];
|
|
21
|
-
const pageNavigationArrayMax = store[pageNavigationArrayMaxKey];
|
|
22
|
-
return {
|
|
23
|
-
// The derived enitites which are displayed on the current page
|
|
24
|
-
[selectedPageEntitiesKey]: computed(() => {
|
|
25
|
-
const pageSizeValue = pageSize();
|
|
26
|
-
const pageValue = page();
|
|
27
|
-
return entities().slice(pageValue * pageSizeValue, (pageValue + 1) * pageSizeValue);
|
|
28
|
-
}),
|
|
29
|
-
[totalCountKey]: computed(() => entities().length),
|
|
30
|
-
[pageCountKey]: computed(() => {
|
|
31
|
-
const totalCountValue = entities().length;
|
|
32
|
-
const pageSizeValue = pageSize();
|
|
33
|
-
if (totalCountValue === 0) {
|
|
34
|
-
return 0;
|
|
35
|
-
}
|
|
36
|
-
return Math.ceil(totalCountValue / pageSizeValue);
|
|
37
|
-
}),
|
|
38
|
-
[pageNavigationArrayKey]: computed(() => createPageArray(page(), pageSize(), entities().length, pageNavigationArrayMax())),
|
|
39
|
-
[hasNextPageKey]: computed(() => {
|
|
40
|
-
return page() < pageSize();
|
|
41
|
-
}),
|
|
42
|
-
[hasPreviousPageKey]: computed(() => {
|
|
43
|
-
return page() > 1;
|
|
44
|
-
}),
|
|
45
|
-
};
|
|
46
|
-
}), withMethods((store) => {
|
|
47
|
-
return {
|
|
48
|
-
[setPageSizeKey]: (size) => {
|
|
49
|
-
patchState(store, setPageSize(size, options));
|
|
50
|
-
},
|
|
51
|
-
[nextPageKey]: () => {
|
|
52
|
-
patchState(store, nextPage(options));
|
|
53
|
-
},
|
|
54
|
-
[previousPageKey]: () => {
|
|
55
|
-
patchState(store, previousPage(options));
|
|
56
|
-
},
|
|
57
|
-
[lastPageKey]: () => {
|
|
58
|
-
const lastPage = store[pageCountKey]();
|
|
59
|
-
if (lastPage === 0)
|
|
60
|
-
return;
|
|
61
|
-
patchState(store, gotoPage(lastPage - 1, options));
|
|
62
|
-
},
|
|
63
|
-
[firstPageKey]: () => {
|
|
64
|
-
patchState(store, firstPage());
|
|
65
|
-
},
|
|
66
|
-
[gotoPageKey]: (page) => {
|
|
67
|
-
patchState(store, gotoPage(page, options));
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
}));
|
|
71
|
-
}
|
|
72
|
-
export function gotoPage(page, options) {
|
|
73
|
-
const { pageKey } = createPaginationKeys(options);
|
|
74
|
-
return {
|
|
75
|
-
[pageKey]: page,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
export function setPageSize(pageSize, options) {
|
|
79
|
-
const { pageSizeKey } = createPaginationKeys(options);
|
|
80
|
-
return {
|
|
81
|
-
[pageSizeKey]: pageSize,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
export function nextPage(options) {
|
|
85
|
-
const { pageKey } = createPaginationKeys(options);
|
|
86
|
-
return {
|
|
87
|
-
[pageKey]: (currentPage) => currentPage + 1,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
export function previousPage(options) {
|
|
91
|
-
const { pageKey } = createPaginationKeys(options);
|
|
92
|
-
return {
|
|
93
|
-
[pageKey]: (currentPage) => Math.max(currentPage - 1, 1),
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
export function firstPage(options) {
|
|
97
|
-
const { pageKey } = createPaginationKeys(options);
|
|
98
|
-
return {
|
|
99
|
-
[pageKey]: 1,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
export function setMaxPageNavigationArrayItems(maxPageNavigationArrayItems, options) {
|
|
103
|
-
const { pageNavigationArrayMaxKey } = createPaginationKeys(options);
|
|
104
|
-
return {
|
|
105
|
-
[pageNavigationArrayMaxKey]: maxPageNavigationArrayItems,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
function createPaginationKeys(options) {
|
|
109
|
-
const entitiesKey = options?.collection
|
|
110
|
-
? `${options.collection}Entities`
|
|
111
|
-
: 'entities';
|
|
112
|
-
const selectedPageEntitiesKey = options?.collection
|
|
113
|
-
? `selectedPage${capitalize(options?.collection)}Entities`
|
|
114
|
-
: 'selectedPageEntities';
|
|
115
|
-
const pageKey = options?.collection
|
|
116
|
-
? `${options.collection}CurrentPage`
|
|
117
|
-
: 'currentPage';
|
|
118
|
-
const pageSizeKey = options?.collection
|
|
119
|
-
? `${options.collection}PageSize`
|
|
120
|
-
: 'pageSize';
|
|
121
|
-
const totalCountKey = options?.collection
|
|
122
|
-
? `${options.collection}TotalCount`
|
|
123
|
-
: 'totalCount';
|
|
124
|
-
const pageCountKey = options?.collection
|
|
125
|
-
? `${options.collection}PageCount`
|
|
126
|
-
: 'pageCount';
|
|
127
|
-
const pageNavigationArrayMaxKey = options?.collection
|
|
128
|
-
? `${options.collection}PageNavigationArrayMax`
|
|
129
|
-
: 'pageNavigationArrayMax';
|
|
130
|
-
const pageNavigationArrayKey = options?.collection
|
|
131
|
-
? `${options.collection}PageNavigationArray`
|
|
132
|
-
: 'pageNavigationArray';
|
|
133
|
-
const setPageSizeKey = options?.collection
|
|
134
|
-
? `set${capitalize(options.collection)}PageSize`
|
|
135
|
-
: 'setPageSize';
|
|
136
|
-
const nextPageKey = options?.collection
|
|
137
|
-
? `next${capitalize(options.collection)}Page`
|
|
138
|
-
: 'nextPage';
|
|
139
|
-
const previousPageKey = options?.collection
|
|
140
|
-
? `previous${capitalize(options.collection)}Page`
|
|
141
|
-
: 'previousPage';
|
|
142
|
-
const lastPageKey = options?.collection
|
|
143
|
-
? `last${capitalize(options.collection)}Page`
|
|
144
|
-
: 'lastPage';
|
|
145
|
-
const firstPageKey = options?.collection
|
|
146
|
-
? `first${capitalize(options.collection)}Page`
|
|
147
|
-
: 'firstPage';
|
|
148
|
-
const gotoPageKey = options?.collection
|
|
149
|
-
? `goto${capitalize(options.collection)}Page`
|
|
150
|
-
: 'gotoPage';
|
|
151
|
-
const hasNextPageKey = options?.collection
|
|
152
|
-
? `hasNext${capitalize(options.collection)}Page`
|
|
153
|
-
: 'hasNextPage';
|
|
154
|
-
const hasPreviousPageKey = options?.collection
|
|
155
|
-
? `hasPrevious${capitalize(options.collection)}Page`
|
|
156
|
-
: 'hasPreviousPage';
|
|
157
|
-
return {
|
|
158
|
-
pageKey,
|
|
159
|
-
pageSizeKey,
|
|
160
|
-
entitiesKey,
|
|
161
|
-
selectedPageEntitiesKey,
|
|
162
|
-
totalCountKey,
|
|
163
|
-
pageCountKey,
|
|
164
|
-
pageNavigationArrayKey,
|
|
165
|
-
pageNavigationArrayMaxKey,
|
|
166
|
-
setPageSizeKey,
|
|
167
|
-
nextPageKey,
|
|
168
|
-
previousPageKey,
|
|
169
|
-
lastPageKey,
|
|
170
|
-
firstPageKey,
|
|
171
|
-
gotoPageKey,
|
|
172
|
-
hasNextPageKey,
|
|
173
|
-
hasPreviousPageKey,
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
export function createPageArray(currentPage, itemsPerPage, totalItems, paginationRange) {
|
|
177
|
-
// Convert paginationRange to number in case it's a string
|
|
178
|
-
paginationRange = +paginationRange;
|
|
179
|
-
// Calculate total number of pages
|
|
180
|
-
const totalPages = Math.max(Math.ceil(totalItems / itemsPerPage), 1);
|
|
181
|
-
const halfWay = Math.ceil(paginationRange / 2);
|
|
182
|
-
const isStart = currentPage <= halfWay;
|
|
183
|
-
const isEnd = totalPages - halfWay < currentPage;
|
|
184
|
-
const isMiddle = !isStart && !isEnd;
|
|
185
|
-
const ellipsesNeeded = paginationRange < totalPages;
|
|
186
|
-
const pages = [];
|
|
187
|
-
for (let i = 1; i <= totalPages && i <= paginationRange; i++) {
|
|
188
|
-
let pageNumber = i;
|
|
189
|
-
if (i === paginationRange) {
|
|
190
|
-
pageNumber = totalPages;
|
|
191
|
-
}
|
|
192
|
-
else if (ellipsesNeeded) {
|
|
193
|
-
if (isEnd) {
|
|
194
|
-
pageNumber = totalPages - paginationRange + i;
|
|
195
|
-
}
|
|
196
|
-
else if (isMiddle) {
|
|
197
|
-
pageNumber = currentPage - halfWay + i;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
const openingEllipsesNeeded = i === 2 && (isMiddle || isEnd);
|
|
201
|
-
const closingEllipsesNeeded = i === paginationRange - 1 && (isMiddle || isStart);
|
|
202
|
-
const label = ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)
|
|
203
|
-
? '...'
|
|
204
|
-
: pageNumber;
|
|
205
|
-
pages.push({ label, value: pageNumber });
|
|
206
|
-
}
|
|
207
|
-
return pages;
|
|
208
|
-
}
|
|
209
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1wYWdpbmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3J4LXRvb2xraXQvc3JjL2xpYi93aXRoLXBhZ2luYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBRUwsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osV0FBVyxFQUNYLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUEwSGpELE1BQU0sVUFBVSxjQUFjLENBQStCLE9BRzVEO0lBQ0MsTUFBTSxFQUNKLE9BQU8sRUFDUCxXQUFXLEVBQ1gsV0FBVyxFQUNYLHVCQUF1QixFQUN2QixhQUFhLEVBQ2IsWUFBWSxFQUNaLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsY0FBYyxFQUNkLFdBQVcsRUFDWCxlQUFlLEVBQ2YsV0FBVyxFQUNYLFlBQVksRUFDWixXQUFXLEVBQ1gsY0FBYyxFQUNkLGtCQUFrQixHQUNuQixHQUFHLG9CQUFvQixDQUFhLE9BQU8sQ0FBQyxDQUFDO0lBRTlDLE9BQU8sa0JBQWtCLENBQ3ZCLFNBQVMsQ0FBQztRQUNSLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNaLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRTtRQUNqQixDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQztLQUMvQixDQUFDLEVBQ0YsWUFBWSxDQUFDLENBQUMsS0FBOEIsRUFBRSxFQUFFO1FBQzlDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQWdCLENBQUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBbUIsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFtQixD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b21lcyBpbiB0d28gZmxhdm9ycyB0aGUgZmlyc3Qgb25lIGlzIGxvY2FsIHBhZ2luYXRpb24gb3IgaW4gbWVtb3J5IHBhZ2luYXRpb24uIEZvciBleGFtcGxlIHdlIGhhdmUgMjAwMCBpdGVtcyB3aGljaCB3ZSB3YW50XG4gKiB0byBkaXNwbGF5IGluIGEgdGFibGUgYW5kIHRoZSByZXNwb25zZSBwYXlsb2FkIGlzIHNtYWxsIGVub3VnaCB0byBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeS4gQnV0IHdlIGNhbiBub3QgZGlzcGxheSBhbGwgMjAwMCBpdGVtcyBhdCBvbmNlXG4gKiBzbyB3ZSBuZWVkIHRvIHBhZ2luYXRlIHRoZSBkYXRhLiBUaGUgc2Vjb25kIGZsYXZvciBpcyBzZXJ2ZXIgc2lkZSBwYWdpbmF0aW9uIHdoZXJlIHRoZSByZXNwb25zZSBwYXlsb2FkIGlzIHRvbyBsYXJnZSB0byBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeVxuICogYW5kIHdlIG5lZWQgdG8gZmV0Y2ggdGhlIGRhdGEgZnJvbSB0aGUgc2VydmVyIGluIGNodW5rcy4gSW4gdGhlIHNlY29uZCBjYXNlIHdlICdjb3VsZCcgYWxzbyBjYWNoZSB0aGUgZGF0YSBpbiB0aGUgbWVtb3J5IGJ1dCB0aGF0IGNvdWxkIGxlYWQgdG9cbiAqIG90aGVyIHByb2JsZW1zIGxpa2UgbWVtb3J5IGxlYWtzIGFuZCBzdGFsZSBkYXRhLiBTbyB3ZSB3aWxsIG5vdCBjYWNoZSB0aGUgZGF0YSBpbiB0aGUgbWVtb3J5IGluIHRoZSBzZWNvbmQgY2FzZS5cbiAqIFRoaXMgZmVhdHVyZSBpbXBsZW1lbnRzIHRoZSBsb2NhbCBwYWdpbmF0aW9uLlxuICovXG5cbmltcG9ydCB7IFNpZ25hbCwgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNpZ25hbFN0b3JlRmVhdHVyZSxcbiAgcGF0Y2hTdGF0ZSxcbiAgc2lnbmFsU3RvcmVGZWF0dXJlLFxuICB3aXRoQ29tcHV0ZWQsXG4gIHdpdGhNZXRob2RzLFxuICB3aXRoU3RhdGUsXG4gIFdyaXRhYmxlU3RhdGVTb3VyY2UsXG4gIEVtcHR5RmVhdHVyZVJlc3VsdCxcbn0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnLi93aXRoLWRhdGEtc2VydmljZSc7XG5pbXBvcnQge1xuICBFbnRpdHlDb21wdXRlZCxcbiAgRW50aXR5U3RhdGUsXG4gIE5hbWVkRW50aXR5Q29tcHV0ZWQsXG59IGZyb20gJy4vc2hhcmVkL3NpZ25hbC1zdG9yZS1tb2RlbHMnO1xuXG4vLyBUaGlzIGlzIGEgdmlydHVhbCBwYWdlIHdoaWNoIGlzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHBhZ2luYXRpb24gY29udHJvbFxuZXhwb3J0IHR5cGUgUGFnZSA9IHsgbGFiZWw6IHN0cmluZyB8IG51bWJlcjsgdmFsdWU6IG51bWJlciB9O1xuXG5leHBvcnQgdHlwZSBOYW1lZFBhZ2luYXRpb25TZXJ2aWNlU3RhdGU8RSwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYHNlbGVjdGVkUGFnZSR7Q2FwaXRhbGl6ZTxLPn1FbnRpdGllc2BdOiBBcnJheTxFPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7TG93ZXJjYXNlPEs+fUN1cnJlbnRQYWdlYF06IG51bWJlcjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7TG93ZXJjYXNlPEs+fVBhZ2VTaXplYF06IG51bWJlcjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7TG93ZXJjYXNlPEs+fVRvdGFsQ291bnRgXTogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59UGFnZUNvdW50YF06IG51bWJlcjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7TG93ZXJjYXNlPEs+fVBhZ2VOYXZpZ2F0aW9uQXJyYXlgXTogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59UGFnZU5hdmlnYXRpb25BcnJheU1heGBdOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBOYW1lZFBhZ2luYXRpb25TZXJ2aWNlU2lnbmFsczxFLCBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgc2VsZWN0ZWRQYWdlJHtDYXBpdGFsaXplPEs+fUVudGl0aWVzYF06IFNpZ25hbDxFW10+O1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59Q3VycmVudFBhZ2VgXTogU2lnbmFsPG51bWJlcj47XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0xvd2VyY2FzZTxLPn1QYWdlU2l6ZWBdOiBTaWduYWw8bnVtYmVyPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYCR7TG93ZXJjYXNlPEs+fVRvdGFsQ291bnRgXTogU2lnbmFsPG51bWJlcj47XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0xvd2VyY2FzZTxLPn1QYWdlQ291bnRgXTogU2lnbmFsPG51bWJlcj47XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGAke0xvd2VyY2FzZTxLPn1QYWdlTmF2aWdhdGlvbkFycmF5YF06IFNpZ25hbDxQYWdlW10+O1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgJHtMb3dlcmNhc2U8Sz59UGFnZU5hdmlnYXRpb25BcnJheU1heGBdOiBTaWduYWw8bnVtYmVyPjtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYGhhc05leHQke0NhcGl0YWxpemU8Sz59UGFnZWBdOiBTaWduYWw8Ym9vbGVhbj47XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBoYXNQcmV2aW91cyR7Q2FwaXRhbGl6ZTxLPn1QYWdlYF06IFNpZ25hbDxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIE5hbWVkUGFnaW5hdGlvblNlcnZpY2VNZXRob2RzPENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBzZXQke0NhcGl0YWxpemU8Sz59UGFnZVNpemVgXTogKHNpemU6IG51bWJlcikgPT4gdm9pZDtcbn0gJiB7XG4gIFtLIGluIENvbGxlY3Rpb24gYXMgYG5leHQke0NhcGl0YWxpemU8Sz59UGFnZWBdOiAoKSA9PiB2b2lkO1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgcHJldmlvdXMke0NhcGl0YWxpemU8Sz59UGFnZWBdOiAoKSA9PiB2b2lkO1xufSAmIHtcbiAgW0sgaW4gQ29sbGVjdGlvbiBhcyBgbGFzdCR7Q2FwaXRhbGl6ZTxLPn1QYWdlYF06ICgpID0+IHZvaWQ7XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBmaXJzdCR7Q2FwaXRhbGl6ZTxLPn1QYWdlYF06ICgpID0+IHZvaWQ7XG59ICYge1xuICBbSyBpbiBDb2xsZWN0aW9uIGFzIGBnb3RvJHtDYXBpdGFsaXplPEs+fVBhZ2VgXTogKHBhZ2U6IG51bWJlcikgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIFBhZ2luYXRpb25TZXJ2aWNlU3RhdGU8RT4gPSB7XG4gIHNlbGVjdGVkUGFnZUVudGl0aWVzOiBBcnJheTxFPjtcbiAgY3VycmVudFBhZ2U6IG51bWJlcjtcbiAgcGFnZVNpemU6IG51bWJlcjtcbiAgdG90YWxDb3VudDogbnVtYmVyO1xuICBwYWdlQ291bnQ6IG51bWJlcjtcbiAgcGFnZU5hdmlnYXRpb25BcnJheTogUGFnZVtdO1xuICBwYWdlTmF2aWdhdGlvbkFycmF5TWF4OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBQYWdpbmF0aW9uU2VydmljZVNpZ25hbHM8RT4gPSB7XG4gIHNlbGVjdGVkUGFnZUVudGl0aWVzOiBTaWduYWw8RVtdPjtcbiAgY3VycmVudFBhZ2U6IFNpZ25hbDxudW1iZXI+O1xuICBwYWdlU2l6ZTogU2lnbmFsPG51bWJlcj47XG4gIHRvdGFsQ291bnQ6IFNpZ25hbDxudW1iZXI+O1xuICBwYWdlQ291bnQ6IFNpZ25hbDxudW1iZXI+O1xuICBwYWdlTmF2aWdhdGlvbkFycmF5OiBTaWduYWw8UGFnZVtdPjtcbiAgcGFnZU5hdmlnYXRpb25BcnJheU1heDogU2lnbmFsPG51bWJlcj47XG4gIGhhc05leHRQYWdlOiBTaWduYWw8Ym9vbGVhbj47XG4gIGhhc1ByZXZpb3VzUGFnZTogU2lnbmFsPGJvb2xlYW4+O1xufTtcblxuZXhwb3J0IHR5cGUgUGFnaW5hdGlvblNlcnZpY2VNZXRob2RzID0ge1xuICBzZXRQYWdlU2l6ZTogKHNpemU6IG51bWJlcikgPT4gdm9pZDtcbiAgbmV4dFBhZ2VLZXk6ICgpID0+IHZvaWQ7XG4gIHByZXZpb3VzUGFnZTogKCkgPT4gdm9pZDtcbiAgbGFzdFBhZ2U6ICgpID0+IHZvaWQ7XG4gIGZpcnN0UGFnZTogKCkgPT4gdm9pZDtcbiAgZ290b1BhZ2U6IChwYWdlOiBudW1iZXIpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBTZXRQYWdpbmF0aW9uU3RhdGU8XG4gIEUsXG4gIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWRcbj4gPSBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nXG4gID8gTmFtZWRQYWdpbmF0aW9uU2VydmljZVN0YXRlPEUsIENvbGxlY3Rpb24+XG4gIDogUGFnaW5hdGlvblNlcnZpY2VTdGF0ZTxFPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhQYWdpbmF0aW9uPEUsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KG9wdGlvbnM6IHtcbiAgZW50aXR5OiBFO1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xufSk6IFNpZ25hbFN0b3JlRmVhdHVyZTxcbiAgRW1wdHlGZWF0dXJlUmVzdWx0ICYgeyBjb21wdXRlZDogTmFtZWRFbnRpdHlDb21wdXRlZDxFLCBDb2xsZWN0aW9uPiB9LFxuICB7XG4gICAgc3RhdGU6IE5hbWVkUGFnaW5hdGlvblNlcnZpY2VTdGF0ZTxFLCBDb2xsZWN0aW9uPjtcbiAgICBjb21wdXRlZDogTmFtZWRQYWdpbmF0aW9uU2VydmljZVNpZ25hbHM8RSwgQ29sbGVjdGlvbj47XG4gICAgbWV0aG9kczogTmFtZWRQYWdpbmF0aW9uU2VydmljZU1ldGhvZHM8Q29sbGVjdGlvbj47XG4gIH1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGFnaW5hdGlvbjxFPigpOiBTaWduYWxTdG9yZUZlYXR1cmU8XG4gIEVtcHR5RmVhdHVyZVJlc3VsdCAmIHtcbiAgICBzdGF0ZTogRW50aXR5U3RhdGU8RT47XG4gICAgY29tcHV0ZWQ6IEVudGl0eUNvbXB1dGVkPEU+O1xuICB9LFxuICB7XG4gICAgc3RhdGU6IFBhZ2luYXRpb25TZXJ2aWNlU3RhdGU8RT47XG4gICAgY29tcHV0ZWQ6IFBhZ2luYXRpb25TZXJ2aWNlU2lnbmFsczxFPjtcbiAgICBtZXRob2RzOiBQYWdpbmF0aW9uU2VydmljZU1ldGhvZHM7XG4gIH1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGFnaW5hdGlvbjxFLCBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zPzoge1xuICBlbnRpdHk6IEU7XG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb247XG59KTogU2lnbmFsU3RvcmVGZWF0dXJlPGFueSwgYW55PiB7XG4gIGNvbnN0IHtcbiAgICBwYWdlS2V5LFxuICAgIHBhZ2VTaXplS2V5LFxuICAgIGVudGl0aWVzS2V5LFxuICAgIHNlbGVjdGVkUGFnZUVudGl0aWVzS2V5LFxuICAgIHRvdGFsQ291bnRLZXksXG4gICAgcGFnZUNvdW50S2V5LFxuICAgIHBhZ2VOYXZpZ2F0aW9uQXJyYXlNYXhLZXksXG4gICAgcGFnZU5hdmlnYXRpb25BcnJheUtleSxcbiAgICBzZXRQYWdlU2l6ZUtleSxcbiAgICBuZXh0UGFnZUtleSxcbiAgICBwcmV2aW91c1BhZ2VLZXksXG4gICAgbGFzdFBhZ2VLZXksXG4gICAgZmlyc3RQYWdlS2V5LFxuICAgIGdvdG9QYWdlS2V5LFxuICAgIGhhc05leHRQYWdlS2V5LFxuICAgIGhhc1ByZXZpb3VzUGFnZUtleSxcbiAgfSA9IGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24+KG9wdGlvbnMpO1xuXG4gIHJldHVybiBzaWduYWxTdG9yZUZlYXR1cmUoXG4gICAgd2l0aFN0YXRlKHtcbiAgICAgIFtwYWdlS2V5XTogMCxcbiAgICAgIFtwYWdlU2l6ZUtleV06IDEwLFxuICAgICAgW3BhZ2VOYXZpZ2F0aW9uQXJyYXlNYXhLZXldOiA3LFxuICAgIH0pLFxuICAgIHdpdGhDb21wdXRlZCgoc3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICBjb25zdCBlbnRpdGllcyA9IHN0b3JlW2VudGl0aWVzS2V5XSBhcyBTaWduYWw8RVtdPjtcbiAgICAgIGNvbnN0IHBhZ2UgPSBzdG9yZVtwYWdlS2V5XSBhcyBTaWduYWw8bnVtYmVyPjtcbiAgICAgIGNvbnN0IHBhZ2VTaXplID0gc3RvcmVbcGFnZVNpemVLZXldIGFzIFNpZ25hbDxudW1iZXI+O1xuICAgICAgY29uc3QgcGFnZU5hdmlnYXRpb25BcnJheU1heCA9IHN0b3JlW1xuICAgICAgICBwYWdlTmF2aWdhdGlvbkFycmF5TWF4S2V5XG4gICAgICBdIGFzIFNpZ25hbDxudW1iZXI+O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAvLyBUaGUgZGVyaXZlZCBlbml0aXRlcyB3aGljaCBhcmUgZGlzcGxheWVkIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgICAgW3NlbGVjdGVkUGFnZUVudGl0aWVzS2V5XTogY29tcHV0ZWQ8RVtdPigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFnZVNpemVWYWx1ZSA9IHBhZ2VTaXplKCk7XG4gICAgICAgICAgY29uc3QgcGFnZVZhbHVlID0gcGFnZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIGVudGl0aWVzKCkuc2xpY2UoXG4gICAgICAgICAgICBwYWdlVmFsdWUgKiBwYWdlU2l6ZVZhbHVlLFxuICAgICAgICAgICAgKHBhZ2VWYWx1ZSArIDEpICogcGFnZVNpemVWYWx1ZVxuICAgICAgICAgICkgYXMgRVtdO1xuICAgICAgICB9KSxcbiAgICAgICAgW3RvdGFsQ291bnRLZXldOiBjb21wdXRlZCgoKSA9PiBlbnRpdGllcygpLmxlbmd0aCksXG4gICAgICAgIFtwYWdlQ291bnRLZXldOiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG90YWxDb3VudFZhbHVlID0gZW50aXRpZXMoKS5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgcGFnZVNpemVWYWx1ZSA9IHBhZ2VTaXplKCk7XG5cbiAgICAgICAgICBpZiAodG90YWxDb3VudFZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRvdGFsQ291bnRWYWx1ZSAvIHBhZ2VTaXplVmFsdWUpO1xuICAgICAgICB9KSxcbiAgICAgICAgW3BhZ2VOYXZpZ2F0aW9uQXJyYXlLZXldOiBjb21wdXRlZCgoKSA9PlxuICAgICAgICAgIGNyZWF0ZVBhZ2VBcnJheShcbiAgICAgICAgICAgIHBhZ2UoKSxcbiAgICAgICAgICAgIHBhZ2VTaXplKCksXG4gICAgICAgICAgICBlbnRpdGllcygpLmxlbmd0aCxcbiAgICAgICAgICAgIHBhZ2VOYXZpZ2F0aW9uQXJyYXlNYXgoKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcblxuICAgICAgICBbaGFzTmV4dFBhZ2VLZXldOiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHBhZ2UoKSA8IHBhZ2VTaXplKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICAgIFtoYXNQcmV2aW91c1BhZ2VLZXldOiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHBhZ2UoKSA+IDE7XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9KSxcbiAgICB3aXRoTWV0aG9kcyhcbiAgICAgIChzdG9yZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBXcml0YWJsZVN0YXRlU291cmNlPG9iamVjdD4pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbc2V0UGFnZVNpemVLZXldOiAoc2l6ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBzZXRQYWdlU2l6ZShzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbbmV4dFBhZ2VLZXldOiAoKSA9PiB7XG4gICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBuZXh0UGFnZShvcHRpb25zKSk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIFtwcmV2aW91c1BhZ2VLZXldOiAoKSA9PiB7XG4gICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBwcmV2aW91c1BhZ2Uob3B0aW9ucykpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBbbGFzdFBhZ2VLZXldOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFnZSA9IChzdG9yZVtwYWdlQ291bnRLZXldIGFzIFNpZ25hbDxudW1iZXI+KSgpO1xuICAgICAgICAgICAgaWYgKGxhc3RQYWdlID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCBnb3RvUGFnZShsYXN0UGFnZSAtIDEsIG9wdGlvbnMpKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgW2ZpcnN0UGFnZUtleV06ICgpID0+IHtcbiAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIGZpcnN0UGFnZSgpKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgW2dvdG9QYWdlS2V5XTogKHBhZ2U6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgZ290b1BhZ2UocGFnZSwgb3B0aW9ucykpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ290b1BhZ2U8RSwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4oXG4gIHBhZ2U6IG51bWJlcixcbiAgb3B0aW9ucz86IHtcbiAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xuICB9XG4pOiBQYXJ0aWFsPFNldFBhZ2luYXRpb25TdGF0ZTxFLCBDb2xsZWN0aW9uPj4ge1xuICBjb25zdCB7IHBhZ2VLZXkgfSA9IGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24+KG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgW3BhZ2VLZXldOiBwYWdlLFxuICB9IGFzIFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFBhZ2VTaXplPEUsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KFxuICBwYWdlU2l6ZTogbnVtYmVyLFxuICBvcHRpb25zPzoge1xuICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb247XG4gIH1cbik6IFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+PiB7XG4gIGNvbnN0IHsgcGFnZVNpemVLZXkgfSA9IGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24+KG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgW3BhZ2VTaXplS2V5XTogcGFnZVNpemUsXG4gIH0gYXMgUGFydGlhbDxTZXRQYWdpbmF0aW9uU3RhdGU8RSwgQ29sbGVjdGlvbj4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dFBhZ2U8RSwgQ29sbGVjdGlvbiBleHRlbmRzIHN0cmluZz4ob3B0aW9ucz86IHtcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjtcbn0pOiBQYXJ0aWFsPFNldFBhZ2luYXRpb25TdGF0ZTxFLCBDb2xsZWN0aW9uPj4ge1xuICBjb25zdCB7IHBhZ2VLZXkgfSA9IGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24+KG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgW3BhZ2VLZXldOiAoY3VycmVudFBhZ2U6IG51bWJlcikgPT4gY3VycmVudFBhZ2UgKyAxLFxuICB9IGFzIFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXZpb3VzUGFnZTxFLCBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zPzoge1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xufSk6IFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+PiB7XG4gIGNvbnN0IHsgcGFnZUtleSB9ID0gY3JlYXRlUGFnaW5hdGlvbktleXM8Q29sbGVjdGlvbj4ob3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbcGFnZUtleV06IChjdXJyZW50UGFnZTogbnVtYmVyKSA9PiBNYXRoLm1heChjdXJyZW50UGFnZSAtIDEsIDEpLFxuICB9IGFzIFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0UGFnZTxFLCBDb2xsZWN0aW9uIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zPzoge1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xufSk6IFBhcnRpYWw8U2V0UGFnaW5hdGlvblN0YXRlPEUsIENvbGxlY3Rpb24+PiB7XG4gIGNvbnN0IHsgcGFnZUtleSB9ID0gY3JlYXRlUGFnaW5hdGlvbktleXM8Q29sbGVjdGlvbj4ob3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbcGFnZUtleV06IDEsXG4gIH0gYXMgUGFydGlhbDxTZXRQYWdpbmF0aW9uU3RhdGU8RSwgQ29sbGVjdGlvbj4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWF4UGFnZU5hdmlnYXRpb25BcnJheUl0ZW1zPEUsIENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KFxuICBtYXhQYWdlTmF2aWdhdGlvbkFycmF5SXRlbXM6IG51bWJlcixcbiAgb3B0aW9ucz86IHtcbiAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xuICB9XG4pOiBQYXJ0aWFsPFNldFBhZ2luYXRpb25TdGF0ZTxFLCBDb2xsZWN0aW9uPj4ge1xuICBjb25zdCB7IHBhZ2VOYXZpZ2F0aW9uQXJyYXlNYXhLZXkgfSA9XG4gICAgY3JlYXRlUGFnaW5hdGlvbktleXM8Q29sbGVjdGlvbj4ob3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbcGFnZU5hdmlnYXRpb25BcnJheU1heEtleV06IG1heFBhZ2VOYXZpZ2F0aW9uQXJyYXlJdGVtcyxcbiAgfSBhcyBQYXJ0aWFsPFNldFBhZ2luYXRpb25TdGF0ZTxFLCBDb2xsZWN0aW9uPj47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhZ2luYXRpb25LZXlzPENvbGxlY3Rpb24gZXh0ZW5kcyBzdHJpbmc+KFxuICBvcHRpb25zOiB7IGNvbGxlY3Rpb246IENvbGxlY3Rpb24gfSB8IHVuZGVmaW5lZFxuKSB7XG4gIGNvbnN0IGVudGl0aWVzS2V5ID0gb3B0aW9ucz8uY29sbGVjdGlvblxuICAgID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUVudGl0aWVzYFxuICAgIDogJ2VudGl0aWVzJztcblxuICBjb25zdCBzZWxlY3RlZFBhZ2VFbnRpdGllc0tleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb25cbiAgICA/IGBzZWxlY3RlZFBhZ2Uke2NhcGl0YWxpemUob3B0aW9ucz8uY29sbGVjdGlvbil9RW50aXRpZXNgXG4gICAgOiAnc2VsZWN0ZWRQYWdlRW50aXRpZXMnO1xuICBjb25zdCBwYWdlS2V5ID0gb3B0aW9ucz8uY29sbGVjdGlvblxuICAgID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufUN1cnJlbnRQYWdlYFxuICAgIDogJ2N1cnJlbnRQYWdlJztcbiAgY29uc3QgcGFnZVNpemVLZXkgPSBvcHRpb25zPy5jb2xsZWN0aW9uXG4gICAgPyBgJHtvcHRpb25zLmNvbGxlY3Rpb259UGFnZVNpemVgXG4gICAgOiAncGFnZVNpemUnO1xuICBjb25zdCB0b3RhbENvdW50S2V5ID0gb3B0aW9ucz8uY29sbGVjdGlvblxuICAgID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufVRvdGFsQ291bnRgXG4gICAgOiAndG90YWxDb3VudCc7XG4gIGNvbnN0IHBhZ2VDb3VudEtleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb25cbiAgICA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1QYWdlQ291bnRgXG4gICAgOiAncGFnZUNvdW50JztcbiAgY29uc3QgcGFnZU5hdmlnYXRpb25BcnJheU1heEtleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb25cbiAgICA/IGAke29wdGlvbnMuY29sbGVjdGlvbn1QYWdlTmF2aWdhdGlvbkFycmF5TWF4YFxuICAgIDogJ3BhZ2VOYXZpZ2F0aW9uQXJyYXlNYXgnO1xuICBjb25zdCBwYWdlTmF2aWdhdGlvbkFycmF5S2V5ID0gb3B0aW9ucz8uY29sbGVjdGlvblxuICAgID8gYCR7b3B0aW9ucy5jb2xsZWN0aW9ufVBhZ2VOYXZpZ2F0aW9uQXJyYXlgXG4gICAgOiAncGFnZU5hdmlnYXRpb25BcnJheSc7XG5cbiAgY29uc3Qgc2V0UGFnZVNpemVLZXkgPSBvcHRpb25zPy5jb2xsZWN0aW9uXG4gICAgPyBgc2V0JHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9UGFnZVNpemVgXG4gICAgOiAnc2V0UGFnZVNpemUnO1xuXG4gIGNvbnN0IG5leHRQYWdlS2V5ID0gb3B0aW9ucz8uY29sbGVjdGlvblxuICAgID8gYG5leHQke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1QYWdlYFxuICAgIDogJ25leHRQYWdlJztcblxuICBjb25zdCBwcmV2aW91c1BhZ2VLZXkgPSBvcHRpb25zPy5jb2xsZWN0aW9uXG4gICAgPyBgcHJldmlvdXMke2NhcGl0YWxpemUob3B0aW9ucy5jb2xsZWN0aW9uKX1QYWdlYFxuICAgIDogJ3ByZXZpb3VzUGFnZSc7XG5cbiAgY29uc3QgbGFzdFBhZ2VLZXkgPSBvcHRpb25zPy5jb2xsZWN0aW9uXG4gICAgPyBgbGFzdCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfVBhZ2VgXG4gICAgOiAnbGFzdFBhZ2UnO1xuXG4gIGNvbnN0IGZpcnN0UGFnZUtleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb25cbiAgICA/IGBmaXJzdCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfVBhZ2VgXG4gICAgOiAnZmlyc3RQYWdlJztcblxuICBjb25zdCBnb3RvUGFnZUtleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb25cbiAgICA/IGBnb3RvJHtjYXBpdGFsaXplKG9wdGlvbnMuY29sbGVjdGlvbil9UGFnZWBcbiAgICA6ICdnb3RvUGFnZSc7XG5cbiAgY29uc3QgaGFzTmV4dFBhZ2VLZXkgPSBvcHRpb25zPy5jb2xsZWN0aW9uXG4gICAgPyBgaGFzTmV4dCR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfVBhZ2VgXG4gICAgOiAnaGFzTmV4dFBhZ2UnO1xuXG4gIGNvbnN0IGhhc1ByZXZpb3VzUGFnZUtleSA9IG9wdGlvbnM/LmNvbGxlY3Rpb25cbiAgICA/IGBoYXNQcmV2aW91cyR7Y2FwaXRhbGl6ZShvcHRpb25zLmNvbGxlY3Rpb24pfVBhZ2VgXG4gICAgOiAnaGFzUHJldmlvdXNQYWdlJztcblxuICByZXR1cm4ge1xuICAgIHBhZ2VLZXksXG4gICAgcGFnZVNpemVLZXksXG4gICAgZW50aXRpZXNLZXksXG4gICAgc2VsZWN0ZWRQYWdlRW50aXRpZXNLZXksXG4gICAgdG90YWxDb3VudEtleSxcbiAgICBwYWdlQ291bnRLZXksXG4gICAgcGFnZU5hdmlnYXRpb25BcnJheUtleSxcbiAgICBwYWdlTmF2aWdhdGlvbkFycmF5TWF4S2V5LFxuICAgIHNldFBhZ2VTaXplS2V5LFxuICAgIG5leHRQYWdlS2V5LFxuICAgIHByZXZpb3VzUGFnZUtleSxcbiAgICBsYXN0UGFnZUtleSxcbiAgICBmaXJzdFBhZ2VLZXksXG4gICAgZ290b1BhZ2VLZXksXG4gICAgaGFzTmV4dFBhZ2VLZXksXG4gICAgaGFzUHJldmlvdXNQYWdlS2V5LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFnZUFycmF5KFxuICBjdXJyZW50UGFnZTogbnVtYmVyLFxuICBpdGVtc1BlclBhZ2U6IG51bWJlcixcbiAgdG90YWxJdGVtczogbnVtYmVyLFxuICBwYWdpbmF0aW9uUmFuZ2U6IG51bWJlclxuKTogUGFnZVtdIHtcbiAgLy8gQ29udmVydCBwYWdpbmF0aW9uUmFuZ2UgdG8gbnVtYmVyIGluIGNhc2UgaXQncyBhIHN0cmluZ1xuICBwYWdpbmF0aW9uUmFuZ2UgPSArcGFnaW5hdGlvblJhbmdlO1xuXG4gIC8vIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgY29uc3QgdG90YWxQYWdlcyA9IE1hdGgubWF4KE1hdGguY2VpbCh0b3RhbEl0ZW1zIC8gaXRlbXNQZXJQYWdlKSwgMSk7XG4gIGNvbnN0IGhhbGZXYXkgPSBNYXRoLmNlaWwocGFnaW5hdGlvblJhbmdlIC8gMik7XG5cbiAgY29uc3QgaXNTdGFydCA9IGN1cnJlbnRQYWdlIDw9IGhhbGZXYXk7XG4gIGNvbnN0IGlzRW5kID0gdG90YWxQYWdlcyAtIGhhbGZXYXkgPCBjdXJyZW50UGFnZTtcbiAgY29uc3QgaXNNaWRkbGUgPSAhaXNTdGFydCAmJiAhaXNFbmQ7XG5cbiAgY29uc3QgZWxsaXBzZXNOZWVkZWQgPSBwYWdpbmF0aW9uUmFuZ2UgPCB0b3RhbFBhZ2VzO1xuICBjb25zdCBwYWdlczogUGFnZVtdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxQYWdlcyAmJiBpIDw9IHBhZ2luYXRpb25SYW5nZTsgaSsrKSB7XG4gICAgbGV0IHBhZ2VOdW1iZXIgPSBpO1xuXG4gICAgaWYgKGkgPT09IHBhZ2luYXRpb25SYW5nZSkge1xuICAgICAgcGFnZU51bWJlciA9IHRvdGFsUGFnZXM7XG4gICAgfSBlbHNlIGlmIChlbGxpcHNlc05lZWRlZCkge1xuICAgICAgaWYgKGlzRW5kKSB7XG4gICAgICAgIHBhZ2VOdW1iZXIgPSB0b3RhbFBhZ2VzIC0gcGFnaW5hdGlvblJhbmdlICsgaTtcbiAgICAgIH0gZWxzZSBpZiAoaXNNaWRkbGUpIHtcbiAgICAgICAgcGFnZU51bWJlciA9IGN1cnJlbnRQYWdlIC0gaGFsZldheSArIGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlbmluZ0VsbGlwc2VzTmVlZGVkID0gaSA9PT0gMiAmJiAoaXNNaWRkbGUgfHwgaXNFbmQpO1xuICAgIGNvbnN0IGNsb3NpbmdFbGxpcHNlc05lZWRlZCA9XG4gICAgICBpID09PSBwYWdpbmF0aW9uUmFuZ2UgLSAxICYmIChpc01pZGRsZSB8fCBpc1N0YXJ0KTtcblxuICAgIGNvbnN0IGxhYmVsID1cbiAgICAgIGVsbGlwc2VzTmVlZGVkICYmIChvcGVuaW5nRWxsaXBzZXNOZWVkZWQgfHwgY2xvc2luZ0VsbGlwc2VzTmVlZGVkKVxuICAgICAgICA/ICcuLi4nXG4gICAgICAgIDogcGFnZU51bWJlcjtcblxuICAgIHBhZ2VzLnB1c2goeyBsYWJlbCwgdmFsdWU6IHBhZ2VOdW1iZXIgfSk7XG4gIH1cblxuICByZXR1cm4gcGFnZXM7XG59XG4iXX0=
|