@kepler.gl/reducers 3.3.0-alpha.0 → 3.3.0-alpha.10

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 (84) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +2 -3
  8. package/dist/cjs/interaction-utils.js +115 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +658 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +660 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +27 -0
  16. package/dist/cjs/provider-state-updaters.js +465 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +922 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1193 -0
  22. package/dist/cjs/vis-state-selectors.js +30 -0
  23. package/dist/cjs/vis-state-updaters.js +5100 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/combined-updaters.d.ts +19 -2
  26. package/dist/composers.d.ts +2 -0
  27. package/dist/esm/combined-updaters.js +484 -0
  28. package/dist/esm/composer-helpers.js +85 -0
  29. package/dist/esm/composers.js +14 -0
  30. package/dist/esm/core.js +101 -0
  31. package/dist/esm/data-utils.js +47 -0
  32. package/dist/esm/export-utils.js +86 -0
  33. package/dist/esm/index.js +62 -0
  34. package/dist/esm/interaction-utils.js +106 -0
  35. package/dist/esm/layer-utils.js +602 -0
  36. package/dist/esm/map-state-updaters.js +650 -0
  37. package/dist/esm/map-state.js +29 -0
  38. package/dist/esm/map-style-updaters.js +652 -0
  39. package/dist/esm/map-style.js +27 -0
  40. package/dist/esm/merger-handler.js +96 -0
  41. package/dist/esm/middleware.js +19 -0
  42. package/dist/esm/provider-state-updaters.js +458 -0
  43. package/dist/esm/provider-state.js +28 -0
  44. package/dist/esm/root.js +201 -0
  45. package/dist/esm/ui-state-updaters.js +917 -0
  46. package/dist/esm/ui-state.js +30 -0
  47. package/dist/esm/vis-state-merger.js +1161 -0
  48. package/dist/esm/vis-state-selectors.js +24 -0
  49. package/dist/esm/vis-state-updaters.js +5006 -0
  50. package/dist/esm/vis-state.js +29 -0
  51. package/dist/interaction-utils.d.ts +1 -1
  52. package/dist/layer-utils.d.ts +30 -5
  53. package/dist/map-state-updaters.d.ts +27 -20
  54. package/dist/map-state.d.ts +2 -74
  55. package/dist/map-style-updaters.d.ts +1 -3
  56. package/dist/ui-state-updaters.d.ts +53 -3
  57. package/dist/vis-state-merger.d.ts +11 -0
  58. package/dist/vis-state-selectors.d.ts +42 -6
  59. package/dist/vis-state-updaters.d.ts +163 -2
  60. package/dist/vis-state.d.ts +24 -4
  61. package/package.json +43 -35
  62. package/dist/combined-updaters.js +0 -366
  63. package/dist/composer-helpers.js +0 -101
  64. package/dist/composers.js +0 -23
  65. package/dist/core.js +0 -105
  66. package/dist/data-utils.js +0 -53
  67. package/dist/export-utils.js +0 -91
  68. package/dist/interaction-utils.js +0 -105
  69. package/dist/layer-utils.js +0 -335
  70. package/dist/map-state-updaters.js +0 -436
  71. package/dist/map-state.js +0 -35
  72. package/dist/map-style-updaters.js +0 -661
  73. package/dist/map-style.js +0 -34
  74. package/dist/merger-handler.js +0 -105
  75. package/dist/middleware.js +0 -27
  76. package/dist/provider-state-updaters.js +0 -466
  77. package/dist/provider-state.js +0 -35
  78. package/dist/root.js +0 -207
  79. package/dist/ui-state-updaters.js +0 -803
  80. package/dist/ui-state.js +0 -37
  81. package/dist/vis-state-merger.js +0 -990
  82. package/dist/vis-state-selectors.js +0 -30
  83. package/dist/vis-state-updaters.js +0 -3611
  84. package/dist/vis-state.js +0 -36
package/dist/root.js DELETED
@@ -1,207 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports["default"] = void 0;
8
- exports.provideInitialState = provideInitialState;
9
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
- var _actions = require("@kepler.gl/actions");
13
- var _reduxActions = require("redux-actions");
14
- var _core = require("./core");
15
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
16
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
17
- // Copyright contributors to the kepler.gl project
18
- // Extend this type with additional actions to enforce strict typings
19
-
20
- // INITIAL_STATE
21
- var initialCoreState = {};
22
- function provideInitialState(initialState, extraReducers) {
23
- var coreReducer = (0, _core.coreReducerFactory)(initialState, extraReducers);
24
- var handleRegisterEntry = function handleRegisterEntry(state, _ref) {
25
- var _ref$payload = _ref.payload,
26
- id = _ref$payload.id,
27
- mint = _ref$payload.mint,
28
- mapboxApiAccessToken = _ref$payload.mapboxApiAccessToken,
29
- mapboxApiUrl = _ref$payload.mapboxApiUrl,
30
- mapStylesReplaceDefault = _ref$payload.mapStylesReplaceDefault,
31
- initialUiState = _ref$payload.initialUiState;
32
- // by default, always create a mint state even if the same id already exist
33
- // if state.id exist and mint=false, keep the existing state
34
- var previousState = state[id] && mint === false ? state[id] : undefined;
35
- return _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, id, coreReducer(previousState, (0, _actions.keplerGlInit)({
36
- mapboxApiAccessToken: mapboxApiAccessToken,
37
- mapboxApiUrl: mapboxApiUrl,
38
- mapStylesReplaceDefault: mapStylesReplaceDefault,
39
- initialUiState: initialUiState
40
- }))));
41
- };
42
- var handleDeleteEntry = function handleDeleteEntry(state, _ref2) {
43
- var id = _ref2.payload.id;
44
- return Object.keys(state).reduce(function (accu, curr) {
45
- return _objectSpread(_objectSpread({}, accu), curr === id ? {} : (0, _defineProperty2["default"])({}, curr, state[curr]));
46
- }, {});
47
- };
48
- var handleRenameEntry = function handleRenameEntry(state, _ref4) {
49
- var _ref4$payload = _ref4.payload,
50
- oldId = _ref4$payload.oldId,
51
- newId = _ref4$payload.newId;
52
- return Object.keys(state).reduce(function (accu, curr) {
53
- return _objectSpread(_objectSpread({}, accu), (0, _defineProperty2["default"])({}, curr === oldId ? newId : curr, state[curr]));
54
- }, {});
55
- };
56
- return function () {
57
- var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialCoreState;
58
- var action = arguments.length > 1 ? arguments[1] : undefined;
59
- // update child states
60
- Object.keys(state).forEach(function (id) {
61
- var updateItemState = coreReducer(state[id], (0, _actions._actionFor)(id, action));
62
- state = (0, _actions._updateProperty)(state, id, updateItemState);
63
- });
64
-
65
- // perform additional state reducing (e.g. switch action.type etc...)
66
- var handlers = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _actions.ActionTypes.REGISTER_ENTRY, handleRegisterEntry), _actions.ActionTypes.DELETE_ENTRY, handleDeleteEntry), _actions.ActionTypes.RENAME_ENTRY, handleRenameEntry);
67
- return (0, _reduxActions.handleActions)(handlers, initialCoreState)(state, action);
68
- };
69
- }
70
- var _keplerGlReducer = provideInitialState(initialCoreState);
71
- function mergeInitialState() {
72
- var saved = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
73
- var provided = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
74
- var extraInitialStateKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
75
- var keys = ['mapState', 'mapStyle', 'visState', 'uiState'].concat((0, _toConsumableArray2["default"])(extraInitialStateKeys));
76
-
77
- // shallow merge each reducer
78
- var newState = keys.reduce(function (accu, key) {
79
- return _objectSpread(_objectSpread({}, accu), saved[key] && provided[key] ? (0, _defineProperty2["default"])({}, key, _objectSpread(_objectSpread({}, saved[key]), provided[key])) : (0, _defineProperty2["default"])({}, key, saved[key] || provided[key] || {}));
80
- }, {});
81
- return newState;
82
- }
83
- function decorate(target) {
84
- var savedInitialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
85
- var targetInitialState = savedInitialState;
86
-
87
- /**
88
- * Returns a kepler.gl reducer that will also pass each action through additional reducers spiecified.
89
- * The parameter should be either a reducer map or a reducer function.
90
- * The state passed into the additional action handler is the instance state.
91
- * It will include all the subreducers `visState`, `uiState`, `mapState` and `mapStyle`.
92
- * `.plugin` is only meant to be called once when mounting the keplerGlReducer to the store.
93
- * **Note** This is an advanced option to give you more freedom to modify the internal state of the kepler.gl instance.
94
- * You should only use this to adding additional actions instead of replacing default actions.
95
- *
96
- * @mixin keplerGlReducer.plugin
97
- * @memberof keplerGlReducer
98
- * @param {Object|Function} customReducer - A reducer map or a reducer
99
- * @param {Object} options - options to be applied to custom reducer logic
100
- * @param {Object} options.override - objects that describe which action to override, e.g. {[ActionTypes.LAYER_TYPE_CHANGE]: true}
101
- * @public
102
- * @example
103
- * const myKeplerGlReducer = keplerGlReducer
104
- * .plugin({
105
- * // 1. as reducer map
106
- * HIDE_AND_SHOW_SIDE_PANEL: (state, action) => ({
107
- * ...state,
108
- * uiState: {
109
- * ...state.uiState,
110
- * readOnly: !state.uiState.readOnly
111
- * }
112
- * })
113
- * })
114
- * .plugin(handleActions({
115
- * // 2. as reducer
116
- * 'HIDE_MAP_CONTROLS': (state, action) => ({
117
- * ...state,
118
- * uiState: {
119
- * ...state.uiState,
120
- * mapControls: hiddenMapControl
121
- * }
122
- * })
123
- * }, {}));
124
- */
125
- target.plugin = function plugin(customReducer, options) {
126
- var _this = this;
127
- if ((0, _typeof2["default"])(customReducer) === 'object') {
128
- // if only provided a reducerMap, wrap it in a reducer
129
- customReducer = (0, _reduxActions.handleActions)(customReducer, {});
130
- }
131
-
132
- // use 'function' keyword to enable 'this'
133
- // TODO: temporarily making action type to any, will fix that by creating a shared action interface
134
- return decorate(function () {
135
- var _options$override;
136
- var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
137
- var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
138
- var nextState = state;
139
- if (action.type && !(options !== null && options !== void 0 && (_options$override = options.override) !== null && _options$override !== void 0 && _options$override[action.type])) {
140
- nextState = _this(state, action);
141
- }
142
-
143
- // for each entry in the staten
144
- Object.keys(nextState).forEach(function (id) {
145
- // update child states
146
- nextState = (0, _actions._updateProperty)(nextState, id, customReducer(nextState[id], (0, _actions._actionFor)(id, action)));
147
- });
148
- return nextState;
149
- });
150
- };
151
-
152
- /**
153
- * Return a reducer that initiated with custom initial state.
154
- * The parameter should be an object mapping from `subreducer` name to custom subreducer state,
155
- * which will be shallow **merged** with default initial state.
156
- *
157
- * Default subreducer state:
158
- * - [`visState`](./vis-state.md#INITIAL_VIS_STATE)
159
- * - [`mapState`](./map-state.md#INITIAL_MAP_STATE)
160
- * - [`mapStyle`](./map-style.md#INITIAL_MAP_STYLE)
161
- * - [`uiState`](./ui-state.md#INITIAL_UI_STATE)
162
- * @mixin keplerGlReducer.initialState
163
- * @memberof keplerGlReducer
164
- * @param {Object} iniSt - custom state to be merged with default initial state
165
- * @param {Object} extraReducers - optional custom reducers in addition to the default `visState`, `mapState`, `mapStyle`, and `uiState`
166
- * @public
167
- * @example
168
- * const myKeplerGlReducer = keplerGlReducer
169
- * .initialState({
170
- * uiState: {readOnly: true}
171
- * });
172
- */
173
- target.initialState = function initialState(iniSt) {
174
- var extraReducers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
175
- // passing through extraInitialStateKeys and extraReducers allows external customization by adding additional subreducers and state beyond the default `visState`, `mapState`, `mapStyle`, and `uiState`
176
- var extraInitialStateKeys = Object.keys(extraReducers);
177
- var merged = mergeInitialState(targetInitialState, iniSt, extraInitialStateKeys);
178
- var targetReducer = provideInitialState(merged, extraReducers);
179
- return decorate(targetReducer, merged);
180
- };
181
- return target;
182
- }
183
-
184
- /**
185
- * Kepler.gl reducer to be mounted to your store. You can mount `keplerGlReducer` at property `keplerGl`, if you choose
186
- * to mount it at another address e.g. `foo` you will need to specify it when you mount `KeplerGl` component in your app with `getState: state => state.foo`
187
- * @public
188
- * @example
189
- * import keplerGlReducer from '@kepler.gl/reducers';
190
- * import {createStore, combineReducers, applyMiddleware, compose} from 'redux';
191
- * import {taskMiddleware} from 'react-palm/tasks';
192
- *
193
- * const initialState = {};
194
- * const reducers = combineReducers({
195
- * // <-- mount kepler.gl reducer in your app
196
- * keplerGl: keplerGlReducer,
197
- *
198
- * // Your other reducers here
199
- * app: appReducer
200
- * });
201
- *
202
- * // using createStore
203
- * export default createStore(reducer, initialState, applyMiddleware(taskMiddleware));
204
- */
205
- var keplerGlReducer = decorate(_keplerGlReducer);
206
- var _default = exports["default"] = keplerGlReducer;
207
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWN0aW9ucyIsInJlcXVpcmUiLCJfcmVkdXhBY3Rpb25zIiwiX2NvcmUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImluaXRpYWxDb3JlU3RhdGUiLCJwcm92aWRlSW5pdGlhbFN0YXRlIiwiaW5pdGlhbFN0YXRlIiwiZXh0cmFSZWR1Y2VycyIsImNvcmVSZWR1Y2VyIiwiY29yZVJlZHVjZXJGYWN0b3J5IiwiaGFuZGxlUmVnaXN0ZXJFbnRyeSIsInN0YXRlIiwiX3JlZiIsIl9yZWYkcGF5bG9hZCIsInBheWxvYWQiLCJpZCIsIm1pbnQiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIm1hcGJveEFwaVVybCIsIm1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0IiwiaW5pdGlhbFVpU3RhdGUiLCJwcmV2aW91c1N0YXRlIiwidW5kZWZpbmVkIiwia2VwbGVyR2xJbml0IiwiaGFuZGxlRGVsZXRlRW50cnkiLCJfcmVmMiIsInJlZHVjZSIsImFjY3UiLCJjdXJyIiwiaGFuZGxlUmVuYW1lRW50cnkiLCJfcmVmNCIsIl9yZWY0JHBheWxvYWQiLCJvbGRJZCIsIm5ld0lkIiwiYWN0aW9uIiwidXBkYXRlSXRlbVN0YXRlIiwiX2FjdGlvbkZvciIsIl91cGRhdGVQcm9wZXJ0eSIsImhhbmRsZXJzIiwiQWN0aW9uVHlwZXMiLCJSRUdJU1RFUl9FTlRSWSIsIkRFTEVURV9FTlRSWSIsIlJFTkFNRV9FTlRSWSIsImhhbmRsZUFjdGlvbnMiLCJfa2VwbGVyR2xSZWR1Y2VyIiwibWVyZ2VJbml0aWFsU3RhdGUiLCJzYXZlZCIsInByb3ZpZGVkIiwiZXh0cmFJbml0aWFsU3RhdGVLZXlzIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIm5ld1N0YXRlIiwia2V5IiwiZGVjb3JhdGUiLCJ0YXJnZXQiLCJzYXZlZEluaXRpYWxTdGF0ZSIsInRhcmdldEluaXRpYWxTdGF0ZSIsInBsdWdpbiIsImN1c3RvbVJlZHVjZXIiLCJvcHRpb25zIiwiX3RoaXMiLCJfdHlwZW9mMiIsIl9vcHRpb25zJG92ZXJyaWRlIiwibmV4dFN0YXRlIiwidHlwZSIsIm92ZXJyaWRlIiwiaW5pU3QiLCJtZXJnZWQiLCJ0YXJnZXRSZWR1Y2VyIiwia2VwbGVyR2xSZWR1Y2VyIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3Jvb3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtcbiAgQWN0aW9uVHlwZXMsXG4gIGtlcGxlckdsSW5pdCxcbiAgX2FjdGlvbkZvcixcbiAgX3VwZGF0ZVByb3BlcnR5LFxuICBSZWdpc3RlckVudHJ5VXBkYXRlckFjdGlvbixcbiAgUmVuYW1lRW50cnlVcGRhdGVyQWN0aW9uXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge2hhbmRsZUFjdGlvbnN9IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuXG5pbXBvcnQge2NvcmVSZWR1Y2VyRmFjdG9yeSwgS2VwbGVyR2xTdGF0ZX0gZnJvbSAnLi9jb3JlJztcblxudHlwZSBLZXBsZXJHbFN0YXRlTWFwID0ge1xuICBbaWQ6IHN0cmluZ106IFBhcnRpYWw8S2VwbGVyR2xTdGF0ZT47XG59O1xuXG50eXBlIENvbWJpbmVSZWdpc3RlclVwZGF0ZUFjdGlvbnMgPSBSZWdpc3RlckVudHJ5VXBkYXRlckFjdGlvblsncGF5bG9hZCddICZcbiAgUmVuYW1lRW50cnlVcGRhdGVyQWN0aW9uWydwYXlsb2FkJ107IC8vIEV4dGVuZCB0aGlzIHR5cGUgd2l0aCBhZGRpdGlvbmFsIGFjdGlvbnMgdG8gZW5mb3JjZSBzdHJpY3QgdHlwaW5nc1xuXG4vLyBJTklUSUFMX1NUQVRFXG5jb25zdCBpbml0aWFsQ29yZVN0YXRlID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlSW5pdGlhbFN0YXRlKGluaXRpYWxTdGF0ZSwgZXh0cmFSZWR1Y2Vycz8pIHtcbiAgY29uc3QgY29yZVJlZHVjZXIgPSBjb3JlUmVkdWNlckZhY3RvcnkoaW5pdGlhbFN0YXRlLCBleHRyYVJlZHVjZXJzKTtcblxuICBjb25zdCBoYW5kbGVSZWdpc3RlckVudHJ5ID0gKFxuICAgIHN0YXRlOiBLZXBsZXJHbFN0YXRlTWFwLFxuICAgIHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgaWQsXG4gICAgICAgIG1pbnQsXG4gICAgICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICAgICAgICBtYXBib3hBcGlVcmwsXG4gICAgICAgIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0LFxuICAgICAgICBpbml0aWFsVWlTdGF0ZVxuICAgICAgfVxuICAgIH06IHtcbiAgICAgIHBheWxvYWQ6IFJlZ2lzdGVyRW50cnlVcGRhdGVyQWN0aW9uWydwYXlsb2FkJ107XG4gICAgfVxuICApOiBLZXBsZXJHbFN0YXRlTWFwID0+IHtcbiAgICAvLyBieSBkZWZhdWx0LCBhbHdheXMgY3JlYXRlIGEgbWludCBzdGF0ZSBldmVuIGlmIHRoZSBzYW1lIGlkIGFscmVhZHkgZXhpc3RcbiAgICAvLyBpZiBzdGF0ZS5pZCBleGlzdCBhbmQgbWludD1mYWxzZSwga2VlcCB0aGUgZXhpc3Rpbmcgc3RhdGVcbiAgICBjb25zdCBwcmV2aW91c1N0YXRlID0gc3RhdGVbaWRdICYmIG1pbnQgPT09IGZhbHNlID8gc3RhdGVbaWRdIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIHJlZ2lzdGVyIGVudHJ5IHRvIGtlcGxlci5nbCBwYXNzaW5nIGluIG1hcGJveCBjb25maWcgdG8gbWFwU3R5bGVcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgW2lkXTogY29yZVJlZHVjZXIoXG4gICAgICAgIHByZXZpb3VzU3RhdGUsXG4gICAgICAgIGtlcGxlckdsSW5pdCh7bWFwYm94QXBpQWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCwgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQsIGluaXRpYWxVaVN0YXRlfSlcbiAgICAgIClcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZUVudHJ5ID0gKFxuICAgIHN0YXRlOiBLZXBsZXJHbFN0YXRlTWFwLFxuICAgIHtwYXlsb2FkOiB7aWR9fToge3BheWxvYWQ6IHtpZDogc3RyaW5nfX1cbiAgKTogS2VwbGVyR2xTdGF0ZU1hcCA9PlxuICAgIE9iamVjdC5rZXlzKHN0YXRlKS5yZWR1Y2UoXG4gICAgICAoYWNjdSwgY3VycikgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4uKGN1cnIgPT09IGlkID8ge30gOiB7W2N1cnJdOiBzdGF0ZVtjdXJyXX0pXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICBjb25zdCBoYW5kbGVSZW5hbWVFbnRyeSA9IChcbiAgICBzdGF0ZTogS2VwbGVyR2xTdGF0ZU1hcCxcbiAgICB7XG4gICAgICBwYXlsb2FkOiB7b2xkSWQsIG5ld0lkfVxuICAgIH06IHtcbiAgICAgIHBheWxvYWQ6IFJlbmFtZUVudHJ5VXBkYXRlckFjdGlvblsncGF5bG9hZCddO1xuICAgIH1cbiAgKTogS2VwbGVyR2xTdGF0ZU1hcCA9PlxuICAgIE9iamVjdC5rZXlzKHN0YXRlKS5yZWR1Y2UoXG4gICAgICAoYWNjdSwgY3VycikgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4ue1tjdXJyID09PSBvbGRJZCA/IG5ld0lkIDogY3Vycl06IHN0YXRlW2N1cnJdfVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG5cbiAgcmV0dXJuIChzdGF0ZSA9IGluaXRpYWxDb3JlU3RhdGUsIGFjdGlvbikgPT4ge1xuICAgIC8vIHVwZGF0ZSBjaGlsZCBzdGF0ZXNcbiAgICBPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaChpZCA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVJdGVtU3RhdGUgPSBjb3JlUmVkdWNlcihzdGF0ZVtpZF0sIF9hY3Rpb25Gb3IoaWQsIGFjdGlvbikpO1xuICAgICAgc3RhdGUgPSBfdXBkYXRlUHJvcGVydHkoc3RhdGUsIGlkLCB1cGRhdGVJdGVtU3RhdGUpO1xuICAgIH0pO1xuXG4gICAgLy8gcGVyZm9ybSBhZGRpdGlvbmFsIHN0YXRlIHJlZHVjaW5nIChlLmcuIHN3aXRjaCBhY3Rpb24udHlwZSBldGMuLi4pXG4gICAgY29uc3QgaGFuZGxlcnMgPSB7XG4gICAgICBbQWN0aW9uVHlwZXMuUkVHSVNURVJfRU5UUlldOiBoYW5kbGVSZWdpc3RlckVudHJ5LFxuICAgICAgW0FjdGlvblR5cGVzLkRFTEVURV9FTlRSWV06IGhhbmRsZURlbGV0ZUVudHJ5LFxuICAgICAgW0FjdGlvblR5cGVzLlJFTkFNRV9FTlRSWV06IGhhbmRsZVJlbmFtZUVudHJ5XG4gICAgfTtcblxuICAgIHJldHVybiBoYW5kbGVBY3Rpb25zPEtlcGxlckdsU3RhdGVNYXAsIENvbWJpbmVSZWdpc3RlclVwZGF0ZUFjdGlvbnM+KFxuICAgICAgaGFuZGxlcnMsXG4gICAgICBpbml0aWFsQ29yZVN0YXRlXG4gICAgKShzdGF0ZSwgYWN0aW9uKTtcbiAgfTtcbn1cblxuY29uc3QgX2tlcGxlckdsUmVkdWNlciA9IHByb3ZpZGVJbml0aWFsU3RhdGUoaW5pdGlhbENvcmVTdGF0ZSk7XG5cbmZ1bmN0aW9uIG1lcmdlSW5pdGlhbFN0YXRlKHNhdmVkID0ge30sIHByb3ZpZGVkID0ge30sIGV4dHJhSW5pdGlhbFN0YXRlS2V5czogc3RyaW5nW10gPSBbXSkge1xuICBjb25zdCBrZXlzID0gWydtYXBTdGF0ZScsICdtYXBTdHlsZScsICd2aXNTdGF0ZScsICd1aVN0YXRlJywgLi4uZXh0cmFJbml0aWFsU3RhdGVLZXlzXTtcblxuICAvLyBzaGFsbG93IG1lcmdlIGVhY2ggcmVkdWNlclxuICBjb25zdCBuZXdTdGF0ZSA9IGtleXMucmVkdWNlKFxuICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgLi4uKHNhdmVkW2tleV0gJiYgcHJvdmlkZWRba2V5XVxuICAgICAgICA/IHtba2V5XTogey4uLnNhdmVkW2tleV0sIC4uLnByb3ZpZGVkW2tleV19fVxuICAgICAgICA6IHtba2V5XTogc2F2ZWRba2V5XSB8fCBwcm92aWRlZFtrZXldIHx8IHt9fSlcbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuZnVuY3Rpb24gZGVjb3JhdGUodGFyZ2V0LCBzYXZlZEluaXRpYWxTdGF0ZSA9IHt9KSB7XG4gIGNvbnN0IHRhcmdldEluaXRpYWxTdGF0ZSA9IHNhdmVkSW5pdGlhbFN0YXRlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEga2VwbGVyLmdsIHJlZHVjZXIgdGhhdCB3aWxsIGFsc28gcGFzcyBlYWNoIGFjdGlvbiB0aHJvdWdoIGFkZGl0aW9uYWwgcmVkdWNlcnMgc3BpZWNpZmllZC5cbiAgICogVGhlIHBhcmFtZXRlciBzaG91bGQgYmUgZWl0aGVyIGEgcmVkdWNlciBtYXAgb3IgYSByZWR1Y2VyIGZ1bmN0aW9uLlxuICAgKiBUaGUgc3RhdGUgcGFzc2VkIGludG8gdGhlIGFkZGl0aW9uYWwgYWN0aW9uIGhhbmRsZXIgaXMgdGhlIGluc3RhbmNlIHN0YXRlLlxuICAgKiBJdCB3aWxsIGluY2x1ZGUgYWxsIHRoZSBzdWJyZWR1Y2VycyBgdmlzU3RhdGVgLCBgdWlTdGF0ZWAsIGBtYXBTdGF0ZWAgYW5kIGBtYXBTdHlsZWAuXG4gICAqIGAucGx1Z2luYCBpcyBvbmx5IG1lYW50IHRvIGJlIGNhbGxlZCBvbmNlIHdoZW4gbW91bnRpbmcgdGhlIGtlcGxlckdsUmVkdWNlciB0byB0aGUgc3RvcmUuXG4gICAqICoqTm90ZSoqIFRoaXMgaXMgYW4gYWR2YW5jZWQgb3B0aW9uIHRvIGdpdmUgeW91IG1vcmUgZnJlZWRvbSB0byBtb2RpZnkgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBrZXBsZXIuZ2wgaW5zdGFuY2UuXG4gICAqIFlvdSBzaG91bGQgb25seSB1c2UgdGhpcyB0byBhZGRpbmcgYWRkaXRpb25hbCBhY3Rpb25zIGluc3RlYWQgb2YgcmVwbGFjaW5nIGRlZmF1bHQgYWN0aW9ucy5cbiAgICpcbiAgICogQG1peGluIGtlcGxlckdsUmVkdWNlci5wbHVnaW5cbiAgICogQG1lbWJlcm9mIGtlcGxlckdsUmVkdWNlclxuICAgKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gY3VzdG9tUmVkdWNlciAtIEEgcmVkdWNlciBtYXAgb3IgYSByZWR1Y2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0byBiZSBhcHBsaWVkIHRvIGN1c3RvbSByZWR1Y2VyIGxvZ2ljXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLm92ZXJyaWRlIC0gb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHdoaWNoIGFjdGlvbiB0byBvdmVycmlkZSwgZS5nLiB7W0FjdGlvblR5cGVzLkxBWUVSX1RZUEVfQ0hBTkdFXTogdHJ1ZX1cbiAgICogQHB1YmxpY1xuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBteUtlcGxlckdsUmVkdWNlciA9IGtlcGxlckdsUmVkdWNlclxuICAgKiAgLnBsdWdpbih7XG4gICAqICAgIC8vIDEuIGFzIHJlZHVjZXIgbWFwXG4gICAqICAgIEhJREVfQU5EX1NIT1dfU0lERV9QQU5FTDogKHN0YXRlLCBhY3Rpb24pID0+ICh7XG4gICAqICAgICAgLi4uc3RhdGUsXG4gICAqICAgICAgdWlTdGF0ZToge1xuICAgKiAgICAgICAgLi4uc3RhdGUudWlTdGF0ZSxcbiAgICogICAgICAgIHJlYWRPbmx5OiAhc3RhdGUudWlTdGF0ZS5yZWFkT25seVxuICAgKiAgICAgIH1cbiAgICogICAgfSlcbiAgICogIH0pXG4gICAqIC5wbHVnaW4oaGFuZGxlQWN0aW9ucyh7XG4gICAqICAgLy8gMi4gYXMgcmVkdWNlclxuICAgKiAgICdISURFX01BUF9DT05UUk9MUyc6IChzdGF0ZSwgYWN0aW9uKSA9PiAoe1xuICAgKiAgICAgLi4uc3RhdGUsXG4gICAqICAgICB1aVN0YXRlOiB7XG4gICAqICAgICAgIC4uLnN0YXRlLnVpU3RhdGUsXG4gICAqICAgICAgIG1hcENvbnRyb2xzOiBoaWRkZW5NYXBDb250cm9sXG4gICAqICAgICB9XG4gICAqICAgfSlcbiAgICogfSwge30pKTtcbiAgICovXG4gIHRhcmdldC5wbHVnaW4gPSBmdW5jdGlvbiBwbHVnaW4oY3VzdG9tUmVkdWNlciwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgY3VzdG9tUmVkdWNlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGlmIG9ubHkgcHJvdmlkZWQgYSByZWR1Y2VyTWFwLCB3cmFwIGl0IGluIGEgcmVkdWNlclxuICAgICAgY3VzdG9tUmVkdWNlciA9IGhhbmRsZUFjdGlvbnMoY3VzdG9tUmVkdWNlciwge30pO1xuICAgIH1cblxuICAgIC8vIHVzZSAnZnVuY3Rpb24nIGtleXdvcmQgdG8gZW5hYmxlICd0aGlzJ1xuICAgIC8vIFRPRE86IHRlbXBvcmFyaWx5IG1ha2luZyBhY3Rpb24gdHlwZSB0byBhbnksIHdpbGwgZml4IHRoYXQgYnkgY3JlYXRpbmcgYSBzaGFyZWQgYWN0aW9uIGludGVyZmFjZVxuICAgIHJldHVybiBkZWNvcmF0ZSgoc3RhdGUgPSB7fSwgYWN0aW9uOiBhbnkgPSB7fSkgPT4ge1xuICAgICAgbGV0IG5leHRTdGF0ZSA9IHN0YXRlO1xuICAgICAgaWYgKGFjdGlvbi50eXBlICYmICFvcHRpb25zPy5vdmVycmlkZT8uW2FjdGlvbi50eXBlXSkge1xuICAgICAgICBuZXh0U3RhdGUgPSB0aGlzKHN0YXRlLCBhY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICAvLyBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgc3RhdGVuXG4gICAgICBPYmplY3Qua2V5cyhuZXh0U3RhdGUpLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAvLyB1cGRhdGUgY2hpbGQgc3RhdGVzXG4gICAgICAgIG5leHRTdGF0ZSA9IF91cGRhdGVQcm9wZXJ0eShcbiAgICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY3VzdG9tUmVkdWNlcihuZXh0U3RhdGVbaWRdLCBfYWN0aW9uRm9yKGlkLCBhY3Rpb24pKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSByZWR1Y2VyIHRoYXQgaW5pdGlhdGVkIHdpdGggY3VzdG9tIGluaXRpYWwgc3RhdGUuXG4gICAqIFRoZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIGZyb20gYHN1YnJlZHVjZXJgIG5hbWUgdG8gY3VzdG9tIHN1YnJlZHVjZXIgc3RhdGUsXG4gICAqIHdoaWNoIHdpbGwgYmUgc2hhbGxvdyAqKm1lcmdlZCoqIHdpdGggZGVmYXVsdCBpbml0aWFsIHN0YXRlLlxuICAgKlxuICAgKiBEZWZhdWx0IHN1YnJlZHVjZXIgc3RhdGU6XG4gICAqICAtIFtgdmlzU3RhdGVgXSguL3Zpcy1zdGF0ZS5tZCNJTklUSUFMX1ZJU19TVEFURSlcbiAgICogIC0gW2BtYXBTdGF0ZWBdKC4vbWFwLXN0YXRlLm1kI0lOSVRJQUxfTUFQX1NUQVRFKVxuICAgKiAgLSBbYG1hcFN0eWxlYF0oLi9tYXAtc3R5bGUubWQjSU5JVElBTF9NQVBfU1RZTEUpXG4gICAqICAtIFtgdWlTdGF0ZWBdKC4vdWktc3RhdGUubWQjSU5JVElBTF9VSV9TVEFURSlcbiAgICogQG1peGluIGtlcGxlckdsUmVkdWNlci5pbml0aWFsU3RhdGVcbiAgICogQG1lbWJlcm9mIGtlcGxlckdsUmVkdWNlclxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5pU3QgLSBjdXN0b20gc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBpbml0aWFsIHN0YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRyYVJlZHVjZXJzIC0gb3B0aW9uYWwgY3VzdG9tIHJlZHVjZXJzIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGB2aXNTdGF0ZWAsIGBtYXBTdGF0ZWAsIGBtYXBTdHlsZWAsIGFuZCBgdWlTdGF0ZWBcbiAgICogQHB1YmxpY1xuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBteUtlcGxlckdsUmVkdWNlciA9IGtlcGxlckdsUmVkdWNlclxuICAgKiAgLmluaXRpYWxTdGF0ZSh7XG4gICAqICAgIHVpU3RhdGU6IHtyZWFkT25seTogdHJ1ZX1cbiAgICogIH0pO1xuICAgKi9cbiAgdGFyZ2V0LmluaXRpYWxTdGF0ZSA9IGZ1bmN0aW9uIGluaXRpYWxTdGF0ZShpbmlTdCwgZXh0cmFSZWR1Y2VycyA9IHt9KSB7XG4gICAgLy8gcGFzc2luZyB0aHJvdWdoIGV4dHJhSW5pdGlhbFN0YXRlS2V5cyBhbmQgZXh0cmFSZWR1Y2VycyBhbGxvd3MgZXh0ZXJuYWwgY3VzdG9taXphdGlvbiBieSBhZGRpbmcgYWRkaXRpb25hbCBzdWJyZWR1Y2VycyBhbmQgc3RhdGUgYmV5b25kIHRoZSBkZWZhdWx0IGB2aXNTdGF0ZWAsIGBtYXBTdGF0ZWAsIGBtYXBTdHlsZWAsIGFuZCBgdWlTdGF0ZWBcbiAgICBjb25zdCBleHRyYUluaXRpYWxTdGF0ZUtleXMgPSBPYmplY3Qua2V5cyhleHRyYVJlZHVjZXJzKTtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZUluaXRpYWxTdGF0ZSh0YXJnZXRJbml0aWFsU3RhdGUsIGluaVN0LCBleHRyYUluaXRpYWxTdGF0ZUtleXMpO1xuICAgIGNvbnN0IHRhcmdldFJlZHVjZXIgPSBwcm92aWRlSW5pdGlhbFN0YXRlKG1lcmdlZCwgZXh0cmFSZWR1Y2Vycyk7XG5cbiAgICByZXR1cm4gZGVjb3JhdGUodGFyZ2V0UmVkdWNlciwgbWVyZ2VkKTtcbiAgfTtcblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIEtlcGxlci5nbCByZWR1Y2VyIHRvIGJlIG1vdW50ZWQgdG8geW91ciBzdG9yZS4gWW91IGNhbiBtb3VudCBga2VwbGVyR2xSZWR1Y2VyYCBhdCBwcm9wZXJ0eSBga2VwbGVyR2xgLCBpZiB5b3UgY2hvb3NlXG4gKiB0byBtb3VudCBpdCBhdCBhbm90aGVyIGFkZHJlc3MgZS5nLiBgZm9vYCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgaXQgd2hlbiB5b3UgbW91bnQgYEtlcGxlckdsYCBjb21wb25lbnQgaW4geW91ciBhcHAgd2l0aCBgZ2V0U3RhdGU6IHN0YXRlID0+IHN0YXRlLmZvb2BcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyIGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogaW1wb3J0IHtjcmVhdGVTdG9yZSwgY29tYmluZVJlZHVjZXJzLCBhcHBseU1pZGRsZXdhcmUsIGNvbXBvc2V9IGZyb20gJ3JlZHV4JztcbiAqIGltcG9ydCB7dGFza01pZGRsZXdhcmV9IGZyb20gJ3JlYWN0LXBhbG0vdGFza3MnO1xuICpcbiAqIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHt9O1xuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogICAvLyA8LS0gbW91bnQga2VwbGVyLmdsIHJlZHVjZXIgaW4geW91ciBhcHBcbiAqICAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqXG4gKiAgIC8vIFlvdXIgb3RoZXIgcmVkdWNlcnMgaGVyZVxuICogICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIC8vIHVzaW5nIGNyZWF0ZVN0b3JlXG4gKiBleHBvcnQgZGVmYXVsdCBjcmVhdGVTdG9yZShyZWR1Y2VyLCBpbml0aWFsU3RhdGUsIGFwcGx5TWlkZGxld2FyZSh0YXNrTWlkZGxld2FyZSkpO1xuICovXG5jb25zdCBrZXBsZXJHbFJlZHVjZXIgPSBkZWNvcmF0ZShfa2VwbGVyR2xSZWR1Y2VyKTtcbmV4cG9ydCBkZWZhdWx0IGtlcGxlckdsUmVkdWNlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFRQSxJQUFBQyxhQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFBeUQsU0FBQUcsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxCLENBQUEsRUFBQUcsTUFBQSxDQUFBYyx5QkFBQSxDQUFBZixDQUFBLEtBQUFILE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLEdBQUFhLE9BQUEsV0FBQWQsQ0FBQSxJQUFBRSxNQUFBLENBQUFnQixjQUFBLENBQUFuQixDQUFBLEVBQUFDLENBQUEsRUFBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBTixDQUFBLEVBQUFELENBQUEsaUJBQUFELENBQUEsSUFiekQ7QUFDQTtBQW1CdUM7O0FBRXZDO0FBQ0EsSUFBTW9CLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUVwQixTQUFTQyxtQkFBbUJBLENBQUNDLFlBQVksRUFBRUMsYUFBYyxFQUFFO0VBQ2hFLElBQU1DLFdBQVcsR0FBRyxJQUFBQyx3QkFBa0IsRUFBQ0gsWUFBWSxFQUFFQyxhQUFhLENBQUM7RUFFbkUsSUFBTUcsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FDdkJDLEtBQXVCLEVBQUFDLElBQUEsRUFhRjtJQUFBLElBQUFDLFlBQUEsR0FBQUQsSUFBQSxDQVhuQkUsT0FBTztNQUNMQyxFQUFFLEdBQUFGLFlBQUEsQ0FBRkUsRUFBRTtNQUNGQyxJQUFJLEdBQUFILFlBQUEsQ0FBSkcsSUFBSTtNQUNKQyxvQkFBb0IsR0FBQUosWUFBQSxDQUFwQkksb0JBQW9CO01BQ3BCQyxZQUFZLEdBQUFMLFlBQUEsQ0FBWkssWUFBWTtNQUNaQyx1QkFBdUIsR0FBQU4sWUFBQSxDQUF2Qk0sdUJBQXVCO01BQ3ZCQyxjQUFjLEdBQUFQLFlBQUEsQ0FBZE8sY0FBYztJQU1sQjtJQUNBO0lBQ0EsSUFBTUMsYUFBYSxHQUFHVixLQUFLLENBQUNJLEVBQUUsQ0FBQyxJQUFJQyxJQUFJLEtBQUssS0FBSyxHQUFHTCxLQUFLLENBQUNJLEVBQUUsQ0FBQyxHQUFHTyxTQUFTO0lBRXpFLE9BQUExQixhQUFBLENBQUFBLGFBQUEsS0FFS2UsS0FBSyxXQUFBWCxnQkFBQSxpQkFDUGUsRUFBRSxFQUFHUCxXQUFXLENBQ2ZhLGFBQWEsRUFDYixJQUFBRSxxQkFBWSxFQUFDO01BQUNOLG9CQUFvQixFQUFwQkEsb0JBQW9CO01BQUVDLFlBQVksRUFBWkEsWUFBWTtNQUFFQyx1QkFBdUIsRUFBdkJBLHVCQUF1QjtNQUFFQyxjQUFjLEVBQWRBO0lBQWMsQ0FBQyxDQUM1RixDQUFDO0VBRUwsQ0FBQztFQUVELElBQU1JLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQ3JCYixLQUF1QixFQUFBYyxLQUFBO0lBQUEsSUFDWlYsRUFBRSxHQUFBVSxLQUFBLENBQVpYLE9BQU8sQ0FBR0MsRUFBRTtJQUFBLE9BRWI1QixNQUFNLENBQUNDLElBQUksQ0FBQ3VCLEtBQUssQ0FBQyxDQUFDZSxNQUFNLENBQ3ZCLFVBQUNDLElBQUksRUFBRUMsSUFBSTtNQUFBLE9BQUFoQyxhQUFBLENBQUFBLGFBQUEsS0FDTitCLElBQUksR0FDSEMsSUFBSSxLQUFLYixFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQUFmLGdCQUFBLGlCQUFLNEIsSUFBSSxFQUFHakIsS0FBSyxDQUFDaUIsSUFBSSxDQUFDLENBQUM7SUFBQSxDQUM1QyxFQUNGLENBQUMsQ0FDSCxDQUFDO0VBQUE7RUFFSCxJQUFNQyxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUNyQmxCLEtBQXVCLEVBQUFtQixLQUFBO0lBQUEsSUFBQUMsYUFBQSxHQUFBRCxLQUFBLENBRXJCaEIsT0FBTztNQUFHa0IsS0FBSyxHQUFBRCxhQUFBLENBQUxDLEtBQUs7TUFBRUMsS0FBSyxHQUFBRixhQUFBLENBQUxFLEtBQUs7SUFBQSxPQUt4QjlDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDdUIsS0FBSyxDQUFDLENBQUNlLE1BQU0sQ0FDdkIsVUFBQ0MsSUFBSSxFQUFFQyxJQUFJO01BQUEsT0FBQWhDLGFBQUEsQ0FBQUEsYUFBQSxLQUNOK0IsSUFBSSxPQUFBM0IsZ0JBQUEsaUJBQ0Y0QixJQUFJLEtBQUtJLEtBQUssR0FBR0MsS0FBSyxHQUFHTCxJQUFJLEVBQUdqQixLQUFLLENBQUNpQixJQUFJLENBQUM7SUFBQSxDQUNoRCxFQUNGLENBQUMsQ0FDSCxDQUFDO0VBQUE7RUFFSCxPQUFPLFlBQXNDO0lBQUEsSUFBckNqQixLQUFLLEdBQUFkLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUF5QixTQUFBLEdBQUF6QixTQUFBLE1BQUdPLGdCQUFnQjtJQUFBLElBQUU4QixNQUFNLEdBQUFyQyxTQUFBLENBQUFDLE1BQUEsT0FBQUQsU0FBQSxNQUFBeUIsU0FBQTtJQUN0QztJQUNBbkMsTUFBTSxDQUFDQyxJQUFJLENBQUN1QixLQUFLLENBQUMsQ0FBQ1osT0FBTyxDQUFDLFVBQUFnQixFQUFFLEVBQUk7TUFDL0IsSUFBTW9CLGVBQWUsR0FBRzNCLFdBQVcsQ0FBQ0csS0FBSyxDQUFDSSxFQUFFLENBQUMsRUFBRSxJQUFBcUIsbUJBQVUsRUFBQ3JCLEVBQUUsRUFBRW1CLE1BQU0sQ0FBQyxDQUFDO01BQ3RFdkIsS0FBSyxHQUFHLElBQUEwQix3QkFBZSxFQUFDMUIsS0FBSyxFQUFFSSxFQUFFLEVBQUVvQixlQUFlLENBQUM7SUFDckQsQ0FBQyxDQUFDOztJQUVGO0lBQ0EsSUFBTUcsUUFBUSxPQUFBdEMsZ0JBQUEsaUJBQUFBLGdCQUFBLGlCQUFBQSxnQkFBQSxpQkFDWHVDLG9CQUFXLENBQUNDLGNBQWMsRUFBRzlCLG1CQUFtQixHQUNoRDZCLG9CQUFXLENBQUNFLFlBQVksRUFBR2pCLGlCQUFpQixHQUM1Q2Usb0JBQVcsQ0FBQ0csWUFBWSxFQUFHYixpQkFBaUIsQ0FDOUM7SUFFRCxPQUFPLElBQUFjLDJCQUFhLEVBQ2xCTCxRQUFRLEVBQ1JsQyxnQkFDRixDQUFDLENBQUNPLEtBQUssRUFBRXVCLE1BQU0sQ0FBQztFQUNsQixDQUFDO0FBQ0g7QUFFQSxJQUFNVSxnQkFBZ0IsR0FBR3ZDLG1CQUFtQixDQUFDRCxnQkFBZ0IsQ0FBQztBQUU5RCxTQUFTeUMsaUJBQWlCQSxDQUFBLEVBQWtFO0VBQUEsSUFBakVDLEtBQUssR0FBQWpELFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUF5QixTQUFBLEdBQUF6QixTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBQUEsSUFBRWtELFFBQVEsR0FBQWxELFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUF5QixTQUFBLEdBQUF6QixTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBQUEsSUFBRW1ELHFCQUErQixHQUFBbkQsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQXlCLFNBQUEsR0FBQXpCLFNBQUEsTUFBRyxFQUFFO0VBQ3hGLElBQU1ULElBQUksSUFBSSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUE2RCxNQUFBLEtBQUFDLG1CQUFBLGFBQUtGLHFCQUFxQixFQUFDOztFQUV0RjtFQUNBLElBQU1HLFFBQVEsR0FBRy9ELElBQUksQ0FBQ3NDLE1BQU0sQ0FDMUIsVUFBQ0MsSUFBSSxFQUFFeUIsR0FBRztJQUFBLE9BQUF4RCxhQUFBLENBQUFBLGFBQUEsS0FDTCtCLElBQUksR0FDSG1CLEtBQUssQ0FBQ00sR0FBRyxDQUFDLElBQUlMLFFBQVEsQ0FBQ0ssR0FBRyxDQUFDLE9BQUFwRCxnQkFBQSxpQkFDekJvRCxHQUFHLEVBQUF4RCxhQUFBLENBQUFBLGFBQUEsS0FBT2tELEtBQUssQ0FBQ00sR0FBRyxDQUFDLEdBQUtMLFFBQVEsQ0FBQ0ssR0FBRyxDQUFDLFNBQUFwRCxnQkFBQSxpQkFDdENvRCxHQUFHLEVBQUdOLEtBQUssQ0FBQ00sR0FBRyxDQUFDLElBQUlMLFFBQVEsQ0FBQ0ssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7RUFBQSxDQUM5QyxFQUNGLENBQUMsQ0FDSCxDQUFDO0VBRUQsT0FBT0QsUUFBUTtBQUNqQjtBQUVBLFNBQVNFLFFBQVFBLENBQUNDLE1BQU0sRUFBMEI7RUFBQSxJQUF4QkMsaUJBQWlCLEdBQUExRCxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBeUIsU0FBQSxHQUFBekIsU0FBQSxNQUFHLENBQUMsQ0FBQztFQUM5QyxJQUFNMkQsa0JBQWtCLEdBQUdELGlCQUFpQjs7RUFFNUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFRCxNQUFNLENBQUNHLE1BQU0sR0FBRyxTQUFTQSxNQUFNQSxDQUFDQyxhQUFhLEVBQUVDLE9BQU8sRUFBRTtJQUFBLElBQUFDLEtBQUE7SUFDdEQsSUFBSSxJQUFBQyxRQUFBLGFBQU9ILGFBQWEsTUFBSyxRQUFRLEVBQUU7TUFDckM7TUFDQUEsYUFBYSxHQUFHLElBQUFmLDJCQUFhLEVBQUNlLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRDs7SUFFQTtJQUNBO0lBQ0EsT0FBT0wsUUFBUSxDQUFDLFlBQWtDO01BQUEsSUFBQVMsaUJBQUE7TUFBQSxJQUFqQ25ELEtBQUssR0FBQWQsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQXlCLFNBQUEsR0FBQXpCLFNBQUEsTUFBRyxDQUFDLENBQUM7TUFBQSxJQUFFcUMsTUFBVyxHQUFBckMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQXlCLFNBQUEsR0FBQXpCLFNBQUEsTUFBRyxDQUFDLENBQUM7TUFDM0MsSUFBSWtFLFNBQVMsR0FBR3BELEtBQUs7TUFDckIsSUFBSXVCLE1BQU0sQ0FBQzhCLElBQUksSUFBSSxFQUFDTCxPQUFPLGFBQVBBLE9BQU8sZ0JBQUFHLGlCQUFBLEdBQVBILE9BQU8sQ0FBRU0sUUFBUSxjQUFBSCxpQkFBQSxlQUFqQkEsaUJBQUEsQ0FBb0I1QixNQUFNLENBQUM4QixJQUFJLENBQUMsR0FBRTtRQUNwREQsU0FBUyxHQUFHSCxLQUFJLENBQUNqRCxLQUFLLEVBQUV1QixNQUFNLENBQUM7TUFDakM7O01BRUE7TUFDQS9DLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMkUsU0FBUyxDQUFDLENBQUNoRSxPQUFPLENBQUMsVUFBQWdCLEVBQUUsRUFBSTtRQUNuQztRQUNBZ0QsU0FBUyxHQUFHLElBQUExQix3QkFBZSxFQUN6QjBCLFNBQVMsRUFDVGhELEVBQUUsRUFDRjJDLGFBQWEsQ0FBQ0ssU0FBUyxDQUFDaEQsRUFBRSxDQUFDLEVBQUUsSUFBQXFCLG1CQUFVLEVBQUNyQixFQUFFLEVBQUVtQixNQUFNLENBQUMsQ0FDckQsQ0FBQztNQUNILENBQUMsQ0FBQztNQUNGLE9BQU82QixTQUFTO0lBQ2xCLENBQUMsQ0FBQztFQUNKLENBQUM7O0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VULE1BQU0sQ0FBQ2hELFlBQVksR0FBRyxTQUFTQSxZQUFZQSxDQUFDNEQsS0FBSyxFQUFzQjtJQUFBLElBQXBCM0QsYUFBYSxHQUFBVixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBeUIsU0FBQSxHQUFBekIsU0FBQSxNQUFHLENBQUMsQ0FBQztJQUNuRTtJQUNBLElBQU1tRCxxQkFBcUIsR0FBRzdELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDbUIsYUFBYSxDQUFDO0lBQ3hELElBQU00RCxNQUFNLEdBQUd0QixpQkFBaUIsQ0FBQ1csa0JBQWtCLEVBQUVVLEtBQUssRUFBRWxCLHFCQUFxQixDQUFDO0lBQ2xGLElBQU1vQixhQUFhLEdBQUcvRCxtQkFBbUIsQ0FBQzhELE1BQU0sRUFBRTVELGFBQWEsQ0FBQztJQUVoRSxPQUFPOEMsUUFBUSxDQUFDZSxhQUFhLEVBQUVELE1BQU0sQ0FBQztFQUN4QyxDQUFDO0VBRUQsT0FBT2IsTUFBTTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1lLGVBQWUsR0FBR2hCLFFBQVEsQ0FBQ1QsZ0JBQWdCLENBQUM7QUFBQyxJQUFBMEIsUUFBQSxHQUFBQyxPQUFBLGNBQ3BDRixlQUFlIiwiaWdub3JlTGlzdCI6W119