@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.
Files changed (53) hide show
  1. package/README.md +4 -12
  2. package/fesm2022/angular-architects-ngrx-toolkit-redux-connector.mjs +15 -15
  3. package/fesm2022/angular-architects-ngrx-toolkit-redux-connector.mjs.map +1 -1
  4. package/fesm2022/angular-architects-ngrx-toolkit.mjs +487 -78
  5. package/fesm2022/angular-architects-ngrx-toolkit.mjs.map +1 -1
  6. package/index.d.ts +9 -2
  7. package/lib/devtools/features/with-disabled-name-indicies.d.ts +27 -0
  8. package/lib/devtools/features/with-glitch-tracking.d.ts +30 -0
  9. package/lib/devtools/features/with-mapper.d.ts +28 -0
  10. package/lib/devtools/internal/current-action-names.d.ts +1 -0
  11. package/lib/devtools/internal/default-tracker.d.ts +13 -0
  12. package/lib/devtools/internal/devtools-feature.d.ts +24 -0
  13. package/lib/devtools/internal/devtools-syncer.service.d.ts +35 -0
  14. package/lib/devtools/internal/glitch-tracker.service.d.ts +18 -0
  15. package/lib/devtools/internal/models.d.ts +25 -0
  16. package/lib/devtools/rename-devtools-name.d.ts +7 -0
  17. package/lib/devtools/update-state.d.ts +17 -0
  18. package/lib/devtools/with-dev-tools-stub.d.ts +5 -0
  19. package/lib/devtools/with-devtools.d.ts +30 -0
  20. package/lib/shared/prettify.d.ts +1 -1
  21. package/lib/shared/throw-if-null.d.ts +1 -0
  22. package/lib/with-call-state.d.ts +2 -2
  23. package/lib/with-data-service.d.ts +3 -3
  24. package/lib/with-pagination.d.ts +4 -4
  25. package/lib/with-reset.d.ts +29 -0
  26. package/lib/with-storage-sync.d.ts +2 -2
  27. package/lib/with-undo-redo.d.ts +4 -3
  28. package/package.json +6 -7
  29. package/redux-connector/src/lib/create-redux.d.ts +4 -4
  30. package/redux-connector/src/lib/model.d.ts +5 -0
  31. package/redux-connector/src/lib/rxjs-interop/redux-method.d.ts +5 -2
  32. package/redux-connector/src/lib/signal-redux-store.d.ts +10 -2
  33. package/redux-connector/src/lib/util.d.ts +2 -2
  34. package/esm2022/angular-architects-ngrx-toolkit.mjs +0 -5
  35. package/esm2022/index.mjs +0 -8
  36. package/esm2022/lib/assertions/assertions.mjs +0 -6
  37. package/esm2022/lib/shared/prettify.mjs +0 -2
  38. package/esm2022/lib/shared/signal-store-models.mjs +0 -2
  39. package/esm2022/lib/with-call-state.mjs +0 -60
  40. package/esm2022/lib/with-data-service.mjs +0 -202
  41. package/esm2022/lib/with-devtools.mjs +0 -92
  42. package/esm2022/lib/with-pagination.mjs +0 -209
  43. package/esm2022/lib/with-redux.mjs +0 -100
  44. package/esm2022/lib/with-storage-sync.mjs +0 -56
  45. package/esm2022/lib/with-undo-redo.mjs +0 -113
  46. package/esm2022/redux-connector/angular-architects-ngrx-toolkit-redux-connector.mjs +0 -5
  47. package/esm2022/redux-connector/index.mjs +0 -3
  48. package/esm2022/redux-connector/src/lib/create-redux.mjs +0 -41
  49. package/esm2022/redux-connector/src/lib/model.mjs +0 -2
  50. package/esm2022/redux-connector/src/lib/rxjs-interop/redux-method.mjs +0 -22
  51. package/esm2022/redux-connector/src/lib/signal-redux-store.mjs +0 -43
  52. package/esm2022/redux-connector/src/lib/util.mjs +0 -13
  53. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kZXZ0b29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyeC10b29sa2l0L3NyYy9saWIvd2l0aC1kZXZ0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsVUFBVSxJQUFJLGtCQUFrQixHQUdqQyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBaUJuRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQWtDLEVBQUUsQ0FBQyxDQUFDO0FBRWxFLElBQUksa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUUzQyxJQUFJLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUV2QyxTQUFTLG1CQUFtQjtJQUMxQixNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFDL0IsTUFBTSxTQUFTLEdBQTRCLEVBQUUsQ0FBQztRQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FB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ZVJlc3VsdCxcbiAgUGFydGlhbFN0YXRlVXBkYXRlcixcbiAgcGF0Y2hTdGF0ZSBhcyBvcmlnaW5hbFBhdGNoU3RhdGUsXG4gIFNpZ25hbFN0b3JlRmVhdHVyZSxcbiAgV3JpdGFibGVTdGF0ZVNvdXJjZSxcbn0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5pbXBvcnQgeyBlZmZlY3QsIGluamVjdCwgUExBVEZPUk1fSUQsIHNpZ25hbCwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSAnLi9zaGFyZWQvcHJldHRpZnknO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX186XG4gICAgICB8IHtcbiAgICAgICAgICBjb25uZWN0OiAob3B0aW9uczogeyBuYW1lOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgICAgc2VuZDogKGFjdGlvbjogQWN0aW9uLCBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+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=