UNPKG

@data-client/test

Version:

Testing utilities for Data Client

119 lines (117 loc) 17.8 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; const _excluded = ["initialFixtures", "resolverFixtures", "getInitialInterceptorData"], _excluded2 = ["children"]; import { SubscriptionManager, NetworkManager, PollingSubscription, Controller } from '@data-client/react'; import React, { memo, Suspense } from 'react'; import { renderHook, act } from './renderHook.cjs'; import { MockController } from '../MockController.js'; import mockInitialState from '../mockState.js'; import { jsx as _jsx } from "react/jsx-runtime"; const activeCleanups = new Set(); if (typeof afterEach === 'function') { afterEach(() => { for (const fn of activeCleanups) fn(); activeCleanups.clear(); }); } /** @see https://dataclient.io/docs/api/makeRenderDataHook */ export default function makeRenderDataHook(Provider) { const renderDataClient = (callback, _ref = {}) => { let { initialFixtures, resolverFixtures, getInitialInterceptorData = () => ({}) } = _ref, options = _objectWithoutPropertiesLoose(_ref, _excluded); /** Wraps dispatches that are typically called declaratively in act() */ class ActController extends MockController(Controller, resolverFixtures ? { fixtures: resolverFixtures, getInitialInterceptorData } : {}) { constructor(options) { super(options); const { setResponse, resolve } = this; this.setResponse = (...args) => { let promise; act(() => { promise = setResponse.call(this, ...args); }); return promise; }; this.resolve = (...args) => { let promise; act(() => { promise = resolve.call(this, ...args); }); return promise; }; } } // we want fresh manager state in each instance const nm = new NetworkManager(); const sm = new SubscriptionManager(PollingSubscription); const managers = [nm, sm]; const cleanup = () => { activeCleanups.delete(cleanup); nm.cleanupDate = Infinity; if (nm['rejectors']) Object.values(nm['rejectors']).forEach(rej => { rej(); });else if (nm['fetching']) nm['fetching'].forEach(({ reject }) => reject()); nm['clearAll'](); managers.forEach(manager => manager.cleanup()); }; const allSettled = () => { return nm.allSettled(); }; activeCleanups.add(cleanup); renderDataClient.cleanup = cleanup; renderDataClient.allSettled = allSettled; const initialState = mockInitialState(initialFixtures); const ProviderWithResolver = /*#__PURE__*/memo(function ProviderWithResolver({ children }) { return /*#__PURE__*/_jsx(Provider, { initialState: initialState, Controller: ActController, managers: managers, devButton: null, children: children }); }); const Wrapper = options == null ? void 0 : options.wrapper; const ProviderWithWrapper = Wrapper ? function ProviderWrapped(props) { return /*#__PURE__*/_jsx(ProviderWithResolver, { children: /*#__PURE__*/_jsx(Wrapper, _extends({}, props)) }); } : ProviderWithResolver; const wrapper = _ref2 => { let { children } = _ref2, props = _objectWithoutPropertiesLoose(_ref2, _excluded2); return /*#__PURE__*/_jsx(ProviderWithWrapper, _extends({}, props, { children: /*#__PURE__*/_jsx(Suspense, { fallback: null, children: children }) })); }; const ret = renderHook(callback, _extends({}, options, { wrapper })); ret.controller = nm['controller']; ret.cleanup = cleanup; ret.allSettled = allSettled; return ret; }; renderDataClient.cleanup = () => {}; renderDataClient.allSettled = () => Promise.allSettled([]); return renderDataClient; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdWJzY3JpcHRpb25NYW5hZ2VyIiwiTmV0d29ya01hbmFnZXIiLCJQb2xsaW5nU3Vic2NyaXB0aW9uIiwiQ29udHJvbGxlciIsIlJlYWN0IiwibWVtbyIsIlN1c3BlbnNlIiwicmVuZGVySG9vayIsImFjdCIsIk1vY2tDb250cm9sbGVyIiwibW9ja0luaXRpYWxTdGF0ZSIsImpzeCIsIl9qc3giLCJhY3RpdmVDbGVhbnVwcyIsIlNldCIsImFmdGVyRWFjaCIsImZuIiwiY2xlYXIiLCJtYWtlUmVuZGVyRGF0YUhvb2siLCJQcm92aWRlciIsInJlbmRlckRhdGFDbGllbnQiLCJjYWxsYmFjayIsIl9yZWYiLCJpbml0aWFsRml4dHVyZXMiLCJyZXNvbHZlckZpeHR1cmVzIiwiZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSIsIm9wdGlvbnMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsIl9leGNsdWRlZCIsIkFjdENvbnRyb2xsZXIiLCJmaXh0dXJlcyIsImNvbnN0cnVjdG9yIiwic2V0UmVzcG9uc2UiLCJyZXNvbHZlIiwiYXJncyIsInByb21pc2UiLCJjYWxsIiwibm0iLCJzbSIsIm1hbmFnZXJzIiwiY2xlYW51cCIsImRlbGV0ZSIsImNsZWFudXBEYXRlIiwiSW5maW5pdHkiLCJPYmplY3QiLCJ2YWx1ZXMiLCJmb3JFYWNoIiwicmVqIiwicmVqZWN0IiwibWFuYWdlciIsImFsbFNldHRsZWQiLCJhZGQiLCJpbml0aWFsU3RhdGUiLCJQcm92aWRlcldpdGhSZXNvbHZlciIsImNoaWxkcmVuIiwiZGV2QnV0dG9uIiwiV3JhcHBlciIsIndyYXBwZXIiLCJQcm92aWRlcldpdGhXcmFwcGVyIiwiUHJvdmlkZXJXcmFwcGVkIiwicHJvcHMiLCJfZXh0ZW5kcyIsIl9yZWYyIiwiX2V4Y2x1ZGVkMiIsImZhbGxiYWNrIiwicmV0IiwiY29udHJvbGxlciIsIlByb21pc2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFrZVJlbmRlckRhdGFDbGllbnQvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFN0YXRlLFxuICBNYW5hZ2VyLFxuICBTdWJzY3JpcHRpb25NYW5hZ2VyLFxuICBOZXR3b3JrTWFuYWdlcixcbiAgUG9sbGluZ1N1YnNjcmlwdGlvbixcbiAgQ29udHJvbGxlcixcbiAgR2VuZXJpY0Rpc3BhdGNoLFxuICBEYXRhQ2xpZW50RGlzcGF0Y2gsXG59IGZyb20gJ0BkYXRhLWNsaWVudC9yZWFjdCc7XG5pbXBvcnQgUmVhY3QsIHsgbWVtbywgU3VzcGVuc2UgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7XG4gIHJlbmRlckhvb2ssXG4gIGFjdCxcbiAgUmVuZGVySG9va1Jlc3VsdCxcbiAgdHlwZSBSZW5kZXJIb29rT3B0aW9ucyxcbn0gZnJvbSAnLi9yZW5kZXJIb29rLmNqcyc7XG5pbXBvcnQgeyBJbnRlcmNlcHRvciwgRml4dHVyZSB9IGZyb20gJy4uL2ZpeHR1cmVUeXBlcy5qcyc7XG5pbXBvcnQgeyBNb2NrQ29udHJvbGxlciB9IGZyb20gJy4uL01vY2tDb250cm9sbGVyLmpzJztcbmltcG9ydCBtb2NrSW5pdGlhbFN0YXRlIGZyb20gJy4uL21vY2tTdGF0ZS5qcyc7XG5pbXBvcnQgeyBNb2NrUHJvcHMgfSBmcm9tICcuLi9tb2NrVHlwZXMuanMnO1xuXG5jb25zdCBhY3RpdmVDbGVhbnVwcyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcblxuaWYgKHR5cGVvZiBhZnRlckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGFjdGl2ZUNsZWFudXBzKSBmbigpO1xuICAgIGFjdGl2ZUNsZWFudXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKiogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvbWFrZVJlbmRlckRhdGFIb29rICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlUmVuZGVyRGF0YUhvb2soXG4gIFByb3ZpZGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPERhdGFQcm92aWRlclByb3BzPixcbikge1xuICBjb25zdCByZW5kZXJEYXRhQ2xpZW50OiBSZW5kZXJEYXRhSG9vayA9ICg8UCwgUiwgVCA9IGFueT4oXG4gICAgY2FsbGJhY2s6IChwcm9wczogUCkgPT4gUixcbiAgICB7XG4gICAgICBpbml0aWFsRml4dHVyZXMsXG4gICAgICByZXNvbHZlckZpeHR1cmVzLFxuICAgICAgZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSA9ICgpID0+ICh7fSkgYXMgYW55LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IHtcbiAgICAgIGluaXRpYWxQcm9wcz86IFA7XG4gICAgICBpbml0aWFsRml4dHVyZXM/OiBGaXh0dXJlW107XG4gICAgICByZXNvbHZlckZpeHR1cmVzPzogKEZpeHR1cmUgfCBJbnRlcmNlcHRvcjxUPilbXTtcbiAgICAgIGdldEluaXRpYWxJbnRlcmNlcHRvckRhdGE/OiAoKSA9PiBUO1xuICAgICAgd3JhcHBlcj86IFJlYWN0LkNvbXBvbmVudFR5cGU8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48UD4+O1xuICAgIH0gJiBPbWl0PFJlbmRlckhvb2tPcHRpb25zPFA+LCAnaW5pdGlhbFByb3BzJyB8ICd3cmFwcGVyJz4gPSB7fSBhcyBhbnksXG4gICk6IFJlbmRlckRhdGFIb29rUmVzdWx0PFIsIFA+ID0+IHtcbiAgICAvKiogV3JhcHMgZGlzcGF0Y2hlcyB0aGF0IGFyZSB0eXBpY2FsbHkgY2FsbGVkIGRlY2xhcmF0aXZlbHkgaW4gYWN0KCkgKi9cbiAgICBjbGFzcyBBY3RDb250cm9sbGVyPFxuICAgICAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IERhdGFDbGllbnREaXNwYXRjaCxcbiAgICAgIFQgPSB7fSxcbiAgICA+IGV4dGVuZHMgTW9ja0NvbnRyb2xsZXIoXG4gICAgICBDb250cm9sbGVyLFxuICAgICAgcmVzb2x2ZXJGaXh0dXJlcyA/XG4gICAgICAgIHtcbiAgICAgICAgICBmaXh0dXJlczogcmVzb2x2ZXJGaXh0dXJlcyxcbiAgICAgICAgICBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhLFxuICAgICAgICB9XG4gICAgICA6IHt9LFxuICAgICk8RD4ge1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIG9wdGlvbnM6IE1vY2tQcm9wczxUPiAmIENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgQ29udHJvbGxlcjxEPj5bMF0sXG4gICAgICApIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgc2V0UmVzcG9uc2UsIHJlc29sdmUgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMuc2V0UmVzcG9uc2UgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGxldCBwcm9taXNlOiBhbnk7XG4gICAgICAgICAgYWN0KCgpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UgPSBzZXRSZXNwb25zZS5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJlc29sdmUgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGxldCBwcm9taXNlOiBhbnk7XG4gICAgICAgICAgYWN0KCgpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UgPSByZXNvbHZlLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gd2Ugd2FudCBmcmVzaCBtYW5hZ2VyIHN0YXRlIGluIGVhY2ggaW5zdGFuY2VcbiAgICBjb25zdCBubSA9IG5ldyBOZXR3b3JrTWFuYWdlcigpO1xuICAgIGNvbnN0IHNtID0gbmV3IFN1YnNjcmlwdGlvbk1hbmFnZXIoUG9sbGluZ1N1YnNjcmlwdGlvbik7XG4gICAgY29uc3QgbWFuYWdlcnMgPSBbbm0sIHNtXTtcbiAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgYWN0aXZlQ2xlYW51cHMuZGVsZXRlKGNsZWFudXApO1xuICAgICAgbm0uY2xlYW51cERhdGUgPSBJbmZpbml0eTtcbiAgICAgIGlmICgobm0gYXMgYW55KVsncmVqZWN0b3JzJ10pXG4gICAgICAgIE9iamVjdC52YWx1ZXMoKG5tIGFzIGFueSlbJ3JlamVjdG9ycyddIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLmZvckVhY2goXG4gICAgICAgICAgcmVqID0+IHtcbiAgICAgICAgICAgIHJlaigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICBlbHNlIGlmIChubVsnZmV0Y2hpbmcnXSkgbm1bJ2ZldGNoaW5nJ10uZm9yRWFjaCgoeyByZWplY3QgfSkgPT4gcmVqZWN0KCkpO1xuICAgICAgbm1bJ2NsZWFyQWxsJ10oKTtcbiAgICAgIG1hbmFnZXJzLmZvckVhY2gobWFuYWdlciA9PiBtYW5hZ2VyLmNsZWFudXAoKSk7XG4gICAgfTtcbiAgICBjb25zdCBhbGxTZXR0bGVkID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIG5tLmFsbFNldHRsZWQoKTtcbiAgICB9O1xuICAgIGFjdGl2ZUNsZWFudXBzLmFkZChjbGVhbnVwKTtcbiAgICByZW5kZXJEYXRhQ2xpZW50LmNsZWFudXAgPSBjbGVhbnVwO1xuICAgIHJlbmRlckRhdGFDbGllbnQuYWxsU2V0dGxlZCA9IGFsbFNldHRsZWQ7XG5cbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IFN0YXRlPHVua25vd24+ID0gbW9ja0luaXRpYWxTdGF0ZShpbml0aWFsRml4dHVyZXMpO1xuXG4gICAgY29uc3QgUHJvdmlkZXJXaXRoUmVzb2x2ZXI6IFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PiA9IG1lbW8oXG4gICAgICBmdW5jdGlvbiBQcm92aWRlcldpdGhSZXNvbHZlcih7IGNoaWxkcmVuIH06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFByb3ZpZGVyXG4gICAgICAgICAgICBpbml0aWFsU3RhdGU9e2luaXRpYWxTdGF0ZX1cbiAgICAgICAgICAgIENvbnRyb2xsZXI9e0FjdENvbnRyb2xsZXJ9XG4gICAgICAgICAgICBtYW5hZ2Vycz17bWFuYWdlcnN9XG4gICAgICAgICAgICBkZXZCdXR0b249e251bGx9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgIDwvUHJvdmlkZXI+XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBXcmFwcGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+PiB8IHVuZGVmaW5lZCA9XG4gICAgICBvcHRpb25zPy53cmFwcGVyO1xuICAgIGNvbnN0IFByb3ZpZGVyV2l0aFdyYXBwZXIgPVxuICAgICAgV3JhcHBlciA/XG4gICAgICAgIGZ1bmN0aW9uIFByb3ZpZGVyV3JhcHBlZChwcm9wczogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48UD4pIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFByb3ZpZGVyV2l0aFJlc29sdmVyPlxuICAgICAgICAgICAgICA8V3JhcHBlciB7Li4ucHJvcHN9IC8+XG4gICAgICAgICAgICA8L1Byb3ZpZGVyV2l0aFJlc29sdmVyPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIDogUHJvdmlkZXJXaXRoUmVzb2x2ZXI7XG5cbiAgICBjb25zdCB3cmFwcGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPGFueT4gPSAoe1xuICAgICAgY2hpbGRyZW4sXG4gICAgICAuLi5wcm9wc1xuICAgIH06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+KSA9PiAoXG4gICAgICA8UHJvdmlkZXJXaXRoV3JhcHBlciB7Li4uKHByb3BzIGFzIGFueSl9PlxuICAgICAgICA8U3VzcGVuc2UgZmFsbGJhY2s9e251bGx9PntjaGlsZHJlbn08L1N1c3BlbnNlPlxuICAgICAgPC9Qcm92aWRlcldpdGhXcmFwcGVyPlxuICAgICk7XG5cbiAgICBjb25zdCByZXQ6IGFueSA9IHJlbmRlckhvb2soY2FsbGJhY2ssIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB3cmFwcGVyLFxuICAgIH0pO1xuICAgIHJldC5jb250cm9sbGVyID0gbm1bJ2NvbnRyb2xsZXInXTtcbiAgICByZXQuY2xlYW51cCA9IGNsZWFudXA7XG4gICAgcmV0LmFsbFNldHRsZWQgPSBhbGxTZXR0bGVkO1xuICAgIHJldHVybiByZXQ7XG4gIH0pIGFzIGFueTtcbiAgcmVuZGVyRGF0YUNsaWVudC5jbGVhbnVwID0gKCkgPT4ge307XG4gIHJlbmRlckRhdGFDbGllbnQuYWxsU2V0dGxlZCA9ICgpID0+IFByb21pc2UuYWxsU2V0dGxlZChbXSk7XG4gIHJldHVybiByZW5kZXJEYXRhQ2xpZW50O1xufVxuZXhwb3J0IGludGVyZmFjZSBEYXRhUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gIG1hbmFnZXJzOiBNYW5hZ2VyW107XG4gIGluaXRpYWxTdGF0ZTogU3RhdGU8dW5rbm93bj47XG4gIENvbnRyb2xsZXI6IHR5cGVvZiBDb250cm9sbGVyPGFueT47XG4gIGRldkJ1dHRvbjogYW55O1xufVxuXG5leHBvcnQgdHlwZSBSZW5kZXJEYXRhSG9va1Jlc3VsdDxSLCBQPiA9IFJlbmRlckhvb2tSZXN1bHQ8UiwgUD4gJiB7XG4gIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIGNsZWFudXA6ICgpID0+IHZvaWQ7XG4gIGFsbFNldHRsZWQ6ICgpID0+IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXT4gfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgdHlwZSBSZW5kZXJEYXRhSG9vayA9ICg8UCwgUj4oXG4gIGNhbGxiYWNrOiAocHJvcHM6IFApID0+IFIsXG4gIG9wdGlvbnM/OiB7XG4gICAgaW5pdGlhbFByb3BzPzogUDtcbiAgICBpbml0aWFsRml4dHVyZXM/OiByZWFkb25seSBGaXh0dXJlW107XG4gICAgcmVhZG9ubHkgcmVzb2x2ZXJGaXh0dXJlcz86IHJlYWRvbmx5IChGaXh0dXJlIHwgSW50ZXJjZXB0b3IpW107XG4gICAgd3JhcHBlcj86IFJlYWN0LkNvbXBvbmVudFR5cGU8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48UD4+O1xuICB9ICYgT21pdDxSZW5kZXJIb29rT3B0aW9uczxQPiwgJ2luaXRpYWxQcm9wcycgfCAnd3JhcHBlcic+LFxuKSA9PiBSZW5kZXJEYXRhSG9va1Jlc3VsdDxSLCBQPikgJiB7XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgcGVyLXJlbmRlciBjbGVhbnVwIHJldHVybmVkIGZyb20gcmVuZGVyRGF0YUNsaWVudCgpIGluc3RlYWQgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBwZXItcmVuZGVyIGFsbFNldHRsZWQgcmV0dXJuZWQgZnJvbSByZW5kZXJEYXRhQ2xpZW50KCkgaW5zdGVhZCAqL1xuICBhbGxTZXR0bGVkOiAoKSA9PiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W10+IHwgdW5kZWZpbmVkO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLFNBR0VBLG1CQUFtQixFQUNuQkMsY0FBYyxFQUNkQyxtQkFBbUIsRUFDbkJDLFVBQVUsUUFHTCxvQkFBb0I7QUFDM0IsT0FBT0MsS0FBSyxJQUFJQyxJQUFJLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBRTdDLFNBQ0VDLFVBQVUsRUFDVkMsR0FBRyxRQUdFLGtCQUFrQjtBQUV6QixTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELE9BQU9DLGdCQUFnQixNQUFNLGlCQUFpQjtBQUFDLFNBQUFDLEdBQUEsSUFBQUMsSUFBQTtBQUcvQyxNQUFNQyxjQUFjLEdBQUcsSUFBSUMsR0FBRyxDQUFhLENBQUM7QUFFNUMsSUFBSSxPQUFPQyxTQUFTLEtBQUssVUFBVSxFQUFFO0VBQ25DQSxTQUFTLENBQUMsTUFBTTtJQUNkLEtBQUssTUFBTUMsRUFBRSxJQUFJSCxjQUFjLEVBQUVHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDSCxjQUFjLENBQUNJLEtBQUssQ0FBQyxDQUFDO0VBQ3hCLENBQUMsQ0FBQztBQUNKOztBQUVBO0FBQ0EsZUFBZSxTQUFTQyxrQkFBa0JBLENBQ3hDQyxRQUFnRCxFQUNoRDtFQUNBLE1BQU1DLGdCQUFnQyxHQUFJQSxDQUN4Q0MsUUFBeUIsRUFDekJDLElBQUEsR0FXNkQsQ0FBQyxDQUFRLEtBQ3ZDO0lBQUEsSUFaL0I7UUFDRUMsZUFBZTtRQUNmQyxnQkFBZ0I7UUFDaEJDLHlCQUF5QixHQUFHQSxDQUFBLE1BQU8sQ0FBQyxDQUFDO01BUWtCLENBQUMsR0FBQUgsSUFBQTtNQVByREksT0FBTyxHQUFBQyw2QkFBQSxDQUFBTCxJQUFBLEVBQUFNLFNBQUE7SUFTWjtJQUNBLE1BQU1DLGFBQWEsU0FHVHBCLGNBQWMsQ0FDdEJOLFVBQVUsRUFDVnFCLGdCQUFnQixHQUNkO01BQ0VNLFFBQVEsRUFBRU4sZ0JBQWdCO01BQzFCQztJQUNGLENBQUMsR0FDRCxDQUFDLENBQ0wsQ0FBQyxDQUFJO01BQ0hNLFdBQVdBLENBQ1RMLE9BQXNFLEVBQ3RFO1FBQ0EsS0FBSyxDQUFDQSxPQUFPLENBQUM7UUFDZCxNQUFNO1VBQUVNLFdBQVc7VUFBRUM7UUFBUSxDQUFDLEdBQUcsSUFBSTtRQUNyQyxJQUFJLENBQUNELFdBQVcsR0FBRyxDQUFDLEdBQUdFLElBQUksS0FBSztVQUM5QixJQUFJQyxPQUFZO1VBQ2hCM0IsR0FBRyxDQUFDLE1BQU07WUFDUjJCLE9BQU8sR0FBR0gsV0FBVyxDQUFDSSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUdGLElBQUksQ0FBQztVQUMzQyxDQUFDLENBQUM7VUFDRixPQUFPQyxPQUFPO1FBQ2hCLENBQUM7UUFDRCxJQUFJLENBQUNGLE9BQU8sR0FBRyxDQUFDLEdBQUdDLElBQUksS0FBSztVQUMxQixJQUFJQyxPQUFZO1VBQ2hCM0IsR0FBRyxDQUFDLE1BQU07WUFDUjJCLE9BQU8sR0FBR0YsT0FBTyxDQUFDRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUdGLElBQUksQ0FBQztVQUN2QyxDQUFDLENBQUM7VUFDRixPQUFPQyxPQUFPO1FBQ2hCLENBQUM7TUFDSDtJQUNGOztJQUVBO0lBQ0EsTUFBTUUsRUFBRSxHQUFHLElBQUlwQyxjQUFjLENBQUMsQ0FBQztJQUMvQixNQUFNcUMsRUFBRSxHQUFHLElBQUl0QyxtQkFBbUIsQ0FBQ0UsbUJBQW1CLENBQUM7SUFDdkQsTUFBTXFDLFFBQVEsR0FBRyxDQUFDRixFQUFFLEVBQUVDLEVBQUUsQ0FBQztJQUN6QixNQUFNRSxPQUFPLEdBQUdBLENBQUEsS0FBTTtNQUNwQjNCLGNBQWMsQ0FBQzRCLE1BQU0sQ0FBQ0QsT0FBTyxDQUFDO01BQzlCSCxFQUFFLENBQUNLLFdBQVcsR0FBR0MsUUFBUTtNQUN6QixJQUFLTixFQUFFLENBQVMsV0FBVyxDQUFDLEVBQzFCTyxNQUFNLENBQUNDLE1BQU0sQ0FBRVIsRUFBRSxDQUFTLFdBQVcsQ0FBd0IsQ0FBQyxDQUFDUyxPQUFPLENBQ3BFQyxHQUFHLElBQUk7UUFDTEEsR0FBRyxDQUFDLENBQUM7TUFDUCxDQUNGLENBQUMsQ0FBQyxLQUNDLElBQUlWLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRUEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDUyxPQUFPLENBQUMsQ0FBQztRQUFFRTtNQUFPLENBQUMsS0FBS0EsTUFBTSxDQUFDLENBQUMsQ0FBQztNQUN6RVgsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDaEJFLFFBQVEsQ0FBQ08sT0FBTyxDQUFDRyxPQUFPLElBQUlBLE9BQU8sQ0FBQ1QsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsTUFBTVUsVUFBVSxHQUFHQSxDQUFBLEtBQU07TUFDdkIsT0FBT2IsRUFBRSxDQUFDYSxVQUFVLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0RyQyxjQUFjLENBQUNzQyxHQUFHLENBQUNYLE9BQU8sQ0FBQztJQUMzQnBCLGdCQUFnQixDQUFDb0IsT0FBTyxHQUFHQSxPQUFPO0lBQ2xDcEIsZ0JBQWdCLENBQUM4QixVQUFVLEdBQUdBLFVBQVU7SUFFeEMsTUFBTUUsWUFBNEIsR0FBRzFDLGdCQUFnQixDQUFDYSxlQUFlLENBQUM7SUFFdEUsTUFBTThCLG9CQUE4QyxnQkFBR2hELElBQUksQ0FDekQsU0FBU2dELG9CQUFvQkEsQ0FBQztNQUFFQztJQUFxQyxDQUFDLEVBQUU7TUFDdEUsb0JBQ0UxQyxJQUFBLENBQUNPLFFBQVE7UUFDUGlDLFlBQVksRUFBRUEsWUFBYTtRQUMzQmpELFVBQVUsRUFBRTBCLGFBQWM7UUFDMUJVLFFBQVEsRUFBRUEsUUFBUztRQUNuQmdCLFNBQVMsRUFBRSxJQUFLO1FBQUFELFFBQUEsRUFFZkE7TUFBUSxDQUNELENBQUM7SUFFZixDQUNGLENBQUM7SUFFRCxNQUFNRSxPQUFvRSxHQUN4RTlCLE9BQU8sb0JBQVBBLE9BQU8sQ0FBRStCLE9BQU87SUFDbEIsTUFBTUMsbUJBQW1CLEdBQ3ZCRixPQUFPLEdBQ0wsU0FBU0csZUFBZUEsQ0FBQ0MsS0FBaUMsRUFBRTtNQUMxRCxvQkFDRWhELElBQUEsQ0FBQ3lDLG9CQUFvQjtRQUFBQyxRQUFBLGVBQ25CMUMsSUFBQSxDQUFDNEMsT0FBTyxFQUFBSyxRQUFBLEtBQUtELEtBQUssQ0FBRztNQUFDLENBQ0YsQ0FBQztJQUUzQixDQUFDLEdBQ0RQLG9CQUFvQjtJQUV4QixNQUFNSSxPQUFpQyxHQUFHSyxLQUFBO01BQUEsSUFBQztVQUN6Q1I7UUFFMEIsQ0FBQyxHQUFBUSxLQUFBO1FBRHhCRixLQUFLLEdBQUFqQyw2QkFBQSxDQUFBbUMsS0FBQSxFQUFBQyxVQUFBO01BQUEsb0JBRVJuRCxJQUFBLENBQUM4QyxtQkFBbUIsRUFBQUcsUUFBQSxLQUFNRCxLQUFLO1FBQUFOLFFBQUEsZUFDN0IxQyxJQUFBLENBQUNOLFFBQVE7VUFBQzBELFFBQVEsRUFBRSxJQUFLO1VBQUFWLFFBQUEsRUFBRUE7UUFBUSxDQUFXO01BQUMsRUFDNUIsQ0FBQztJQUFBLENBQ3ZCO0lBRUQsTUFBTVcsR0FBUSxHQUFHMUQsVUFBVSxDQUFDYyxRQUFRLEVBQUF3QyxRQUFBLEtBQy9CbkMsT0FBTztNQUNWK0I7SUFBTyxFQUNSLENBQUM7SUFDRlEsR0FBRyxDQUFDQyxVQUFVLEdBQUc3QixFQUFFLENBQUMsWUFBWSxDQUFDO0lBQ2pDNEIsR0FBRyxDQUFDekIsT0FBTyxHQUFHQSxPQUFPO0lBQ3JCeUIsR0FBRyxDQUFDZixVQUFVLEdBQUdBLFVBQVU7SUFDM0IsT0FBT2UsR0FBRztFQUNaLENBQVM7RUFDVDdDLGdCQUFnQixDQUFDb0IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0VBQ25DcEIsZ0JBQWdCLENBQUM4QixVQUFVLEdBQUcsTUFBTWlCLE9BQU8sQ0FBQ2pCLFVBQVUsQ0FBQyxFQUFFLENBQUM7RUFDMUQsT0FBTzlCLGdCQUFnQjtBQUN6QiIsImlnbm9yZUxpc3QiOltdfQ==