UNPKG

@data-client/core

Version:

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

163 lines (160 loc) 21.8 kB
var _DevToolsManager; import createReducer from '../state/reducer/createReducer.js'; let DEFAULT_CONFIG = {}; if (process.env.NODE_ENV !== 'production') { var _globalThis$document; const extraEndpointKeys = ['dataExpiryLength', 'errorExpiryLength', 'errorPolicy', 'invalidIfStale', 'pollFrequency', 'getOptimisticResponse', 'update']; function serializeEndpoint(endpoint) { var _toJSON, _endpoint$schema; const serial = { name: endpoint.name, schema: (_toJSON = (_endpoint$schema = endpoint.schema) == null || _endpoint$schema.toJSON == null ? void 0 : _endpoint$schema.toJSON()) != null ? _toJSON : endpoint.schema, sideEffect: endpoint.sideEffect }; extraEndpointKeys.forEach(key => { if (key in endpoint) serial[key] = endpoint[key]; }); return serial; } const HASINTL = typeof Intl !== 'undefined'; DEFAULT_CONFIG = { name: `Data Client: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`, autoPause: true, features: { pause: true, // start/pause recording of dispatched actions lock: true, // lock/unlock dispatching actions and side effects persist: false, // persist states on page reloading export: true, // export history of actions in a file import: 'custom', // import history of actions from a file jump: true, // jump back and forth (time travelling) skip: true, // skip (cancel) actions reorder: true, // drag and drop actions in the history list dispatch: false, // dispatch custom actions or action creators test: false // generate tests for the selected actions }, actionSanitizer: action => { if (!('endpoint' in action)) return action; return { ...action, endpoint: serializeEndpoint(action.endpoint) }; }, serialize: { options: undefined, /* istanbul ignore next */ replacer: HASINTL ? (key, value) => { if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) { return Intl.DateTimeFormat('en-US', { hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3 }).format(value); } return value; } : undefined } }; } /** Integrates with https://github.com/reduxjs/redux-devtools * * Options: https://github.com/reduxjs/redux-devtools/blob/main/extension/docs/API/Arguments.md * * @see https://dataclient.io/docs/api/DevToolsManager */ export default class DevToolsManager { constructor(config, skipLogging) { this.started = false; this.actions = []; this.maxBufferLength = 100; /* istanbul ignore next */ this.devTools = typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__.connect({ ...DEFAULT_CONFIG, ...config }); // we cut it in half so we should double so we don't lose if (config != null && config.maxAge) this.maxBufferLength = config.maxAge * 2; if (skipLogging) this.skipLogging = skipLogging; } handleAction(action, state) { if (this.started) { this.devTools.send(action, state); } else { // avoid this getting too big in case this is long running // we cut in half so we aren't constantly reallocating if (this.actions.length > this.maxBufferLength) this.actions = this.actions.slice(this.maxBufferLength / 2); // queue actions this.actions.push([action, state]); } } /** Called when initial state is ready */ init(state) { if (process.env.NODE_ENV !== 'production' && this.devTools) { this.devTools.init(state); this.devTools.subscribe(msg => { switch (msg.type) { case 'START': this.started = true; if (this.actions.length) { this.actions.forEach(([action, state]) => { this.handleAction(action, state); }); this.actions = []; } break; case 'STOP': this.started = false; break; case 'DISPATCH': if (msg.payload.type === 'RESET') { this.controller.resetEntireStore(); } break; } }); } } /** Ensures all subscriptions are cleaned up. */ cleanup() {} } _DevToolsManager = DevToolsManager; (() => { /* istanbul ignore if */ /* istanbul ignore next */ if (process.env.NODE_ENV !== 'production') { _DevToolsManager.prototype.middleware = function (controller) { if (!this.devTools) return next => action => next(action); this.controller = controller; const reducer = createReducer(controller); let state = controller.getState(); return next => action => { var _this$skipLogging; const shouldSkip = (_this$skipLogging = this.skipLogging) == null ? void 0 : _this$skipLogging.call(this, action); const ret = next(action); if (this.started) { // we track state changes here since getState() will only update after a batch commit state = reducer(state, action); } else { state = controller.getState(); } ret.then(() => { if (shouldSkip) return; this.handleAction(action, state.optimistic.reduce(reducer, state)); }); return ret; }; }; } else { _DevToolsManager.prototype.middleware = () => next => action => next(action); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiREVGQVVMVF9DT05GSUciLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImV4dHJhRW5kcG9pbnRLZXlzIiwic2VyaWFsaXplRW5kcG9pbnQiLCJlbmRwb2ludCIsIl90b0pTT04iLCJfZW5kcG9pbnQkc2NoZW1hIiwic2VyaWFsIiwibmFtZSIsInNjaGVtYSIsInRvSlNPTiIsInNpZGVFZmZlY3QiLCJmb3JFYWNoIiwia2V5IiwiSEFTSU5UTCIsIkludGwiLCJnbG9iYWxUaGlzIiwiZG9jdW1lbnQiLCJ0aXRsZSIsImF1dG9QYXVzZSIsImZlYXR1cmVzIiwicGF1c2UiLCJsb2NrIiwicGVyc2lzdCIsImV4cG9ydCIsImltcG9ydCIsImp1bXAiLCJza2lwIiwicmVvcmRlciIsImRpc3BhdGNoIiwidGVzdCIsImFjdGlvblNhbml0aXplciIsImFjdGlvbiIsInNlcmlhbGl6ZSIsIm9wdGlvbnMiLCJ1bmRlZmluZWQiLCJyZXBsYWNlciIsInZhbHVlIiwiaXNGaW5pdGUiLCJlbmRzV2l0aCIsIkRhdGVUaW1lRm9ybWF0IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsImZyYWN0aW9uYWxTZWNvbmREaWdpdHMiLCJmb3JtYXQiLCJEZXZUb29sc01hbmFnZXIiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInNraXBMb2dnaW5nIiwic3RhcnRlZCIsImFjdGlvbnMiLCJtYXhCdWZmZXJMZW5ndGgiLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0IiwibWF4QWdlIiwiaGFuZGxlQWN0aW9uIiwic3RhdGUiLCJzZW5kIiwibGVuZ3RoIiwic2xpY2UiLCJwdXNoIiwiaW5pdCIsInN1YnNjcmliZSIsIm1zZyIsInR5cGUiLCJwYXlsb2FkIiwiY29udHJvbGxlciIsInJlc2V0RW50aXJlU3RvcmUiLCJjbGVhbnVwIiwiX0RldlRvb2xzTWFuYWdlciIsInByb3RvdHlwZSIsIm1pZGRsZXdhcmUiLCJuZXh0IiwicmVkdWNlciIsImdldFN0YXRlIiwiX3RoaXMkc2tpcExvZ2dpbmciLCJzaG91bGRTa2lwIiwiY2FsbCIsInJldCIsInRoZW4iLCJvcHRpbWlzdGljIiwicmVkdWNlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hbmFnZXIvRGV2dG9vbHNNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGV2VG9vbHNDb25maWcgfSBmcm9tICcuL2RldnRvb2xzVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sbGVyLCBFbmRwb2ludEludGVyZmFjZSB9IGZyb20gJy4uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgTWlkZGxld2FyZSB9IGZyb20gJy4uL21pZGRsZXdhcmVUeXBlcy5qcyc7XG5pbXBvcnQgY3JlYXRlUmVkdWNlciBmcm9tICcuLi9zdGF0ZS9yZWR1Y2VyL2NyZWF0ZVJlZHVjZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VyLCBTdGF0ZSwgQWN0aW9uVHlwZXMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRGV2VG9vbHNDb25maWcgfTtcblxubGV0IERFRkFVTFRfQ09ORklHID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGNvbnN0IGV4dHJhRW5kcG9pbnRLZXlzID0gW1xuICAgICdkYXRhRXhwaXJ5TGVuZ3RoJyxcbiAgICAnZXJyb3JFeHBpcnlMZW5ndGgnLFxuICAgICdlcnJvclBvbGljeScsXG4gICAgJ2ludmFsaWRJZlN0YWxlJyxcbiAgICAncG9sbEZyZXF1ZW5jeScsXG4gICAgJ2dldE9wdGltaXN0aWNSZXNwb25zZScsXG4gICAgJ3VwZGF0ZScsXG4gIF07XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplRW5kcG9pbnQoZW5kcG9pbnQ6IEVuZHBvaW50SW50ZXJmYWNlKSB7XG4gICAgY29uc3Qgc2VyaWFsOiBhbnkgPSB7XG4gICAgICBuYW1lOiBlbmRwb2ludC5uYW1lLFxuICAgICAgc2NoZW1hOiAoZW5kcG9pbnQuc2NoZW1hIGFzIGFueSk/LnRvSlNPTj8uKCkgPz8gZW5kcG9pbnQuc2NoZW1hLFxuICAgICAgc2lkZUVmZmVjdDogZW5kcG9pbnQuc2lkZUVmZmVjdCxcbiAgICB9O1xuICAgIGV4dHJhRW5kcG9pbnRLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgaW4gZW5kcG9pbnQpXG4gICAgICAgIHNlcmlhbFtrZXldID0gZW5kcG9pbnRba2V5IGFzIGtleW9mIEVuZHBvaW50SW50ZXJmYWNlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VyaWFsO1xuICB9XG5cbiAgY29uc3QgSEFTSU5UTCA9IHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJztcbiAgREVGQVVMVF9DT05GSUcgPSB7XG4gICAgbmFtZTogYERhdGEgQ2xpZW50OiAke2dsb2JhbFRoaXMuZG9jdW1lbnQ/LnRpdGxlfWAsXG4gICAgYXV0b1BhdXNlOiB0cnVlLFxuICAgIGZlYXR1cmVzOiB7XG4gICAgICBwYXVzZTogdHJ1ZSwgLy8gc3RhcnQvcGF1c2UgcmVjb3JkaW5nIG9mIGRpc3BhdGNoZWQgYWN0aW9uc1xuICAgICAgbG9jazogdHJ1ZSwgLy8gbG9jay91bmxvY2sgZGlzcGF0Y2hpbmcgYWN0aW9ucyBhbmQgc2lkZSBlZmZlY3RzXG4gICAgICBwZXJzaXN0OiBmYWxzZSwgLy8gcGVyc2lzdCBzdGF0ZXMgb24gcGFnZSByZWxvYWRpbmdcbiAgICAgIGV4cG9ydDogdHJ1ZSwgLy8gZXhwb3J0IGhpc3Rvcnkgb2YgYWN0aW9ucyBpbiBhIGZpbGVcbiAgICAgIGltcG9ydDogJ2N1c3RvbScsIC8vIGltcG9ydCBoaXN0b3J5IG9mIGFjdGlvbnMgZnJvbSBhIGZpbGVcbiAgICAgIGp1bXA6IHRydWUsIC8vIGp1bXAgYmFjayBhbmQgZm9ydGggKHRpbWUgdHJhdmVsbGluZylcbiAgICAgIHNraXA6IHRydWUsIC8vIHNraXAgKGNhbmNlbCkgYWN0aW9uc1xuICAgICAgcmVvcmRlcjogdHJ1ZSwgLy8gZHJhZyBhbmQgZHJvcCBhY3Rpb25zIGluIHRoZSBoaXN0b3J5IGxpc3RcbiAgICAgIGRpc3BhdGNoOiBmYWxzZSwgLy8gZGlzcGF0Y2ggY3VzdG9tIGFjdGlvbnMgb3IgYWN0aW9uIGNyZWF0b3JzXG4gICAgICB0ZXN0OiBmYWxzZSwgLy8gZ2VuZXJhdGUgdGVzdHMgZm9yIHRoZSBzZWxlY3RlZCBhY3Rpb25zXG4gICAgfSxcbiAgICBhY3Rpb25TYW5pdGl6ZXI6IChhY3Rpb246IEFjdGlvblR5cGVzKSA9PiB7XG4gICAgICBpZiAoISgnZW5kcG9pbnQnIGluIGFjdGlvbikpIHJldHVybiBhY3Rpb247XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgIGVuZHBvaW50OiBzZXJpYWxpemVFbmRwb2ludChhY3Rpb24uZW5kcG9pbnQpLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZToge1xuICAgICAgb3B0aW9uczogdW5kZWZpbmVkLFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJlcGxhY2VyOlxuICAgICAgICBIQVNJTlRMID9cbiAgICAgICAgICAoa2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgICAgICAgICAgIChrZXkgPT09ICdkYXRlJyB8fCBrZXkuZW5kc1dpdGgoJ0F0JykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLFxuICAgICAgICAgICAgICB9KS5mb3JtYXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEludGVncmF0ZXMgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vcmVkdXhqcy9yZWR1eC1kZXZ0b29sc1xuICpcbiAqIE9wdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzL2Jsb2IvbWFpbi9leHRlbnNpb24vZG9jcy9BUEkvQXJndW1lbnRzLm1kXG4gKlxuICogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvRGV2VG9vbHNNYW5hZ2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERldlRvb2xzTWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXIge1xuICBkZWNsYXJlIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU7XG4gIGRlY2xhcmUgcHJvdGVjdGVkIGRldlRvb2xzOiB1bmRlZmluZWQgfCBhbnk7XG4gIHByb3RlY3RlZCBzdGFydGVkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBhY3Rpb25zOiBbQWN0aW9uVHlwZXMsIFN0YXRlPHVua25vd24+XVtdID0gW107XG4gIGRlY2xhcmUgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIGRlY2xhcmUgc2tpcExvZ2dpbmc/OiAoYWN0aW9uOiBBY3Rpb25UeXBlcykgPT4gYm9vbGVhbjtcbiAgbWF4QnVmZmVyTGVuZ3RoID0gMTAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZz86IERldlRvb2xzQ29uZmlnLFxuICAgIHNraXBMb2dnaW5nPzogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IGJvb2xlYW4sXG4gICkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhpcy5kZXZUb29scyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gJiZcbiAgICAgICh3aW5kb3cgYXMgYW55KS5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fLmNvbm5lY3Qoe1xuICAgICAgICAuLi5ERUZBVUxUX0NPTkZJRyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSk7XG4gICAgLy8gd2UgY3V0IGl0IGluIGhhbGYgc28gd2Ugc2hvdWxkIGRvdWJsZSBzbyB3ZSBkb24ndCBsb3NlXG4gICAgaWYgKGNvbmZpZz8ubWF4QWdlKSB0aGlzLm1heEJ1ZmZlckxlbmd0aCA9IGNvbmZpZy5tYXhBZ2UgKiAyO1xuICAgIGlmIChza2lwTG9nZ2luZykgdGhpcy5za2lwTG9nZ2luZyA9IHNraXBMb2dnaW5nO1xuICB9XG5cbiAgc3RhdGljIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0aGlzLnByb3RvdHlwZS5taWRkbGV3YXJlID0gZnVuY3Rpb24gKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRldlRvb2xzKSByZXR1cm4gbmV4dCA9PiBhY3Rpb24gPT4gbmV4dChhY3Rpb24pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIG5leHQgPT4gYWN0aW9uID0+IHtcbiAgICAgICAgICBjb25zdCBzaG91bGRTa2lwID0gdGhpcy5za2lwTG9nZ2luZz8uKGFjdGlvbik7XG4gICAgICAgICAgY29uc3QgcmV0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIC8vIHdlIHRyYWNrIHN0YXRlIGNoYW5nZXMgaGVyZSBzaW5jZSBnZXRTdGF0ZSgpIHdpbGwgb25seSB1cGRhdGUgYWZ0ZXIgYSBiYXRjaCBjb21taXRcbiAgICAgICAgICAgIHN0YXRlID0gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUgPSBjb250cm9sbGVyLmdldFN0YXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzaG91bGRTa2lwKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFjdGlvbihhY3Rpb24sIHN0YXRlLm9wdGltaXN0aWMucmVkdWNlKHJlZHVjZXIsIHN0YXRlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvdG90eXBlLm1pZGRsZXdhcmUgPSAoKSA9PiBuZXh0ID0+IGFjdGlvbiA9PiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQWN0aW9uKGFjdGlvbjogYW55LCBzdGF0ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgdGhpcy5kZXZUb29scy5zZW5kKGFjdGlvbiwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdm9pZCB0aGlzIGdldHRpbmcgdG9vIGJpZyBpbiBjYXNlIHRoaXMgaXMgbG9uZyBydW5uaW5nXG4gICAgICAvLyB3ZSBjdXQgaW4gaGFsZiBzbyB3ZSBhcmVuJ3QgY29uc3RhbnRseSByZWFsbG9jYXRpbmdcbiAgICAgIGlmICh0aGlzLmFjdGlvbnMubGVuZ3RoID4gdGhpcy5tYXhCdWZmZXJMZW5ndGgpXG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5zbGljZSh0aGlzLm1heEJ1ZmZlckxlbmd0aCAvIDIpO1xuICAgICAgLy8gcXVldWUgYWN0aW9uc1xuICAgICAgdGhpcy5hY3Rpb25zLnB1c2goW2FjdGlvbiwgc3RhdGVdKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gaW5pdGlhbCBzdGF0ZSBpcyByZWFkeSAqL1xuICBpbml0KHN0YXRlOiBTdGF0ZTxhbnk+KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5kZXZUb29scykge1xuICAgICAgdGhpcy5kZXZUb29scy5pbml0KHN0YXRlKTtcbiAgICAgIHRoaXMuZGV2VG9vbHMuc3Vic2NyaWJlKChtc2c6IGFueSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnU1RBUlQnOlxuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmZvckVhY2goKFthY3Rpb24sIHN0YXRlXSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uKGFjdGlvbiwgc3RhdGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdTVE9QJzpcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnRElTUEFUQ0gnOlxuICAgICAgICAgICAgaWYgKG1zZy5wYXlsb2FkLnR5cGUgPT09ICdSRVNFVCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnJlc2V0RW50aXJlU3RvcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgc3Vic2NyaXB0aW9ucyBhcmUgY2xlYW5lZCB1cC4gKi9cbiAgY2xlYW51cCgpIHt9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFHQSxPQUFPQSxhQUFhLE1BQU0sbUNBQW1DO0FBSzdELElBQUlDLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFFdkIsSUFBSUMsT0FBTyxDQUFDQyxHQUFHLENBQUNDLFFBQVEsS0FBSyxZQUFZLEVBQUU7RUFBQSxJQUFBQyxvQkFBQTtFQUN6QyxNQUFNQyxpQkFBaUIsR0FBRyxDQUN4QixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixRQUFRLENBQ1Q7RUFFRCxTQUFTQyxpQkFBaUJBLENBQUNDLFFBQTJCLEVBQUU7SUFBQSxJQUFBQyxPQUFBLEVBQUFDLGdCQUFBO0lBQ3RELE1BQU1DLE1BQVcsR0FBRztNQUNsQkMsSUFBSSxFQUFFSixRQUFRLENBQUNJLElBQUk7TUFDbkJDLE1BQU0sR0FBQUosT0FBQSxJQUFBQyxnQkFBQSxHQUFHRixRQUFRLENBQUNLLE1BQU0sYUFBaEJILGdCQUFBLENBQTBCSSxNQUFNLG9CQUFoQ0osZ0JBQUEsQ0FBMEJJLE1BQU0sQ0FBRyxDQUFDLFlBQUFMLE9BQUEsR0FBSUQsUUFBUSxDQUFDSyxNQUFNO01BQy9ERSxVQUFVLEVBQUVQLFFBQVEsQ0FBQ087SUFDdkIsQ0FBQztJQUNEVCxpQkFBaUIsQ0FBQ1UsT0FBTyxDQUFDQyxHQUFHLElBQUk7TUFDL0IsSUFBSUEsR0FBRyxJQUFJVCxRQUFRLEVB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