UNPKG

@data-client/core

Version:

Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch

110 lines (109 loc) 16.7 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { normalize } from '@data-client/normalizr'; import { OPTIMISTIC } from '../../actionTypes.js'; import AbortOptimistic from '../../controller/AbortOptimistic.js'; export function setResponseReducer(state, action, controller) { if (action.error) { return reduceError(state, action, action.response); } try { var _state$meta$action$ke; let response; // for true set's response is contained in action if (action.type === OPTIMISTIC) { // this should never happen /* istanbul ignore if */ if (!action.endpoint.getOptimisticResponse) return state; try { // compute optimistic response based on current state response = action.endpoint.getOptimisticResponse.call(action.endpoint, controller.snapshot(state, action.meta.fetchedAt), ...action.args); } catch (e) { // AbortOptimistic means 'do nothing', otherwise we count the exception as endpoint failure if (e.constructor === AbortOptimistic) { return state; } throw e; } } else { response = action.response; } const { result, entities, indexes, entitiesMeta } = normalize(action.endpoint.schema, response, action.args, state, action.meta); const endpoints = _extends({}, state.endpoints, { [action.key]: result }); try { if (action.endpoint.update) { const updaters = action.endpoint.update(result, ...action.args); Object.keys(updaters).forEach(key => { endpoints[key] = updaters[key](endpoints[key]); }); } // no reason to completely fail because of user-code error // integrity of this state update is still guaranteed } catch (error) { console.error(`Endpoint.update() error: ${action.key}`); console.error(error); } return { entities, endpoints, indexes, meta: _extends({}, state.meta, { [action.key]: { date: action.meta.date, fetchedAt: action.meta.fetchedAt, expiresAt: action.meta.expiresAt, prevExpiresAt: (_state$meta$action$ke = state.meta[action.key]) == null ? void 0 : _state$meta$action$ke.expiresAt } }), entitiesMeta, optimistic: filterOptimistic(state, action), lastReset: state.lastReset }; // reducer must update the state, so in case of processing errors we simply compute the endpoints inline } catch (error) { if (typeof error === 'object') { error.message = `Error processing ${action.key}\n\nFull Schema: ${JSON.stringify(action.endpoint.schema, undefined, 2)}\n\nError:\n${error.message}`; if ('response' in action) error.response = action.response; error.status = 400; } // this is not always bubbled up, so let's double sure this doesn't fail silently /* istanbul ignore else */ if (process.env.NODE_ENV !== 'production') { console.error(error); } return reduceError(state, action, error); } } function reduceError(state, action, error) { if (error.name === 'AbortError') { // In case we abort simply undo the optimistic update and act like no fetch even occured // We still want those watching promises from fetch directly to observed the abort, but we don't want to // Trigger errors in this case. This means theoretically improperly built aborts useSuspense() could suspend forever. return _extends({}, state, { optimistic: filterOptimistic(state, action) }); } return _extends({}, state, { meta: _extends({}, state.meta, { [action.key]: { date: action.meta.date, fetchedAt: action.meta.fetchedAt, expiresAt: action.meta.expiresAt, error, errorPolicy: action.endpoint.errorPolicy == null ? void 0 : action.endpoint.errorPolicy(error) } }), optimistic: filterOptimistic(state, action) }); } /** Filter all requests with same serialization that did not start after the resolving request */ function filterOptimistic(state, resolvingAction) { return state.optimistic.filter(optimisticAction => optimisticAction.key !== resolvingAction.key || (optimisticAction.type === OPTIMISTIC ? optimisticAction.meta.fetchedAt !== resolvingAction.meta.fetchedAt : optimisticAction.meta.date > resolvingAction.meta.date)); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemUiLCJPUFRJTUlTVElDIiwiQWJvcnRPcHRpbWlzdGljIiwic2V0UmVzcG9uc2VSZWR1Y2VyIiwic3RhdGUiLCJhY3Rpb24iLCJjb250cm9sbGVyIiwiZXJyb3IiLCJyZWR1Y2VFcnJvciIsInJlc3BvbnNlIiwiX3N0YXRlJG1ldGEkYWN0aW9uJGtlIiwidHlwZSIsImVuZHBvaW50IiwiZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlIiwiY2FsbCIsInNuYXBzaG90IiwibWV0YSIsImZldGNoZWRBdCIsImFyZ3MiLCJlIiwiY29uc3RydWN0b3IiLCJyZXN1bHQiLCJlbnRpdGllcyIsImluZGV4ZXMiLCJlbnRpdGllc01ldGEiLCJzY2hlbWEiLCJlbmRwb2ludHMiLCJfZXh0ZW5kcyIsImtleSIsInVwZGF0ZSIsInVwZGF0ZXJzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJjb25zb2xlIiwiZGF0ZSIsImV4cGlyZXNBdCIsInByZXZFeHBpcmVzQXQiLCJvcHRpbWlzdGljIiwiZmlsdGVyT3B0aW1pc3RpYyIsImxhc3RSZXNldCIsIm1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwic3RhdHVzIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwibmFtZSIsImVycm9yUG9saWN5IiwicmVzb2x2aW5nQWN0aW9uIiwiZmlsdGVyIiwib3B0aW1pc3RpY0FjdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdGF0ZS9yZWR1Y2VyL3NldFJlc3BvbnNlUmVkdWNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub3JtYWxpemUgfSBmcm9tICdAZGF0YS1jbGllbnQvbm9ybWFsaXpyJztcblxuaW1wb3J0IHsgT1BUSU1JU1RJQyB9IGZyb20gJy4uLy4uL2FjdGlvblR5cGVzLmpzJztcbmltcG9ydCBBYm9ydE9wdGltaXN0aWMgZnJvbSAnLi4vLi4vY29udHJvbGxlci9BYm9ydE9wdGltaXN0aWMuanMnO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlciBmcm9tICcuLi8uLi9jb250cm9sbGVyL0NvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHR5cGUge1xuICBTdGF0ZSxcbiAgU2V0UmVzcG9uc2VBY3Rpb24sXG4gIE9wdGltaXN0aWNBY3Rpb24sXG59IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFJlc3BvbnNlUmVkdWNlcihcbiAgc3RhdGU6IFN0YXRlPHVua25vd24+LFxuICBhY3Rpb246IE9wdGltaXN0aWNBY3Rpb24gfCBTZXRSZXNwb25zZUFjdGlvbixcbiAgY29udHJvbGxlcjogQ29udHJvbGxlcixcbik6IFN0YXRlPHVua25vd24+IHtcbiAgaWYgKGFjdGlvbi5lcnJvcikge1xuICAgIHJldHVybiByZWR1Y2VFcnJvcihzdGF0ZSwgYWN0aW9uLCBhY3Rpb24ucmVzcG9uc2UpO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlOiBhbnk7XG4gICAgLy8gZm9yIHRydWUgc2V0J3MgcmVzcG9uc2UgaXMgY29udGFpbmVkIGluIGFjdGlvblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gT1BUSU1JU1RJQykge1xuICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghYWN0aW9uLmVuZHBvaW50LmdldE9wdGltaXN0aWNSZXNwb25zZSkgcmV0dXJuIHN0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29tcHV0ZSBvcHRpbWlzdGljIHJlc3BvbnNlIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgcmVzcG9uc2UgPSBhY3Rpb24uZW5kcG9pbnQuZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlLmNhbGwoXG4gICAgICAgICAgYWN0aW9uLmVuZHBvaW50LFxuICAgICAgICAgIGNvbnRyb2xsZXIuc25hcHNob3Qoc3RhdGUsIGFjdGlvbi5tZXRhLmZldGNoZWRBdCksXG4gICAgICAgICAgLi4uYWN0aW9uLmFyZ3MsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgLy8gQWJvcnRPcHRpbWlzdGljIG1lYW5zICdkbyBub3RoaW5nJywgb3RoZXJ3aXNlIHdlIGNvdW50IHRoZSBleGNlcHRpb24gYXMgZW5kcG9pbnQgZmFpbHVyZVxuICAgICAgICBpZiAoZS5jb25zdHJ1Y3RvciA9PT0gQWJvcnRPcHRpbWlzdGljKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlID0gYWN0aW9uLnJlc3BvbnNlO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc3VsdCwgZW50aXRpZXMsIGluZGV4ZXMsIGVudGl0aWVzTWV0YSB9ID0gbm9ybWFsaXplKFxuICAgICAgYWN0aW9uLmVuZHBvaW50LnNjaGVtYSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgYWN0aW9uLmFyZ3MsXG4gICAgICBzdGF0ZSxcbiAgICAgIGFjdGlvbi5tZXRhLFxuICAgICk7XG4gICAgY29uc3QgZW5kcG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIC4uLnN0YXRlLmVuZHBvaW50cyxcbiAgICAgIFthY3Rpb24ua2V5XTogcmVzdWx0LFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3Rpb24uZW5kcG9pbnQudXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZXJzID0gYWN0aW9uLmVuZHBvaW50LnVwZGF0ZShyZXN1bHQsIC4uLmFjdGlvbi5hcmdzKTtcbiAgICAgICAgT2JqZWN0LmtleXModXBkYXRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBlbmRwb2ludHNba2V5XSA9IHVwZGF0ZXJzW2tleV0oZW5kcG9pbnRzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIG5vIHJlYXNvbiB0byBjb21wbGV0ZWx5IGZhaWwgYmVjYXVzZSBvZiB1c2VyLWNvZGUgZXJyb3JcbiAgICAgIC8vIGludGVncml0eSBvZiB0aGlzIHN0YXRlIHVwZGF0ZSBpcyBzdGlsbCBndWFyYW50ZWVkXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVuZHBvaW50LnVwZGF0ZSgpIGVycm9yOiAke2FjdGlvbi5rZXl9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0aWVzLFxuICAgICAgZW5kcG9pbnRzLFxuICAgICAgaW5kZXhlcyxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4uc3RhdGUubWV0YSxcbiAgICAgICAgW2FjdGlvbi5rZXldOiB7XG4gICAgICAgICAgZGF0ZTogYWN0aW9uLm1ldGEuZGF0ZSxcbiAgICAgICAgICBmZXRjaGVkQXQ6IGFjdGlvbi5tZXRhLmZldGNoZWRBdCxcbiAgICAgICAgICBleHBpcmVzQXQ6IGFjdGlvbi5tZXRhLmV4cGlyZXNBdCxcbiAgICAgICAgICBwcmV2RXhwaXJlc0F0OiBzdGF0ZS5tZXRhW2FjdGlvbi5rZXldPy5leHBpcmVzQXQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZW50aXRpZXNNZXRhLFxuICAgICAgb3B0aW1pc3RpYzogZmlsdGVyT3B0aW1pc3RpYyhzdGF0ZSwgYWN0aW9uKSxcbiAgICAgIGxhc3RSZXNldDogc3RhdGUubGFzdFJlc2V0LFxuICAgIH07XG4gICAgLy8gcmVkdWNlciBtdXN0IHVwZGF0ZSB0aGUgc3RhdGUsIHNvIGluIGNhc2Ugb2YgcHJvY2Vzc2luZyBlcnJvcnMgd2Ugc2ltcGx5IGNvbXB1dGUgdGhlIGVuZHBvaW50cyBpbmxpbmVcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvci5tZXNzYWdlID0gYEVycm9yIHByb2Nlc3NpbmcgJHtcbiAgICAgICAgYWN0aW9uLmtleVxuICAgICAgfVxcblxcbkZ1bGwgU2NoZW1hOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBhY3Rpb24uZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIDIsXG4gICAgICApfVxcblxcbkVycm9yOlxcbiR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgaWYgKCdyZXNwb25zZScgaW4gYWN0aW9uKSBlcnJvci5yZXNwb25zZSA9IGFjdGlvbi5yZXNwb25zZTtcbiAgICAgIGVycm9yLnN0YXR1cyA9IDQwMDtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGlzIG5vdCBhbHdheXMgYnViYmxlZCB1cCwgc28gbGV0J3MgZG91YmxlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgc2lsZW50bHlcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZHVjZUVycm9yKHN0YXRlLCBhY3Rpb24sIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2VFcnJvcihcbiAgc3RhdGU6IFN0YXRlPHVua25vd24+LFxuICBhY3Rpb246IFNldFJlc3BvbnNlQWN0aW9uIHwgT3B0aW1pc3RpY0FjdGlvbixcbiAgZXJyb3I6IGFueSxcbik6IFN0YXRlPHVua25vd24+IHtcbiAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgIC8vIEluIGNhc2Ugd2UgYWJvcnQgc2ltcGx5IHVuZG8gdGhlIG9wdGltaXN0aWMgdXBkYXRlIGFuZCBhY3QgbGlrZSBubyBmZXRjaCBldmVuIG9jY3VyZWRcbiAgICAvLyBXZSBzdGlsbCB3YW50IHRob3NlIHdhdGNoaW5nIHByb21pc2VzIGZyb20gZmV0Y2ggZGlyZWN0bHkgdG8gb2JzZXJ2ZWQgdGhlIGFib3J0LCBidXQgd2UgZG9uJ3Qgd2FudCB0b1xuICAgIC8vIFRyaWdnZXIgZXJyb3JzIGluIHRoaXMgY2FzZS4gVGhpcyBtZWFucyB0aGVvcmV0aWNhbGx5IGltcHJvcGVybHkgYnVpbHQgYWJvcnRzIHVzZVN1c3BlbnNlKCkgY291bGQgc3VzcGVuZCBmb3JldmVyLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG9wdGltaXN0aWM6IGZpbHRlck9wdGltaXN0aWMoc3RhdGUsIGFjdGlvbiksXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIG1ldGE6IHtcbiAgICAgIC4uLnN0YXRlLm1ldGEsXG4gICAgICBbYWN0aW9uLmtleV06IHtcbiAgICAgICAgZGF0ZTogYWN0aW9uLm1ldGEuZGF0ZSxcbiAgICAgICAgZmV0Y2hlZEF0OiBhY3Rpb24ubWV0YS5mZXRjaGVkQXQsXG4gICAgICAgIGV4cGlyZXNBdDogYWN0aW9uLm1ldGEuZXhwaXJlc0F0LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgZXJyb3JQb2xpY3k6IGFjdGlvbi5lbmRwb2ludC5lcnJvclBvbGljeT8uKGVycm9yKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBvcHRpbWlzdGljOiBmaWx0ZXJPcHRpbWlzdGljKHN0YXRlLCBhY3Rpb24pLFxuICB9O1xufVxuLyoqIEZpbHRlciBhbGwgcmVxdWVzdHMgd2l0aCBzYW1lIHNlcmlhbGl6YXRpb24gdGhhdCBkaWQgbm90IHN0YXJ0IGFmdGVyIHRoZSByZXNvbHZpbmcgcmVxdWVzdCAqL1xuZnVuY3Rpb24gZmlsdGVyT3B0aW1pc3RpYyhcbiAgc3RhdGU6IFN0YXRlPHVua25vd24+LFxuICByZXNvbHZpbmdBY3Rpb246IFNldFJlc3BvbnNlQWN0aW9uIHwgT3B0aW1pc3RpY0FjdGlvbixcbikge1xuICByZXR1cm4gc3RhdGUub3B0aW1pc3RpYy5maWx0ZXIoXG4gICAgb3B0aW1pc3RpY0FjdGlvbiA9PlxuICAgICAgb3B0aW1pc3RpY0FjdGlvbi5rZXkgIT09IHJlc29sdmluZ0FjdGlvbi5rZXkgfHxcbiAgICAgIChvcHRpbWlzdGljQWN0aW9uLnR5cGUgPT09IE9QVElNSVNUSUMgP1xuICAgICAgICBvcHRpbWlzdGljQWN0aW9uLm1ldGEuZmV0Y2hlZEF0ICE9PSByZXNvbHZpbmdBY3Rpb24ubWV0YS5mZXRjaGVkQXRcbiAgICAgIDogb3B0aW1pc3RpY0FjdGlvbi5tZXRhLmRhdGUgPiByZXNvbHZpbmdBY3Rpb24ubWV0YS5kYXRlKSxcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLFNBQVMsUUFBUSx3QkFBd0I7QUFFbEQsU0FBU0MsVUFBVSxRQUFRLHNCQUFzQjtBQUNqRCxPQUFPQyxlQUFlLE1BQU0scUNBQXFDO0FBUWpFLE9BQU8sU0FBU0Msa0JBQWtCQSxDQUNoQ0MsS0FBcUIsRUFDckJDLE1BQTRDLEVBQzVDQyxVQUFzQixFQUNOO0VBQ2hCLElBQUlELE1BQU0sQ0FBQ0UsS0FBSyxFQUFFO0lBQ2hCLE9BQU9DLFdBQVcsQ0FBQ0osS0FBSyxFQUFFQyxNQUFNLEVBQUVBLE1BQU0sQ0FBQ0ksUUFBUSxDQUFDO0VBQ3BEO0VBQ0EsSUFBSTtJQUFBLElBQUFDLHFCQUFBO0lBQ0YsSUFBSUQsUUFBYTtJQUNqQjtJQUNBLElBQUlKLE1BQU0sQ0FBQ00sSUFBSSxLQUFLVixVQUFVLEVBQUU7TUFDOUI7TUFDQTtNQUNBLElBQUksQ0FBQ0ksTUFBTSxDQUFDTyxRQUFRLENBQUNDLHFCQUFxQixFQUFFLE9BQU9ULEtBQUs7TUFDeEQsSUFBSTtRQUNGO1FBQ0FLLFFBQVEsR0FBR0osTUFBTSxDQUFDTyxRQUFRLENBQUNDLHFCQUFxQixDQUFDQyxJQUFJLENBQ25EVCxNQUFNLENBQUNPLFFBQVEsRUFDZk4sVUFBVSxDQUFDUyxRQUFRLENBQUNYLEtBQUssRUFBRUMsTUFBTSxDQUFDVyxJQUFJLENBQUNDLFNBQVMsQ0FBQyxFQUNqRCxHQUFHWixNQUFNLENBQUNhLElBQ1osQ0FBQztNQUNILENBQUMsQ0FBQyxPQUFPQyxDQUFNLEVBQUU7UUFDZjtRQUNBLElBQUlBLENBQUMs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QUFLLENBQUNBLEtBQUssQ0FBQztJQUN0QjtJQUNBLE9BQU9DLFdBQVcsQ0FBQ0osS0FBSyxFQUFFQyxNQUFNLEVBQUVFLEtBQUssQ0FBQztFQUMxQztBQUNGO0FBRUEsU0FBU0MsV0FBV0EsQ0FDbEJKLEtBQXFCLEVBQ3JCQyxNQUE0QyxFQUM1Q0UsS0FBVSxFQUNNO0VBQ2hCLElBQUlBLEtBQUssQ0FBQzBDLElBQUksS0FBSyxZQUFZLEVBQUU7SUFDL0I7SUFDQTtJQUNBO0lBQ0EsT0FBQXRCLFFBQUEsS0FDS3ZCLEtBQUs7TUFDUmtDLFVBQVUsRUFBRUMsZ0JBQWdCLENBQUNuQyxLQUFLLEVBQUVDLE1BQU07SUFBQztFQUUvQztFQUNBLE9BQUFzQixRQUFBLEtBQ0t2QixLQUFLO0lBQ1JZLElBQUksRUFBQVcsUUFBQSxLQUNDdkIsS0FBSyxDQUFDWSxJQUFJO01BQ2IsQ0FBQ1gsTUFBTSxDQUFDdUIsR0FBRyxHQUFHO1FBQ1pPLElBQUksRUFBRTlCLE1BQU0sQ0FBQ1csSUFBSSxDQUFDbUIsSUFBSTtRQUN0QmxCLFNBQVMsRUFBRVosTUFBTSxDQUFDVyxJQUFJLENBQUNDLFNBQVM7UUFDaENtQixTQUFTLEVBQUUvQixNQUFNLENBQUNXLElBQUksQ0FBQ29CLFNBQVM7UUFDaEM3QixLQUFLO1FBQ0wyQyxXQUFXLEVBQUU3QyxNQUFNLENBQUNPLFFBQVEsQ0FBQ3NDLFdBQVcsb0JBQTNCN0MsTUFBTSxDQUFDTyxRQUFRLENBQUNzQyxXQUFXLENBQUczQyxLQUFLO01BQ2xEO0lBQUMsRUFDRjtJQUNEK0IsVUFBVSxFQUFFQyxnQkFBZ0IsQ0FBQ25DLEtBQUssRUFBRUMsTUFBTTtFQUFDO0FBRS9DO0FBQ0E7QUFDQSxTQUFTa0MsZ0JBQWdCQSxDQUN2Qm5DLEtBQXFCLEVBQ3JCK0MsZUFBcUQsRUFDckQ7RUFDQSxPQUFPL0MsS0FBSyxDQUFDa0MsVUFBVSxDQUFDYyxNQUFNLENBQzVCQyxnQkFBZ0IsSUFDZEEsZ0JBQWdCLENBQUN6QixHQUFHLEtBQUt1QixlQUFlLENBQUN2QixHQUFHLEtBQzNDeUIsZ0JBQWdCLENBQUMxQyxJQUFJLEtBQUtWLFVBQVUsR0FDbkNvRCxnQkFBZ0IsQ0FBQ3JDLElBQUksQ0FBQ0MsU0FBUyxLQUFLa0MsZUFBZSxDQUFDbkMsSUFBSSxDQUFDQyxTQUFTLEdBQ2xFb0MsZ0JBQWdCLENBQUNyQyxJQUFJLENBQUNtQixJQUFJLEdBQUdnQixlQUFlLENBQUNuQyxJQUFJLENBQUNtQixJQUFJLENBQzVELENBQUM7QUFDSCIsImlnbm9yZUxpc3QiOltdfQ==