/ components / messages / UserToolResultMessage / UserToolErrorMessage.tsx
UserToolErrorMessage.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import { feature } from 'bun:bundle';
  3  import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs';
  4  import * as React from 'react';
  5  import { BULLET_OPERATOR } from '../../../constants/figures.js';
  6  import { Text } from '../../../ink.js';
  7  import { filterToolProgressMessages, type Tool, type Tools } from '../../../Tool.js';
  8  import type { ProgressMessage } from '../../../types/message.js';
  9  import { INTERRUPT_MESSAGE_FOR_TOOL_USE, isClassifierDenial, PLAN_REJECTION_PREFIX, REJECT_MESSAGE_WITH_REASON_PREFIX } from '../../../utils/messages.js';
 10  import { FallbackToolUseErrorMessage } from '../../FallbackToolUseErrorMessage.js';
 11  import { InterruptedByUser } from '../../InterruptedByUser.js';
 12  import { MessageResponse } from '../../MessageResponse.js';
 13  import { RejectedPlanMessage } from './RejectedPlanMessage.js';
 14  import { RejectedToolUseMessage } from './RejectedToolUseMessage.js';
 15  type Props = {
 16    progressMessagesForMessage: ProgressMessage[];
 17    tool?: Tool; // undefined when resuming an old conversation that uses an old tool
 18    tools: Tools;
 19    param: ToolResultBlockParam;
 20    verbose: boolean;
 21    isTranscriptMode?: boolean;
 22  };
 23  export function UserToolErrorMessage(t0) {
 24    const $ = _c(14);
 25    const {
 26      progressMessagesForMessage,
 27      tool,
 28      tools,
 29      param,
 30      verbose,
 31      isTranscriptMode
 32    } = t0;
 33    if (typeof param.content === "string" && param.content.includes(INTERRUPT_MESSAGE_FOR_TOOL_USE)) {
 34      let t1;
 35      if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
 36        t1 = <MessageResponse height={1}><InterruptedByUser /></MessageResponse>;
 37        $[0] = t1;
 38      } else {
 39        t1 = $[0];
 40      }
 41      return t1;
 42    }
 43    if (typeof param.content === "string" && param.content.startsWith(PLAN_REJECTION_PREFIX)) {
 44      let t1;
 45      if ($[1] !== param.content) {
 46        t1 = param.content.substring(PLAN_REJECTION_PREFIX.length);
 47        $[1] = param.content;
 48        $[2] = t1;
 49      } else {
 50        t1 = $[2];
 51      }
 52      const planContent = t1;
 53      let t2;
 54      if ($[3] !== planContent) {
 55        t2 = <RejectedPlanMessage plan={planContent} />;
 56        $[3] = planContent;
 57        $[4] = t2;
 58      } else {
 59        t2 = $[4];
 60      }
 61      return t2;
 62    }
 63    if (typeof param.content === "string" && param.content.startsWith(REJECT_MESSAGE_WITH_REASON_PREFIX)) {
 64      let t1;
 65      if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
 66        t1 = <RejectedToolUseMessage />;
 67        $[5] = t1;
 68      } else {
 69        t1 = $[5];
 70      }
 71      return t1;
 72    }
 73    if (feature("TRANSCRIPT_CLASSIFIER") && typeof param.content === "string" && isClassifierDenial(param.content)) {
 74      let t1;
 75      if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
 76        t1 = <MessageResponse height={1}><Text dimColor={true}>Denied by auto mode classifier {BULLET_OPERATOR} /feedback if incorrect</Text></MessageResponse>;
 77        $[6] = t1;
 78      } else {
 79        t1 = $[6];
 80      }
 81      return t1;
 82    }
 83    let t1;
 84    if ($[7] !== isTranscriptMode || $[8] !== param.content || $[9] !== progressMessagesForMessage || $[10] !== tool || $[11] !== tools || $[12] !== verbose) {
 85      t1 = tool?.renderToolUseErrorMessage?.(param.content, {
 86        progressMessagesForMessage: filterToolProgressMessages(progressMessagesForMessage),
 87        tools,
 88        verbose,
 89        isTranscriptMode
 90      }) ?? <FallbackToolUseErrorMessage result={param.content} verbose={verbose} />;
 91      $[7] = isTranscriptMode;
 92      $[8] = param.content;
 93      $[9] = progressMessagesForMessage;
 94      $[10] = tool;
 95      $[11] = tools;
 96      $[12] = verbose;
 97      $[13] = t1;
 98    } else {
 99      t1 = $[13];
100    }
101    return t1;
102  }
103  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiVG9vbFJlc3VsdEJsb2NrUGFyYW0iLCJSZWFjdCIsIkJVTExFVF9PUEVSQVRPUiIsIlRleHQiLCJmaWx0ZXJUb29sUHJvZ3Jlc3NNZXNzYWdlcyIsIlRvb2wiLCJUb29scyIsIlByb2dyZXNzTWVzc2FnZSIsIklOVEVSUlVQVF9NRVNTQUdFX0ZPUl9UT09MX1VTRSIsImlzQ2xhc3NpZmllckRlbmlhbCIsIlBMQU5fUkVKRUNUSU9OX1BSRUZJWCIsIlJFSkVDVF9NRVNTQUdFX1dJVEhfUkVBU09OX1BSRUZJWCIsIkZhbGxiYWNrVG9vbFVzZUVycm9yTWVzc2FnZSIsIkludGVycnVwdGVkQnlVc2VyIiwiTWVzc2FnZVJlc3BvbnNlIiwiUmVqZWN0ZWRQbGFuTWVzc2FnZSIsIlJlamVjdGVkVG9vbFVzZU1lc3NhZ2UiLCJQcm9wcyIsInByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlIiwidG9vbCIsInRvb2xzIiwicGFyYW0iLCJ2ZXJib3NlIiwiaXNUcmFuc2NyaXB0TW9kZSIsIlVzZXJUb29sRXJyb3JNZXNzYWdlIiwidDAiLCIkIiwiX2MiLCJjb250ZW50IiwiaW5jbHVkZXMiLCJ0MSIsIlN5bWJvbCIsImZvciIsInN0YXJ0c1dpdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJwbGFuQ29udGVudCIsInQyIiwicmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSJdLCJzb3VyY2VzIjpbIlVzZXJUb29sRXJyb3JNZXNzYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmZWF0dXJlIH0gZnJvbSAnYnVuOmJ1bmRsZSdcbmltcG9ydCB0eXBlIHsgVG9vbFJlc3VsdEJsb2NrUGFyYW0gfSBmcm9tICdAYW50aHJvcGljLWFpL3Nkay9yZXNvdXJjZXMvaW5kZXgubWpzJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCVUxMRVRfT1BFUkFUT1IgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvZmlndXJlcy5qcydcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuLi8uLi8uLi9pbmsuanMnXG5pbXBvcnQge1xuICBmaWx0ZXJUb29sUHJvZ3Jlc3NNZXNzYWdlcyxcbiAgdHlwZSBUb29sLFxuICB0eXBlIFRvb2xzLFxufSBmcm9tICcuLi8uLi8uLi9Ub29sLmpzJ1xuaW1wb3J0IHR5cGUgeyBQcm9ncmVzc01lc3NhZ2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9tZXNzYWdlLmpzJ1xuaW1wb3J0IHtcbiAgSU5URVJSVVBUX01FU1NBR0VfRk9SX1RPT0xfVVNFLFxuICBpc0NsYXNzaWZpZXJEZW5pYWwsXG4gIFBMQU5fUkVKRUNUSU9OX1BSRUZJWCxcbiAgUkVKRUNUX01FU1NBR0VfV0lUSF9SRUFTT05fUFJFRklYLFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9tZXNzYWdlcy5qcydcbmltcG9ydCB7IEZhbGxiYWNrVG9vbFVzZUVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL0ZhbGxiYWNrVG9vbFVzZUVycm9yTWVzc2FnZS5qcydcbmltcG9ydCB7IEludGVycnVwdGVkQnlVc2VyIH0gZnJvbSAnLi4vLi4vSW50ZXJydXB0ZWRCeVVzZXIuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9NZXNzYWdlUmVzcG9uc2UuanMnXG5pbXBvcnQgeyBSZWplY3RlZFBsYW5NZXNzYWdlIH0gZnJvbSAnLi9SZWplY3RlZFBsYW5NZXNzYWdlLmpzJ1xuaW1wb3J0IHsgUmVqZWN0ZWRUb29sVXNlTWVzc2FnZSB9IGZyb20gJy4vUmVqZWN0ZWRUb29sVXNlTWVzc2FnZS5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgcHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2U6IFByb2dyZXNzTWVzc2FnZVtdXG4gIHRvb2w/OiBUb29sIC8vIHVuZGVmaW5lZCB3aGVuIHJlc3VtaW5nIGFuIG9sZCBjb252ZXJzYXRpb24gdGhhdCB1c2VzIGFuIG9sZCB0b29sXG4gIHRvb2xzOiBUb29sc1xuICBwYXJhbTogVG9vbFJlc3VsdEJsb2NrUGFyYW1cbiAgdmVyYm9zZTogYm9vbGVhblxuICBpc1RyYW5zY3JpcHRNb2RlPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlclRvb2xFcnJvck1lc3NhZ2Uoe1xuICBwcm9ncmVzc01lc3NhZ2VzRm9yTWVzc2FnZSxcbiAgdG9vbCxcbiAgdG9vbHMsXG4gIHBhcmFtLFxuICB2ZXJib3NlLFxuICBpc1RyYW5zY3JpcHRNb2RlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBpZiAoXG4gICAgdHlwZW9mIHBhcmFtLmNvbnRlbnQgPT09ICdzdHJpbmcnICYmXG4gICAgcGFyYW0uY29udGVudC5pbmNsdWRlcyhJTlRFUlJVUFRfTUVTU0FHRV9GT1JfVE9PTF9VU0UpXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICA8TWVzc2FnZVJlc3BvbnNlIGhlaWdodD17MX0+XG4gICAgICAgIDxJbnRlcnJ1cHRlZEJ5VXNlciAvPlxuICAgICAgPC9NZXNzYWdlUmVzcG9uc2U+XG4gICAgKVxuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBwYXJhbS5jb250ZW50ID09PSAnc3RyaW5nJyAmJlxuICAgIHBhcmFtLmNvbnRlbnQuc3RhcnRzV2l0aChQTEFOX1JFSkVDVElPTl9QUkVGSVgpXG4gICkge1xuICAgIC8vIEV4dHJhY3QgdGhlIHBsYW4gY29udGVudCBmcm9tIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgY29uc3QgcGxhbkNvbnRlbnQgPSBwYXJhbS5jb250ZW50LnN1YnN0cmluZyhQTEFOX1JFSkVDVElPTl9QUkVGSVgubGVuZ3RoKVxuICAgIHJldHVybiA8UmVqZWN0ZWRQbGFuTWVzc2FnZSBwbGFuPXtwbGFuQ29udGVudH0gLz5cbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgcGFyYW0uY29udGVudCA9PT0gJ3N0cmluZycgJiZcbiAgICBwYXJhbS5jb250ZW50LnN0YXJ0c1dpdGgoUkVKRUNUX01FU1NBR0VfV0lUSF9SRUFTT05fUFJFRklYKVxuICApIHtcbiAgICByZXR1cm4gPFJlamVjdGVkVG9vbFVzZU1lc3NhZ2UgLz5cbiAgfVxuXG4gIGlmIChcbiAgICBmZWF0dXJlKCdUUkFOU0NSSVBUX0NMQVNTSUZJRVInKSAmJlxuICAgIHR5cGVvZiBwYXJhbS5jb250ZW50ID09PSAnc3RyaW5nJyAmJlxuICAgIGlzQ2xhc3NpZmllckRlbmlhbChwYXJhbS5jb250ZW50KVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPE1lc3NhZ2VSZXNwb25zZSBoZWlnaHQ9ezF9PlxuICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICBEZW5pZWQgYnkgYXV0byBtb2RlIGNsYXNzaWZpZXIge0JVTExFVF9PUEVSQVRPUn0gL2ZlZWRiYWNrIGlmXG4gICAgICAgICAgaW5jb3JyZWN0XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgdG9vbD8ucmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZT8uKHBhcmFtLmNvbnRlbnQsIHtcbiAgICAgIHByb2dyZXNzTWVzc2FnZXNGb3JNZXNzYWdlOiBmaWx0ZXJUb29sUHJvZ3Jlc3NNZXNzYWdlcyhcbiAgICAgICAgcHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2UsXG4gICAgICApLFxuICAgICAgdG9vbHMsXG4gICAgICB2ZXJib3NlLFxuICAgICAgaXNUcmFuc2NyaXB0TW9kZSxcbiAgICB9KSA/PyAoXG4gICAgICA8RmFsbGJhY2tUb29sVXNlRXJyb3JNZXNzYWdlIHJlc3VsdD17cGFyYW0uY29udGVudH0gdmVyYm9zZT17dmVyYm9zZX0gLz5cbiAgICApXG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVNBLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLGNBQWNDLG9CQUFvQixRQUFRLHVDQUF1QztBQUNqRixPQUFPLEtBQUtDLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLGVBQWUsUUFBUSwrQkFBK0I7QUFDL0QsU0FBU0MsSUFBSSxRQUFRLGlCQUFpQjtBQUN0QyxTQUNFQywwQkFBMEIsRUFDMUIsS0FBS0MsSUFBSSxFQUNULEtBQUtDLEtBQUssUUFDTCxrQkFBa0I7QUFDekIsY0FBY0MsZUFBZSxRQUFRLDJCQUEyQjtBQUNoRSxTQUNFQyw4QkFBOEIsRUFDOUJDLGtCQUFrQixFQUNsQkMscUJBQXFCLEVBQ3JCQyxpQ0FBaUMsUUFDNUIsNEJBQTRCO0FBQ25DLFNBQVNDLDJCQUEyQixRQUFRLHNDQUFzQztBQUNsRixTQUFTQyxpQkFBaUIsUUFBUSw0QkFBNEI7QUFDOUQsU0FBU0MsZUFBZSxRQUFRLDBCQUEwQjtBQUMxRCxTQUFTQyxtQkFBbUIsUUFBUSwwQkFBMEI7QUFDOUQsU0FBU0Msc0JBQXNCLFFBQVEsNkJBQTZCO0FBRXBFLEtBQUtDLEtBQUssR0FBRztFQUNYQywwQkFBMEIsRUFBRVgsZUFBZSxFQUFFO0VBQzdDWSxJQUFJLENBQUMsRUFBRWQsSUFBSSxFQUFDO0VBQ1plLEtBQUssRUFBRWQsS0FBSztFQUNaZSxLQUFLLEVBQUVyQixvQkFBb0I7RUFDM0JzQixPQUFPLEVBQUUsT0FBTztFQUNoQkMsZ0JBQWdCLENBQUMsRUFBRSxPQUFPO0FBQzVCLENBQUM7QUFFRCxPQUFPLFNBQUFDLHFCQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQThCO0lBQUFULDBCQUFBO0lBQUFDLElBQUE7SUFBQUMsS0FBQTtJQUFBQyxLQUFBO0lBQUFDLE9BQUE7SUFBQUM7RUFBQSxJQUFBRSxFQU83QjtFQUNOLElBQ0UsT0FBT0osS0FBSyxDQUFBTyxPQUFRLEtBQUssUUFDNkIsSUFBdERQLEtBQUssQ0FBQU8sT0FBUSxDQUFBQyxRQUFTLENBQUNyQiw4QkFBOEIsQ0FBQztJQUFBLElBQUFzQixFQUFBO0lBQUEsSUFBQUosQ0FBQSxRQUFBSyxNQUFBLENBQUFDLEdBQUE7TUFHcERGLEVBQUEsSUFBQyxlQUFlLENBQVMsTUFBQyxDQUFELEdBQUMsQ0FDeEIsQ0FBQyxpQkFBaUIsR0FDcEIsRUFGQyxlQUFlLENBRUU7TUFBQUosQ0FBQSxNQUFBSSxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBSixDQUFBO0lBQUE7SUFBQSxPQUZsQkksRUFFa0I7RUFBQTtFQUl0QixJQUNFLE9BQU9ULEtBQUssQ0FBQU8sT0FBUSxLQUFLLFFBQ3NCLElBQS9DUCxLQUFLLENBQUFPLE9BQVEsQ0FBQUssVUFBVyxDQUFDdkIscUJBQXFCLENBQUM7SUFBQSxJQUFBb0IsRUFBQTtJQUFBLElBQUFKLENBQUEsUUFBQUwsS0FBQSxDQUFBTyxPQUFBO01BRzNCRSxFQUFBLEdBQUFULEtBQUssQ0FBQU8sT0FBUSxDQUFBTSxTQUFVLENBQUN4QixxQkFBcUIsQ0FBQXlCLE1BQU8sQ0FBQztNQUFBVCxDQUFBLE1BQUFMLEtBQUEsQ0FBQU8sT0FBQTtNQUFBRixDQUFBLE1BQUFJLEVBQUE7SUFBQTtNQUFBQSxFQUFBLEdBQUFKLENBQUE7SUFBQTtJQUF6RSxNQUFBVSxXQUFBLEdBQW9CTixFQUFxRDtJQUFBLElBQUFPLEVBQUE7SUFBQSxJQUFBWCxDQUFBLFFBQUFVLFdBQUE7TUFDbEVDLEVBQUEsSUFBQyxtQkFBbUIsQ0FBT0QsSUFBVyxDQUFYQSxZQUFVLENBQUMsR0FBSTtNQUFBVixDQUFBLE1BQUFVLFdBQUE7TUFBQVYsQ0FBQSxNQUFBVyxFQUFBO0lBQUE7TUFBQUEsRUFBQSxHQUFBWCxDQUFBO0lBQUE7SUFBQSxPQUExQ1csRUFBMEM7RUFBQTtFQUduRCxJQUNFLE9BQU9oQixLQUFLLENBQUFPLE9BQVEsS0FBSyxRQUNrQyxJQUEzRFAsS0FBSyxDQUFBTyxPQUFRLENBQUFLLFVBQVcsQ0FBQ3RCLGlDQUFpQyxDQUFDO0lBQUEsSUFBQW1CLEVBQUE7SUFBQSxJQUFBSixDQUFBLFFBQUFLLE1BQUEsQ0FBQUMsR0FBQTtNQUVwREYsRUFBQSxJQUFDLHNCQUFzQixHQUFHO01BQUFKLENBQUEsTUFBQUksRUFBQTtJQUFBO01BQUFBLEVBQUEsR0FBQUosQ0FBQTtJQUFBO0lBQUEsT0FBMUJJLEVBQTBCO0VBQUE7RUFHbkMsSUFDRS9CLE9BQU8sQ0FBQyx1QkFDd0IsQ0FBQyxJQUFqQyxPQUFPc0IsS0FBSyxDQUFBTyxPQUFRLEtBQUssUUFDUSxJQUFqQ25CLGtCQUFrQixDQUFDWSxLQUFLLENBQUFPLE9BQVEsQ0FBQztJQUFBLElBQUFFLEVBQUE7SUFBQSxJQUFBSixDQUFBLFFBQUFLLE1BQUEsQ0FBQUMsR0FBQTtNQUcvQkYsRUFBQSxJQUFDLGVBQWUsQ0FBUyxNQUFDLENBQUQsR0FBQyxDQUN4QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQVIsS0FBTyxDQUFDLENBQUMsK0JBQ21CNUIsZ0JBQWMsQ0FBRSx1QkFFbEQsRUFIQyxJQUFJLENBSVAsRUFMQyxlQUFlLENBS0U7TUFBQXdCLENBQUEsTUFBQUksRUFBQTtJQUFBO01BQUFBLEVBQUEsR0FBQUosQ0FBQTtJQUFBO0lBQUEsT0FMbEJJLEVBS2tCO0VBQUE7RUFFckIsSUFBQUEsRUFBQTtFQUFBLElBQUFKLENBQUEsUUFBQUgsZ0JBQUEsSUFBQUcsQ0FBQSxRQUFBTCxLQUFBLENBQUFPLE9BQUEsSUFBQUYsQ0FBQSxRQUFBUiwwQkFBQSxJQUFBUSxDQUFBLFNBQUFQLElBQUEsSUFBQU8sQ0FBQSxTQUFBTixLQUFBLElBQUFNLENBQUEsU0FBQUosT0FBQTtJQUdDUSxFQUFBLEdBQUFYLElBQUksRUFBQW1CLHlCQU9GLEdBUGdDakIsS0FBSyxDQUFBTyxPQUFRLEVBQUU7TUFBQVYsMEJBQUEsRUFDbkJkLDBCQUEwQixDQUNwRGMsMEJBQ0YsQ0FBQztNQUFBRSxLQUFBO01BQUFFLE9BQUE7TUFBQUM7SUFJSCxDQUVBLENBQUMsSUFEQyxDQUFDLDJCQUEyQixDQUFTLE1BQWEsQ0FBYixDQUFBRixLQUFLLENBQUFPLE9BQU8sQ0FBQyxDQUFXTixPQUFPLENBQVBBLFFBQU0sQ0FBQyxHQUNyRTtJQUFBSSxDQUFBLE1BQUFILGdCQUFBO0lBQUFHLENBQUEsTUFBQUwsS0FBQSxDQUFBTyxPQUFBO0lBQUFGLENBQUEsTUFBQVIsMEJBQUE7SUFBQVEsQ0FBQSxPQUFBUCxJQUFBO0lBQUFPLENBQUEsT0FBQU4sS0FBQTtJQUFBTSxDQUFBLE9BQUFKLE9BQUE7SUFBQUksQ0FBQSxPQUFBSSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBSixDQUFBO0VBQUE7RUFBQSxPQVRESSxFQVNDO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=