UNPKG

@data-client/test

Version:

Testing utilities for Data Client

115 lines (113 loc) 17 kB
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, { initialFixtures, resolverFixtures, getInitialInterceptorData = () => ({}), ...options } = {}) => { /** 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, { ...props }) }); } : ProviderWithResolver; const wrapper = ({ children, ...props }) => /*#__PURE__*/_jsx(ProviderWithWrapper, { ...props, children: /*#__PURE__*/_jsx(Suspense, { fallback: null, children: children }) }); const ret = renderHook(callback, { ...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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdWJzY3JpcHRpb25NYW5hZ2VyIiwiTmV0d29ya01hbmFnZXIiLCJQb2xsaW5nU3Vic2NyaXB0aW9uIiwiQ29udHJvbGxlciIsIlJlYWN0IiwibWVtbyIsIlN1c3BlbnNlIiwicmVuZGVySG9vayIsImFjdCIsIk1vY2tDb250cm9sbGVyIiwibW9ja0luaXRpYWxTdGF0ZSIsImpzeCIsIl9qc3giLCJhY3RpdmVDbGVhbnVwcyIsIlNldCIsImFmdGVyRWFjaCIsImZuIiwiY2xlYXIiLCJtYWtlUmVuZGVyRGF0YUhvb2siLCJQcm92aWRlciIsInJlbmRlckRhdGFDbGllbnQiLCJjYWxsYmFjayIsImluaXRpYWxGaXh0dXJlcyIsInJlc29sdmVyRml4dHVyZXMiLCJnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhIiwib3B0aW9ucyIsIkFjdENvbnRyb2xsZXIiLCJmaXh0dXJlcyIsImNvbnN0cnVjdG9yIiwic2V0UmVzcG9uc2UiLCJyZXNvbHZlIiwiYXJncyIsInByb21pc2UiLCJjYWxsIiwibm0iLCJzbSIsIm1hbmFnZXJzIiwiY2xlYW51cCIsImRlbGV0ZSIsImNsZWFudXBEYXRlIiwiSW5maW5pdHkiLCJPYmplY3QiLCJ2YWx1ZXMiLCJmb3JFYWNoIiwicmVqIiwicmVqZWN0IiwibWFuYWdlciIsImFsbFNldHRsZWQiLCJhZGQiLCJpbml0aWFsU3RhdGUiLCJQcm92aWRlcldpdGhSZXNvbHZlciIsImNoaWxkcmVuIiwiZGV2QnV0dG9uIiwiV3JhcHBlciIsIndyYXBwZXIiLCJQcm92aWRlcldpdGhXcmFwcGVyIiwiUHJvdmlkZXJXcmFwcGVkIiwicHJvcHMiLCJmYWxsYmFjayIsInJldCIsImNvbnRyb2xsZXIiLCJQcm9taXNlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21ha2VSZW5kZXJEYXRhQ2xpZW50L2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBTdGF0ZSxcbiAgTWFuYWdlcixcbiAgU3Vic2NyaXB0aW9uTWFuYWdlcixcbiAgTmV0d29ya01hbmFnZXIsXG4gIFBvbGxpbmdTdWJzY3JpcHRpb24sXG4gIENvbnRyb2xsZXIsXG4gIEdlbmVyaWNEaXNwYXRjaCxcbiAgRGF0YUNsaWVudERpc3BhdGNoLFxufSBmcm9tICdAZGF0YS1jbGllbnQvcmVhY3QnO1xuaW1wb3J0IFJlYWN0LCB7IG1lbW8sIFN1c3BlbnNlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQge1xuICByZW5kZXJIb29rLFxuICBhY3QsXG4gIFJlbmRlckhvb2tSZXN1bHQsXG4gIHR5cGUgUmVuZGVySG9va09wdGlvbnMsXG59IGZyb20gJy4vcmVuZGVySG9vay5janMnO1xuaW1wb3J0IHsgSW50ZXJjZXB0b3IsIEZpeHR1cmUgfSBmcm9tICcuLi9maXh0dXJlVHlwZXMuanMnO1xuaW1wb3J0IHsgTW9ja0NvbnRyb2xsZXIgfSBmcm9tICcuLi9Nb2NrQ29udHJvbGxlci5qcyc7XG5pbXBvcnQgbW9ja0luaXRpYWxTdGF0ZSBmcm9tICcuLi9tb2NrU3RhdGUuanMnO1xuaW1wb3J0IHsgTW9ja1Byb3BzIH0gZnJvbSAnLi4vbW9ja1R5cGVzLmpzJztcblxuY29uc3QgYWN0aXZlQ2xlYW51cHMgPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG5cbmlmICh0eXBlb2YgYWZ0ZXJFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgZm9yIChjb25zdCBmbiBvZiBhY3RpdmVDbGVhbnVwcykgZm4oKTtcbiAgICBhY3RpdmVDbGVhbnVwcy5jbGVhcigpO1xuICB9KTtcbn1cblxuLyoqIEBzZWUgaHR0cHM6Ly9kYXRhY2xpZW50LmlvL2RvY3MvYXBpL21ha2VSZW5kZXJEYXRhSG9vayAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFrZVJlbmRlckRhdGFIb29rKFxuICBQcm92aWRlcjogUmVhY3QuQ29tcG9uZW50VHlwZTxEYXRhUHJvdmlkZXJQcm9wcz4sXG4pIHtcbiAgY29uc3QgcmVuZGVyRGF0YUNsaWVudDogUmVuZGVyRGF0YUhvb2sgPSAoPFAsIFIsIFQgPSBhbnk+KFxuICAgIGNhbGxiYWNrOiAocHJvcHM6IFApID0+IFIsXG4gICAge1xuICAgICAgaW5pdGlhbEZpeHR1cmVzLFxuICAgICAgcmVzb2x2ZXJGaXh0dXJlcyxcbiAgICAgIGdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEgPSAoKSA9PiAoe30pIGFzIGFueSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9OiB7XG4gICAgICBpbml0aWFsUHJvcHM/OiBQO1xuICAgICAgaW5pdGlhbEZpeHR1cmVzPzogRml4dHVyZVtdO1xuICAgICAgcmVzb2x2ZXJGaXh0dXJlcz86IChGaXh0dXJlIHwgSW50ZXJjZXB0b3I8VD4pW107XG4gICAgICBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhPzogKCkgPT4gVDtcbiAgICAgIHdyYXBwZXI/OiBSZWFjdC5Db21wb25lbnRUeXBlPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+PjtcbiAgICB9ICYgT21pdDxSZW5kZXJIb29rT3B0aW9uczxQPiwgJ2luaXRpYWxQcm9wcycgfCAnd3JhcHBlcic+ID0ge30gYXMgYW55LFxuICApOiBSZW5kZXJEYXRhSG9va1Jlc3VsdDxSLCBQPiA9PiB7XG4gICAgLyoqIFdyYXBzIGRpc3BhdGNoZXMgdGhhdCBhcmUgdHlwaWNhbGx5IGNhbGxlZCBkZWNsYXJhdGl2ZWx5IGluIGFjdCgpICovXG4gICAgY2xhc3MgQWN0Q29udHJvbGxlcjxcbiAgICAgIEQgZXh0ZW5kcyBHZW5lcmljRGlzcGF0Y2ggPSBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4gICAgICBUID0ge30sXG4gICAgPiBleHRlbmRzIE1vY2tDb250cm9sbGVyKFxuICAgICAgQ29udHJvbGxlcixcbiAgICAgIHJlc29sdmVyRml4dHVyZXMgP1xuICAgICAgICB7XG4gICAgICAgICAgZml4dHVyZXM6IHJlc29sdmVyRml4dHVyZXMsXG4gICAgICAgICAgZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSxcbiAgICAgICAgfVxuICAgICAgOiB7fSxcbiAgICApPEQ+IHtcbiAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBvcHRpb25zOiBNb2NrUHJvcHM8VD4gJiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIENvbnRyb2xsZXI8RD4+WzBdLFxuICAgICAgKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IHNldFJlc3BvbnNlLCByZXNvbHZlIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLnNldFJlc3BvbnNlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBsZXQgcHJvbWlzZTogYW55O1xuICAgICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gc2V0UmVzcG9uc2UuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZXNvbHZlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBsZXQgcHJvbWlzZTogYW55O1xuICAgICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gcmVzb2x2ZS5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdlIHdhbnQgZnJlc2ggbWFuYWdlciBzdGF0ZSBpbiBlYWNoIGluc3RhbmNlXG4gICAgY29uc3Qgbm0gPSBuZXcgTmV0d29ya01hbmFnZXIoKTtcbiAgICBjb25zdCBzbSA9IG5ldyBTdWJzY3JpcHRpb25NYW5hZ2VyKFBvbGxpbmdTdWJzY3JpcHRpb24pO1xuICAgIGNvbnN0IG1hbmFnZXJzID0gW25tLCBzbV07XG4gICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgIGFjdGl2ZUNsZWFudXBzLmRlbGV0ZShjbGVhbnVwKTtcbiAgICAgIG5tLmNsZWFudXBEYXRlID0gSW5maW5pdHk7XG4gICAgICBpZiAoKG5tIGFzIGFueSlbJ3JlamVjdG9ycyddKVxuICAgICAgICBPYmplY3QudmFsdWVzKChubSBhcyBhbnkpWydyZWplY3RvcnMnXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KS5mb3JFYWNoKFxuICAgICAgICAgIHJlaiA9PiB7XG4gICAgICAgICAgICByZWooKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgZWxzZSBpZiAobm1bJ2ZldGNoaW5nJ10pIG5tWydmZXRjaGluZyddLmZvckVhY2goKHsgcmVqZWN0IH0pID0+IHJlamVjdCgpKTtcbiAgICAgIG5tWydjbGVhckFsbCddKCk7XG4gICAgICBtYW5hZ2Vycy5mb3JFYWNoKG1hbmFnZXIgPT4gbWFuYWdlci5jbGVhbnVwKCkpO1xuICAgIH07XG4gICAgY29uc3QgYWxsU2V0dGxlZCA9ICgpID0+IHtcbiAgICAgIHJldHVybiBubS5hbGxTZXR0bGVkKCk7XG4gICAgfTtcbiAgICBhY3RpdmVDbGVhbnVwcy5hZGQoY2xlYW51cCk7XG4gICAgcmVuZGVyRGF0YUNsaWVudC5jbGVhbnVwID0gY2xlYW51cDtcbiAgICByZW5kZXJEYXRhQ2xpZW50LmFsbFNldHRsZWQgPSBhbGxTZXR0bGVkO1xuXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlOiBTdGF0ZTx1bmtub3duPiA9IG1vY2tJbml0aWFsU3RhdGUoaW5pdGlhbEZpeHR1cmVzKTtcblxuICAgIGNvbnN0IFByb3ZpZGVyV2l0aFJlc29sdmVyOiBSZWFjdC5Db21wb25lbnRUeXBlPGFueT4gPSBtZW1vKFxuICAgICAgZnVuY3Rpb24gUHJvdmlkZXJXaXRoUmVzb2x2ZXIoeyBjaGlsZHJlbiB9OiBSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjxQPikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxQcm92aWRlclxuICAgICAgICAgICAgaW5pdGlhbFN0YXRlPXtpbml0aWFsU3RhdGV9XG4gICAgICAgICAgICBDb250cm9sbGVyPXtBY3RDb250cm9sbGVyfVxuICAgICAgICAgICAgbWFuYWdlcnM9e21hbmFnZXJzfVxuICAgICAgICAgICAgZGV2QnV0dG9uPXtudWxsfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICA8L1Byb3ZpZGVyPlxuICAgICAgICApO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgV3JhcHBlcjogUmVhY3QuQ29tcG9uZW50VHlwZTxSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjxQPj4gfCB1bmRlZmluZWQgPVxuICAgICAgb3B0aW9ucz8ud3JhcHBlcjtcbiAgICBjb25zdCBQcm92aWRlcldpdGhXcmFwcGVyID1cbiAgICAgIFdyYXBwZXIgP1xuICAgICAgICBmdW5jdGlvbiBQcm92aWRlcldyYXBwZWQocHJvcHM6IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+KSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxQcm92aWRlcldpdGhSZXNvbHZlcj5cbiAgICAgICAgICAgICAgPFdyYXBwZXIgey4uLnByb3BzfSAvPlxuICAgICAgICAgICAgPC9Qcm92aWRlcldpdGhSZXNvbHZlcj5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICA6IFByb3ZpZGVyV2l0aFJlc29sdmVyO1xuXG4gICAgY29uc3Qgd3JhcHBlcjogUmVhY3QuQ29tcG9uZW50VHlwZTxhbnk+ID0gKHtcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgLi4ucHJvcHNcbiAgICB9OiBSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjxQPikgPT4gKFxuICAgICAgPFByb3ZpZGVyV2l0aFdyYXBwZXIgey4uLihwcm9wcyBhcyBhbnkpfT5cbiAgICAgICAgPFN1c3BlbnNlIGZhbGxiYWNrPXtudWxsfT57Y2hpbGRyZW59PC9TdXNwZW5zZT5cbiAgICAgIDwvUHJvdmlkZXJXaXRoV3JhcHBlcj5cbiAgICApO1xuXG4gICAgY29uc3QgcmV0OiBhbnkgPSByZW5kZXJIb29rKGNhbGxiYWNrLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgd3JhcHBlcixcbiAgICB9KTtcbiAgICByZXQuY29udHJvbGxlciA9IG5tWydjb250cm9sbGVyJ107XG4gICAgcmV0LmNsZWFudXAgPSBjbGVhbnVwO1xuICAgIHJldC5hbGxTZXR0bGVkID0gYWxsU2V0dGxlZDtcbiAgICByZXR1cm4gcmV0O1xuICB9KSBhcyBhbnk7XG4gIHJlbmRlckRhdGFDbGllbnQuY2xlYW51cCA9ICgpID0+IHt9O1xuICByZW5kZXJEYXRhQ2xpZW50LmFsbFNldHRsZWQgPSAoKSA9PiBQcm9taXNlLmFsbFNldHRsZWQoW10pO1xuICByZXR1cm4gcmVuZGVyRGF0YUNsaWVudDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVByb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBtYW5hZ2VyczogTWFuYWdlcltdO1xuICBpbml0aWFsU3RhdGU6IFN0YXRlPHVua25vd24+O1xuICBDb250cm9sbGVyOiB0eXBlb2YgQ29udHJvbGxlcjxhbnk+O1xuICBkZXZCdXR0b246IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgUmVuZGVyRGF0YUhvb2tSZXN1bHQ8UiwgUD4gPSBSZW5kZXJIb29rUmVzdWx0PFIsIFA+ICYge1xuICBjb250cm9sbGVyOiBDb250cm9sbGVyO1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICBhbGxTZXR0bGVkOiAoKSA9PiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W10+IHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgUmVuZGVyRGF0YUhvb2sgPSAoPFAsIFI+KFxuICBjYWxsYmFjazogKHByb3BzOiBQKSA9PiBSLFxuICBvcHRpb25zPzoge1xuICAgIGluaXRpYWxQcm9wcz86IFA7XG4gICAgaW5pdGlhbEZpeHR1cmVzPzogcmVhZG9ubHkgRml4dHVyZVtdO1xuICAgIHJlYWRvbmx5IHJlc29sdmVyRml4dHVyZXM/OiByZWFkb25seSAoRml4dHVyZSB8IEludGVyY2VwdG9yKVtdO1xuICAgIHdyYXBwZXI/OiBSZWFjdC5Db21wb25lbnRUeXBlPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+PjtcbiAgfSAmIE9taXQ8UmVuZGVySG9va09wdGlvbnM8UD4sICdpbml0aWFsUHJvcHMnIHwgJ3dyYXBwZXInPixcbikgPT4gUmVuZGVyRGF0YUhvb2tSZXN1bHQ8UiwgUD4pICYge1xuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHBlci1yZW5kZXIgY2xlYW51cCByZXR1cm5lZCBmcm9tIHJlbmRlckRhdGFDbGllbnQoKSBpbnN0ZWFkICovXG4gIGNsZWFudXA6ICgpID0+IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgcGVyLXJlbmRlciBhbGxTZXR0bGVkIHJldHVybmVkIGZyb20gcmVuZGVyRGF0YUNsaWVudCgpIGluc3RlYWQgKi9cbiAgYWxsU2V0dGxlZDogKCkgPT4gUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmtub3duPltdPiB8IHVuZGVmaW5lZDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBR0VBLG1CQUFtQixFQUNuQkMsY0FBYyxFQUNkQyxtQkFBbUIsRUFDbkJDLFVBQVUsUUFHTCxvQkFBb0I7QUFDM0IsT0FBT0MsS0FBSyxJQUFJQyxJQUFJLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBRTdDLFNBQ0VDLFVBQVUsRUFDVkMsR0FBRyxRQUdFLGtCQUFrQjtBQUV6QixTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELE9BQU9DLGdCQUFnQixNQUFNLGlCQUFpQjtBQUFDLFNBQUFDLEdBQUEsSUFBQUMsSUFBQTtBQUcvQyxNQUFNQyxjQUFjLEdBQUcsSUFBSUMsR0FBRyxDQUFhLENBQUM7QUFFNUMsSUFBSSxPQUFPQyxTQUFTLEtBQUssVUFBVSxFQUFFO0VBQ25DQSxTQUFTLENBQUMsTUFBTTtJQUNkLEtBQUssTUFBTUMsRUFBRSxJQUFJSCxjQUFjLEVBQUVHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDSCxjQUFjLENBQUNJLEtBQUssQ0FBQyxDQUFDO0VBQ3hC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