/* eslint-disable */
import Long from "long";
import type { CallContext, CallOptions } from "nice-grpc-common";
import _m0 from "protobufjs/minimal.js";
import {
  InstrumentType,
  instrumentTypeFromJSON,
  instrumentTypeToJSON,
  MoneyValue,
  Ping,
  PingDelaySettings,
  Quotation,
} from "./common.js";
import { Timestamp } from "./google/protobuf/timestamp.js";

export const protobufPackage = "tinkoff.public.invest.api.contract.v1";

/** Статус запрашиваемых операций. */
export enum OperationState {
  /** OPERATION_STATE_UNSPECIFIED - Статус операции не определен. */
  OPERATION_STATE_UNSPECIFIED = 0,
  /** OPERATION_STATE_EXECUTED - Исполнена частично или полностью. */
  OPERATION_STATE_EXECUTED = 1,
  /** OPERATION_STATE_CANCELED - Отменена. */
  OPERATION_STATE_CANCELED = 2,
  /** OPERATION_STATE_PROGRESS - Исполняется. */
  OPERATION_STATE_PROGRESS = 3,
  UNRECOGNIZED = -1,
}

export function operationStateFromJSON(object: any): OperationState {
  switch (object) {
    case 0:
    case "OPERATION_STATE_UNSPECIFIED":
      return OperationState.OPERATION_STATE_UNSPECIFIED;
    case 1:
    case "OPERATION_STATE_EXECUTED":
      return OperationState.OPERATION_STATE_EXECUTED;
    case 2:
    case "OPERATION_STATE_CANCELED":
      return OperationState.OPERATION_STATE_CANCELED;
    case 3:
    case "OPERATION_STATE_PROGRESS":
      return OperationState.OPERATION_STATE_PROGRESS;
    case -1:
    case "UNRECOGNIZED":
    default:
      return OperationState.UNRECOGNIZED;
  }
}

export function operationStateToJSON(object: OperationState): string {
  switch (object) {
    case OperationState.OPERATION_STATE_UNSPECIFIED:
      return "OPERATION_STATE_UNSPECIFIED";
    case OperationState.OPERATION_STATE_EXECUTED:
      return "OPERATION_STATE_EXECUTED";
    case OperationState.OPERATION_STATE_CANCELED:
      return "OPERATION_STATE_CANCELED";
    case OperationState.OPERATION_STATE_PROGRESS:
      return "OPERATION_STATE_PROGRESS";
    case OperationState.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

/** Тип операции. */
export enum OperationType {
  /** OPERATION_TYPE_UNSPECIFIED - Тип операции не определен. */
  OPERATION_TYPE_UNSPECIFIED = 0,
  /** OPERATION_TYPE_INPUT - Пополнение брокерского счета. */
  OPERATION_TYPE_INPUT = 1,
  /** OPERATION_TYPE_BOND_TAX - Удержание НДФЛ по купонам. */
  OPERATION_TYPE_BOND_TAX = 2,
  /** OPERATION_TYPE_OUTPUT_SECURITIES - Вывод ЦБ. */
  OPERATION_TYPE_OUTPUT_SECURITIES = 3,
  /** OPERATION_TYPE_OVERNIGHT - Доход по сделке РЕПО овернайт. */
  OPERATION_TYPE_OVERNIGHT = 4,
  /** OPERATION_TYPE_TAX - Удержание налога. */
  OPERATION_TYPE_TAX = 5,
  /** OPERATION_TYPE_BOND_REPAYMENT_FULL - Полное погашение облигаций. */
  OPERATION_TYPE_BOND_REPAYMENT_FULL = 6,
  /** OPERATION_TYPE_SELL_CARD - Продажа ЦБ с карты. */
  OPERATION_TYPE_SELL_CARD = 7,
  /** OPERATION_TYPE_DIVIDEND_TAX - Удержание налога по дивидендам. */
  OPERATION_TYPE_DIVIDEND_TAX = 8,
  /** OPERATION_TYPE_OUTPUT - Вывод денежных средств. */
  OPERATION_TYPE_OUTPUT = 9,
  /** OPERATION_TYPE_BOND_REPAYMENT - Частичное погашение облигаций. */
  OPERATION_TYPE_BOND_REPAYMENT = 10,
  /** OPERATION_TYPE_TAX_CORRECTION - Корректировка налога. */
  OPERATION_TYPE_TAX_CORRECTION = 11,
  /** OPERATION_TYPE_SERVICE_FEE - Удержание комиссии за обслуживание брокерского счета. */
  OPERATION_TYPE_SERVICE_FEE = 12,
  /** OPERATION_TYPE_BENEFIT_TAX - Удержание налога за материальную выгоду. */
  OPERATION_TYPE_BENEFIT_TAX = 13,
  /** OPERATION_TYPE_MARGIN_FEE - Удержание комиссии за непокрытую позицию. */
  OPERATION_TYPE_MARGIN_FEE = 14,
  /** OPERATION_TYPE_BUY - Покупка ЦБ. */
  OPERATION_TYPE_BUY = 15,
  /** OPERATION_TYPE_BUY_CARD - Покупка ЦБ с карты. */
  OPERATION_TYPE_BUY_CARD = 16,
  /** OPERATION_TYPE_INPUT_SECURITIES - Перевод ценных бумаг из другого депозитария. */
  OPERATION_TYPE_INPUT_SECURITIES = 17,
  /** OPERATION_TYPE_SELL_MARGIN - Продажа в результате Margin-call. */
  OPERATION_TYPE_SELL_MARGIN = 18,
  /** OPERATION_TYPE_BROKER_FEE - Удержание комиссии за операцию. */
  OPERATION_TYPE_BROKER_FEE = 19,
  /** OPERATION_TYPE_BUY_MARGIN - Покупка в результате Margin-call. */
  OPERATION_TYPE_BUY_MARGIN = 20,
  /** OPERATION_TYPE_DIVIDEND - Выплата дивидендов. */
  OPERATION_TYPE_DIVIDEND = 21,
  /** OPERATION_TYPE_SELL - Продажа ЦБ. */
  OPERATION_TYPE_SELL = 22,
  /** OPERATION_TYPE_COUPON - Выплата купонов. */
  OPERATION_TYPE_COUPON = 23,
  /** OPERATION_TYPE_SUCCESS_FEE - Удержание комиссии SuccessFee. */
  OPERATION_TYPE_SUCCESS_FEE = 24,
  /** OPERATION_TYPE_DIVIDEND_TRANSFER - Передача дивидендного дохода. */
  OPERATION_TYPE_DIVIDEND_TRANSFER = 25,
  /** OPERATION_TYPE_ACCRUING_VARMARGIN - Зачисление вариационной маржи. */
  OPERATION_TYPE_ACCRUING_VARMARGIN = 26,
  /** OPERATION_TYPE_WRITING_OFF_VARMARGIN - Списание вариационной маржи. */
  OPERATION_TYPE_WRITING_OFF_VARMARGIN = 27,
  /** OPERATION_TYPE_DELIVERY_BUY - Покупка в рамках экспирации фьючерсного контракта. */
  OPERATION_TYPE_DELIVERY_BUY = 28,
  /** OPERATION_TYPE_DELIVERY_SELL - Продажа в рамках экспирации фьючерсного контракта. */
  OPERATION_TYPE_DELIVERY_SELL = 29,
  /** OPERATION_TYPE_TRACK_MFEE - Комиссия за управление по счету автоследования. */
  OPERATION_TYPE_TRACK_MFEE = 30,
  /** OPERATION_TYPE_TRACK_PFEE - Комиссия за результат по счету автоследования. */
  OPERATION_TYPE_TRACK_PFEE = 31,
  /** OPERATION_TYPE_TAX_PROGRESSIVE - Удержание налога по ставке 15%. */
  OPERATION_TYPE_TAX_PROGRESSIVE = 32,
  /** OPERATION_TYPE_BOND_TAX_PROGRESSIVE - Удержание налога по купонам по ставке 15%. */
  OPERATION_TYPE_BOND_TAX_PROGRESSIVE = 33,
  /** OPERATION_TYPE_DIVIDEND_TAX_PROGRESSIVE - Удержание налога по дивидендам по ставке 15%. */
  OPERATION_TYPE_DIVIDEND_TAX_PROGRESSIVE = 34,
  /** OPERATION_TYPE_BENEFIT_TAX_PROGRESSIVE - Удержание налога за материальную выгоду по ставке 15%. */
  OPERATION_TYPE_BENEFIT_TAX_PROGRESSIVE = 35,
  /** OPERATION_TYPE_TAX_CORRECTION_PROGRESSIVE - Корректировка налога по ставке 15%. */
  OPERATION_TYPE_TAX_CORRECTION_PROGRESSIVE = 36,
  /** OPERATION_TYPE_TAX_REPO_PROGRESSIVE - Удержание налога за возмещение по сделкам РЕПО по ставке 15%. */
  OPERATION_TYPE_TAX_REPO_PROGRESSIVE = 37,
  /** OPERATION_TYPE_TAX_REPO - Удержание налога за возмещение по сделкам РЕПО. */
  OPERATION_TYPE_TAX_REPO = 38,
  /** OPERATION_TYPE_TAX_REPO_HOLD - Удержание налога по сделкам РЕПО. */
  OPERATION_TYPE_TAX_REPO_HOLD = 39,
  /** OPERATION_TYPE_TAX_REPO_REFUND - Возврат налога по сделкам РЕПО. */
  OPERATION_TYPE_TAX_REPO_REFUND = 40,
  /** OPERATION_TYPE_TAX_REPO_HOLD_PROGRESSIVE - Удержание налога по сделкам РЕПО по ставке 15%. */
  OPERATION_TYPE_TAX_REPO_HOLD_PROGRESSIVE = 41,
  /** OPERATION_TYPE_TAX_REPO_REFUND_PROGRESSIVE - Возврат налога по сделкам РЕПО по ставке 15%. */
  OPERATION_TYPE_TAX_REPO_REFUND_PROGRESSIVE = 42,
  /** OPERATION_TYPE_DIV_EXT - Выплата дивидендов на карту. */
  OPERATION_TYPE_DIV_EXT = 43,
  /** OPERATION_TYPE_TAX_CORRECTION_COUPON - Корректировка налога по купонам. */
  OPERATION_TYPE_TAX_CORRECTION_COUPON = 44,
  /** OPERATION_TYPE_CASH_FEE - Комиссия за валютный остаток. */
  OPERATION_TYPE_CASH_FEE = 45,
  /** OPERATION_TYPE_OUT_FEE - Комиссия за вывод валюты с брокерского счета. */
  OPERATION_TYPE_OUT_FEE = 46,
  /** OPERATION_TYPE_OUT_STAMP_DUTY - Гербовый сбор. */
  OPERATION_TYPE_OUT_STAMP_DUTY = 47,
  /** OPERATION_TYPE_OUTPUT_SWIFT - SWIFT-перевод. */
  OPERATION_TYPE_OUTPUT_SWIFT = 50,
  /** OPERATION_TYPE_INPUT_SWIFT - SWIFT-перевод. */
  OPERATION_TYPE_INPUT_SWIFT = 51,
  /** OPERATION_TYPE_OUTPUT_ACQUIRING - Перевод на карту. */
  OPERATION_TYPE_OUTPUT_ACQUIRING = 53,
  /** OPERATION_TYPE_INPUT_ACQUIRING - Перевод с карты. */
  OPERATION_TYPE_INPUT_ACQUIRING = 54,
  /** OPERATION_TYPE_OUTPUT_PENALTY - Комиссия за вывод средств. */
  OPERATION_TYPE_OUTPUT_PENALTY = 55,
  /** OPERATION_TYPE_ADVICE_FEE - Списание оплаты за сервис Советов. */
  OPERATION_TYPE_ADVICE_FEE = 56,
  /** OPERATION_TYPE_TRANS_IIS_BS - Перевод ценных бумаг с ИИС на брокерский счет. */
  OPERATION_TYPE_TRANS_IIS_BS = 57,
  /** OPERATION_TYPE_TRANS_BS_BS - Перевод ценных бумаг с одного брокерского счета на другой. */
  OPERATION_TYPE_TRANS_BS_BS = 58,
  /** OPERATION_TYPE_OUT_MULTI - Вывод денежных средств со счета. */
  OPERATION_TYPE_OUT_MULTI = 59,
  /** OPERATION_TYPE_INP_MULTI - Пополнение денежных средств со счета. */
  OPERATION_TYPE_INP_MULTI = 60,
  /** OPERATION_TYPE_OVER_PLACEMENT - Размещение биржевого овернайта. */
  OPERATION_TYPE_OVER_PLACEMENT = 61,
  /** OPERATION_TYPE_OVER_COM - Списание комиссии. */
  OPERATION_TYPE_OVER_COM = 62,
  /** OPERATION_TYPE_OVER_INCOME - Доход от оверанайта. */
  OPERATION_TYPE_OVER_INCOME = 63,
  /** OPERATION_TYPE_OPTION_EXPIRATION - Экспирация опциона. */
  OPERATION_TYPE_OPTION_EXPIRATION = 64,
  /** OPERATION_TYPE_FUTURE_EXPIRATION - Экспирация фьючерса. */
  OPERATION_TYPE_FUTURE_EXPIRATION = 65,
  /** OPERATION_TYPE_OTHER_FEE - Прочие комиссии; */
  OPERATION_TYPE_OTHER_FEE = 66,
  /** OPERATION_TYPE_OTHER - Операция по счету; */
  OPERATION_TYPE_OTHER = 67,
  /** OPERATION_TYPE_DFA_REDEMPTION - погашение ЦФА-токена; */
  OPERATION_TYPE_DFA_REDEMPTION = 68,
  /** OPERATION_TYPE_PRIMARY_ORDER - отмена заявки на первичное размещение по ЦФА; */
  OPERATION_TYPE_PRIMARY_ORDER = 69,
  /** OPERATION_TYPE_FUNDING - Списание фандинга. */
  OPERATION_TYPE_FUNDING = 70,
  UNRECOGNIZED = -1,
}

export function operationTypeFromJSON(object: any): OperationType {
  switch (object) {
    case 0:
    case "OPERATION_TYPE_UNSPECIFIED":
      return OperationType.OPERATION_TYPE_UNSPECIFIED;
    case 1:
    case "OPERATION_TYPE_INPUT":
      return OperationType.OPERATION_TYPE_INPUT;
    case 2:
    case "OPERATION_TYPE_BOND_TAX":
      return OperationType.OPERATION_TYPE_BOND_TAX;
    case 3:
    case "OPERATION_TYPE_OUTPUT_SECURITIES":
      return OperationType.OPERATION_TYPE_OUTPUT_SECURITIES;
    case 4:
    case "OPERATION_TYPE_OVERNIGHT":
      return OperationType.OPERATION_TYPE_OVERNIGHT;
    case 5:
    case "OPERATION_TYPE_TAX":
      return OperationType.OPERATION_TYPE_TAX;
    case 6:
    case "OPERATION_TYPE_BOND_REPAYMENT_FULL":
      return OperationType.OPERATION_TYPE_BOND_REPAYMENT_FULL;
    case 7:
    case "OPERATION_TYPE_SELL_CARD":
      return OperationType.OPERATION_TYPE_SELL_CARD;
    case 8:
    case "OPERATION_TYPE_DIVIDEND_TAX":
      return OperationType.OPERATION_TYPE_DIVIDEND_TAX;
    case 9:
    case "OPERATION_TYPE_OUTPUT":
      return OperationType.OPERATION_TYPE_OUTPUT;
    case 10:
    case "OPERATION_TYPE_BOND_REPAYMENT":
      return OperationType.OPERATION_TYPE_BOND_REPAYMENT;
    case 11:
    case "OPERATION_TYPE_TAX_CORRECTION":
      return OperationType.OPERATION_TYPE_TAX_CORRECTION;
    case 12:
    case "OPERATION_TYPE_SERVICE_FEE":
      return OperationType.OPERATION_TYPE_SERVICE_FEE;
    case 13:
    case "OPERATION_TYPE_BENEFIT_TAX":
      return OperationType.OPERATION_TYPE_BENEFIT_TAX;
    case 14:
    case "OPERATION_TYPE_MARGIN_FEE":
      return OperationType.OPERATION_TYPE_MARGIN_FEE;
    case 15:
    case "OPERATION_TYPE_BUY":
      return OperationType.OPERATION_TYPE_BUY;
    case 16:
    case "OPERATION_TYPE_BUY_CARD":
      return OperationType.OPERATION_TYPE_BUY_CARD;
    case 17:
    case "OPERATION_TYPE_INPUT_SECURITIES":
      return OperationType.OPERATION_TYPE_INPUT_SECURITIES;
    case 18:
    case "OPERATION_TYPE_SELL_MARGIN":
      return OperationType.OPERATION_TYPE_SELL_MARGIN;
    case 19:
    case "OPERATION_TYPE_BROKER_FEE":
      return OperationType.OPERATION_TYPE_BROKER_FEE;
    case 20:
    case "OPERATION_TYPE_BUY_MARGIN":
      return OperationType.OPERATION_TYPE_BUY_MARGIN;
    case 21:
    case "OPERATION_TYPE_DIVIDEND":
      return OperationType.OPERATION_TYPE_DIVIDEND;
    case 22:
    case "OPERATION_TYPE_SELL":
      return OperationType.OPERATION_TYPE_SELL;
    case 23:
    case "OPERATION_TYPE_COUPON":
      return OperationType.OPERATION_TYPE_COUPON;
    case 24:
    case "OPERATION_TYPE_SUCCESS_FEE":
      return OperationType.OPERATION_TYPE_SUCCESS_FEE;
    case 25:
    case "OPERATION_TYPE_DIVIDEND_TRANSFER":
      return OperationType.OPERATION_TYPE_DIVIDEND_TRANSFER;
    case 26:
    case "OPERATION_TYPE_ACCRUING_VARMARGIN":
      return OperationType.OPERATION_TYPE_ACCRUING_VARMARGIN;
    case 27:
    case "OPERATION_TYPE_WRITING_OFF_VARMARGIN":
      return OperationType.OPERATION_TYPE_WRITING_OFF_VARMARGIN;
    case 28:
    case "OPERATION_TYPE_DELIVERY_BUY":
      return OperationType.OPERATION_TYPE_DELIVERY_BUY;
    case 29:
    case "OPERATION_TYPE_DELIVERY_SELL":
      return OperationType.OPERATION_TYPE_DELIVERY_SELL;
    case 30:
    case "OPERATION_TYPE_TRACK_MFEE":
      return OperationType.OPERATION_TYPE_TRACK_MFEE;
    case 31:
    case "OPERATION_TYPE_TRACK_PFEE":
      return OperationType.OPERATION_TYPE_TRACK_PFEE;
    case 32:
    case "OPERATION_TYPE_TAX_PROGRESSIVE":
      return OperationType.OPERATION_TYPE_TAX_PROGRESSIVE;
    case 33:
    case "OPERATION_TYPE_BOND_TAX_PROGRESSIVE":
      return OperationType.OPERATION_TYPE_BOND_TAX_PROGRESSIVE;
    case 34:
    case "OPERATION_TYPE_DIVIDEND_TAX_PROGRESSIVE":
      return OperationType.OPERATION_TYPE_DIVIDEND_TAX_PROGRESSIVE;
    case 35:
    case "OPERATION_TYPE_BENEFIT_TAX_PROGRESSIVE":
      return OperationType.OPERATION_TYPE_BENEFIT_TAX_PROGRESSIVE;
    case 36:
    case "OPERATION_TYPE_TAX_CORRECTION_PROGRESSIVE":
      return OperationType.OPERATION_TYPE_TAX_CORRECTION_PROGRESSIVE;
    case 37:
    case "OPERATION_TYPE_TAX_REPO_PROGRESSIVE":
      return OperationType.OPERATION_TYPE_TAX_REPO_PROGRESSIVE;
    case 38:
    case "OPERATION_TYPE_TAX_REPO":
      return OperationType.OPERATION_TYPE_TAX_REPO;
    case 39:
    case "OPERATION_TYPE_TAX_REPO_HOLD":
      return OperationType.OPERATION_TYPE_TAX_REPO_HOLD;
    case 40:
    case "OPERATION_TYPE_TAX_REPO_REFUND":
      return OperationType.OPERATION_TYPE_TAX_REPO_REFUND;
    case 41:
    case "OPERATION_TYPE_TAX_REPO_HOLD_PROGRESSIVE":
      return OperationType.OPERATION_TYPE_TAX_REPO_HOLD_PROGRESSIVE;
    case 42:
    case "OPERATION_TYPE_TAX_REPO_REFUND_PROGRESSIVE":
      return OperationType.OPERATION_TYPE_TAX_REPO_REFUND_PROGRESSIVE;
    case 43:
    case "OPERATION_TYPE_DIV_EXT":
      return OperationType.OPERATION_TYPE_DIV_EXT;
    case 44:
    case "OPERATION_TYPE_TAX_CORRECTION_COUPON":
      return OperationType.OPERATION_TYPE_TAX_CORRECTION_COUPON;
    case 45:
    case "OPERATION_TYPE_CASH_FEE":
      return OperationType.OPERATION_TYPE_CASH_FEE;
    case 46:
    case "OPERATION_TYPE_OUT_FEE":
      return OperationType.OPERATION_TYPE_OUT_FEE;
    case 47:
    case "OPERATION_TYPE_OUT_STAMP_DUTY":
      return OperationType.OPERATION_TYPE_OUT_STAMP_DUTY;
    case 50:
    case "OPERATION_TYPE_OUTPUT_SWIFT":
      return OperationType.OPERATION_TYPE_OUTPUT_SWIFT;
    case 51:
    case "OPERATION_TYPE_INPUT_SWIFT":
      return OperationType.OPERATION_TYPE_INPUT_SWIFT;
    case 53:
    case "OPERATION_TYPE_OUTPUT_ACQUIRING":
      return OperationType.OPERATION_TYPE_OUTPUT_ACQUIRING;
    case 54:
    case "OPERATION_TYPE_INPUT_ACQUIRING":
      return OperationType.OPERATION_TYPE_INPUT_ACQUIRING;
    case 55:
    case "OPERATION_TYPE_OUTPUT_PENALTY":
      return OperationType.OPERATION_TYPE_OUTPUT_PENALTY;
    case 56:
    case "OPERATION_TYPE_ADVICE_FEE":
      return OperationType.OPERATION_TYPE_ADVICE_FEE;
    case 57:
    case "OPERATION_TYPE_TRANS_IIS_BS":
      return OperationType.OPERATION_TYPE_TRANS_IIS_BS;
    case 58:
    case "OPERATION_TYPE_TRANS_BS_BS":
      return OperationType.OPERATION_TYPE_TRANS_BS_BS;
    case 59:
    case "OPERATION_TYPE_OUT_MULTI":
      return OperationType.OPERATION_TYPE_OUT_MULTI;
    case 60:
    case "OPERATION_TYPE_INP_MULTI":
      return OperationType.OPERATION_TYPE_INP_MULTI;
    case 61:
    case "OPERATION_TYPE_OVER_PLACEMENT":
      return OperationType.OPERATION_TYPE_OVER_PLACEMENT;
    case 62:
    case "OPERATION_TYPE_OVER_COM":
      return OperationType.OPERATION_TYPE_OVER_COM;
    case 63:
    case "OPERATION_TYPE_OVER_INCOME":
      return OperationType.OPERATION_TYPE_OVER_INCOME;
    case 64:
    case "OPERATION_TYPE_OPTION_EXPIRATION":
      return OperationType.OPERATION_TYPE_OPTION_EXPIRATION;
    case 65:
    case "OPERATION_TYPE_FUTURE_EXPIRATION":
      return OperationType.OPERATION_TYPE_FUTURE_EXPIRATION;
    case 66:
    case "OPERATION_TYPE_OTHER_FEE":
      return OperationType.OPERATION_TYPE_OTHER_FEE;
    case 67:
    case "OPERATION_TYPE_OTHER":
      return OperationType.OPERATION_TYPE_OTHER;
    case 68:
    case "OPERATION_TYPE_DFA_REDEMPTION":
      return OperationType.OPERATION_TYPE_DFA_REDEMPTION;
    case 69:
    case "OPERATION_TYPE_PRIMARY_ORDER":
      return OperationType.OPERATION_TYPE_PRIMARY_ORDER;
    case 70:
    case "OPERATION_TYPE_FUNDING":
      return OperationType.OPERATION_TYPE_FUNDING;
    case -1:
    case "UNRECOGNIZED":
    default:
      return OperationType.UNRECOGNIZED;
  }
}

export function operationTypeToJSON(object: OperationType): string {
  switch (object) {
    case OperationType.OPERATION_TYPE_UNSPECIFIED:
      return "OPERATION_TYPE_UNSPECIFIED";
    case OperationType.OPERATION_TYPE_INPUT:
      return "OPERATION_TYPE_INPUT";
    case OperationType.OPERATION_TYPE_BOND_TAX:
      return "OPERATION_TYPE_BOND_TAX";
    case OperationType.OPERATION_TYPE_OUTPUT_SECURITIES:
      return "OPERATION_TYPE_OUTPUT_SECURITIES";
    case OperationType.OPERATION_TYPE_OVERNIGHT:
      return "OPERATION_TYPE_OVERNIGHT";
    case OperationType.OPERATION_TYPE_TAX:
      return "OPERATION_TYPE_TAX";
    case OperationType.OPERATION_TYPE_BOND_REPAYMENT_FULL:
      return "OPERATION_TYPE_BOND_REPAYMENT_FULL";
    case OperationType.OPERATION_TYPE_SELL_CARD:
      return "OPERATION_TYPE_SELL_CARD";
    case OperationType.OPERATION_TYPE_DIVIDEND_TAX:
      return "OPERATION_TYPE_DIVIDEND_TAX";
    case OperationType.OPERATION_TYPE_OUTPUT:
      return "OPERATION_TYPE_OUTPUT";
    case OperationType.OPERATION_TYPE_BOND_REPAYMENT:
      return "OPERATION_TYPE_BOND_REPAYMENT";
    case OperationType.OPERATION_TYPE_TAX_CORRECTION:
      return "OPERATION_TYPE_TAX_CORRECTION";
    case OperationType.OPERATION_TYPE_SERVICE_FEE:
      return "OPERATION_TYPE_SERVICE_FEE";
    case OperationType.OPERATION_TYPE_BENEFIT_TAX:
      return "OPERATION_TYPE_BENEFIT_TAX";
    case OperationType.OPERATION_TYPE_MARGIN_FEE:
      return "OPERATION_TYPE_MARGIN_FEE";
    case OperationType.OPERATION_TYPE_BUY:
      return "OPERATION_TYPE_BUY";
    case OperationType.OPERATION_TYPE_BUY_CARD:
      return "OPERATION_TYPE_BUY_CARD";
    case OperationType.OPERATION_TYPE_INPUT_SECURITIES:
      return "OPERATION_TYPE_INPUT_SECURITIES";
    case OperationType.OPERATION_TYPE_SELL_MARGIN:
      return "OPERATION_TYPE_SELL_MARGIN";
    case OperationType.OPERATION_TYPE_BROKER_FEE:
      return "OPERATION_TYPE_BROKER_FEE";
    case OperationType.OPERATION_TYPE_BUY_MARGIN:
      return "OPERATION_TYPE_BUY_MARGIN";
    case OperationType.OPERATION_TYPE_DIVIDEND:
      return "OPERATION_TYPE_DIVIDEND";
    case OperationType.OPERATION_TYPE_SELL:
      return "OPERATION_TYPE_SELL";
    case OperationType.OPERATION_TYPE_COUPON:
      return "OPERATION_TYPE_COUPON";
    case OperationType.OPERATION_TYPE_SUCCESS_FEE:
      return "OPERATION_TYPE_SUCCESS_FEE";
    case OperationType.OPERATION_TYPE_DIVIDEND_TRANSFER:
      return "OPERATION_TYPE_DIVIDEND_TRANSFER";
    case OperationType.OPERATION_TYPE_ACCRUING_VARMARGIN:
      return "OPERATION_TYPE_ACCRUING_VARMARGIN";
    case OperationType.OPERATION_TYPE_WRITING_OFF_VARMARGIN:
      return "OPERATION_TYPE_WRITING_OFF_VARMARGIN";
    case OperationType.OPERATION_TYPE_DELIVERY_BUY:
      return "OPERATION_TYPE_DELIVERY_BUY";
    case OperationType.OPERATION_TYPE_DELIVERY_SELL:
      return "OPERATION_TYPE_DELIVERY_SELL";
    case OperationType.OPERATION_TYPE_TRACK_MFEE:
      return "OPERATION_TYPE_TRACK_MFEE";
    case OperationType.OPERATION_TYPE_TRACK_PFEE:
      return "OPERATION_TYPE_TRACK_PFEE";
    case OperationType.OPERATION_TYPE_TAX_PROGRESSIVE:
      return "OPERATION_TYPE_TAX_PROGRESSIVE";
    case OperationType.OPERATION_TYPE_BOND_TAX_PROGRESSIVE:
      return "OPERATION_TYPE_BOND_TAX_PROGRESSIVE";
    case OperationType.OPERATION_TYPE_DIVIDEND_TAX_PROGRESSIVE:
      return "OPERATION_TYPE_DIVIDEND_TAX_PROGRESSIVE";
    case OperationType.OPERATION_TYPE_BENEFIT_TAX_PROGRESSIVE:
      return "OPERATION_TYPE_BENEFIT_TAX_PROGRESSIVE";
    case OperationType.OPERATION_TYPE_TAX_CORRECTION_PROGRESSIVE:
      return "OPERATION_TYPE_TAX_CORRECTION_PROGRESSIVE";
    case OperationType.OPERATION_TYPE_TAX_REPO_PROGRESSIVE:
      return "OPERATION_TYPE_TAX_REPO_PROGRESSIVE";
    case OperationType.OPERATION_TYPE_TAX_REPO:
      return "OPERATION_TYPE_TAX_REPO";
    case OperationType.OPERATION_TYPE_TAX_REPO_HOLD:
      return "OPERATION_TYPE_TAX_REPO_HOLD";
    case OperationType.OPERATION_TYPE_TAX_REPO_REFUND:
      return "OPERATION_TYPE_TAX_REPO_REFUND";
    case OperationType.OPERATION_TYPE_TAX_REPO_HOLD_PROGRESSIVE:
      return "OPERATION_TYPE_TAX_REPO_HOLD_PROGRESSIVE";
    case OperationType.OPERATION_TYPE_TAX_REPO_REFUND_PROGRESSIVE:
      return "OPERATION_TYPE_TAX_REPO_REFUND_PROGRESSIVE";
    case OperationType.OPERATION_TYPE_DIV_EXT:
      return "OPERATION_TYPE_DIV_EXT";
    case OperationType.OPERATION_TYPE_TAX_CORRECTION_COUPON:
      return "OPERATION_TYPE_TAX_CORRECTION_COUPON";
    case OperationType.OPERATION_TYPE_CASH_FEE:
      return "OPERATION_TYPE_CASH_FEE";
    case OperationType.OPERATION_TYPE_OUT_FEE:
      return "OPERATION_TYPE_OUT_FEE";
    case OperationType.OPERATION_TYPE_OUT_STAMP_DUTY:
      return "OPERATION_TYPE_OUT_STAMP_DUTY";
    case OperationType.OPERATION_TYPE_OUTPUT_SWIFT:
      return "OPERATION_TYPE_OUTPUT_SWIFT";
    case OperationType.OPERATION_TYPE_INPUT_SWIFT:
      return "OPERATION_TYPE_INPUT_SWIFT";
    case OperationType.OPERATION_TYPE_OUTPUT_ACQUIRING:
      return "OPERATION_TYPE_OUTPUT_ACQUIRING";
    case OperationType.OPERATION_TYPE_INPUT_ACQUIRING:
      return "OPERATION_TYPE_INPUT_ACQUIRING";
    case OperationType.OPERATION_TYPE_OUTPUT_PENALTY:
      return "OPERATION_TYPE_OUTPUT_PENALTY";
    case OperationType.OPERATION_TYPE_ADVICE_FEE:
      return "OPERATION_TYPE_ADVICE_FEE";
    case OperationType.OPERATION_TYPE_TRANS_IIS_BS:
      return "OPERATION_TYPE_TRANS_IIS_BS";
    case OperationType.OPERATION_TYPE_TRANS_BS_BS:
      return "OPERATION_TYPE_TRANS_BS_BS";
    case OperationType.OPERATION_TYPE_OUT_MULTI:
      return "OPERATION_TYPE_OUT_MULTI";
    case OperationType.OPERATION_TYPE_INP_MULTI:
      return "OPERATION_TYPE_INP_MULTI";
    case OperationType.OPERATION_TYPE_OVER_PLACEMENT:
      return "OPERATION_TYPE_OVER_PLACEMENT";
    case OperationType.OPERATION_TYPE_OVER_COM:
      return "OPERATION_TYPE_OVER_COM";
    case OperationType.OPERATION_TYPE_OVER_INCOME:
      return "OPERATION_TYPE_OVER_INCOME";
    case OperationType.OPERATION_TYPE_OPTION_EXPIRATION:
      return "OPERATION_TYPE_OPTION_EXPIRATION";
    case OperationType.OPERATION_TYPE_FUTURE_EXPIRATION:
      return "OPERATION_TYPE_FUTURE_EXPIRATION";
    case OperationType.OPERATION_TYPE_OTHER_FEE:
      return "OPERATION_TYPE_OTHER_FEE";
    case OperationType.OPERATION_TYPE_OTHER:
      return "OPERATION_TYPE_OTHER";
    case OperationType.OPERATION_TYPE_DFA_REDEMPTION:
      return "OPERATION_TYPE_DFA_REDEMPTION";
    case OperationType.OPERATION_TYPE_PRIMARY_ORDER:
      return "OPERATION_TYPE_PRIMARY_ORDER";
    case OperationType.OPERATION_TYPE_FUNDING:
      return "OPERATION_TYPE_FUNDING";
    case OperationType.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

/** Результат подписки. */
export enum PortfolioSubscriptionStatus {
  /** PORTFOLIO_SUBSCRIPTION_STATUS_UNSPECIFIED - Тип не определен. */
  PORTFOLIO_SUBSCRIPTION_STATUS_UNSPECIFIED = 0,
  /** PORTFOLIO_SUBSCRIPTION_STATUS_SUCCESS - Успешно. */
  PORTFOLIO_SUBSCRIPTION_STATUS_SUCCESS = 1,
  /** PORTFOLIO_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND - Счет не найден или недостаточно прав. */
  PORTFOLIO_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND = 2,
  /** PORTFOLIO_SUBSCRIPTION_STATUS_INTERNAL_ERROR - Произошла ошибка. */
  PORTFOLIO_SUBSCRIPTION_STATUS_INTERNAL_ERROR = 3,
  UNRECOGNIZED = -1,
}

export function portfolioSubscriptionStatusFromJSON(object: any): PortfolioSubscriptionStatus {
  switch (object) {
    case 0:
    case "PORTFOLIO_SUBSCRIPTION_STATUS_UNSPECIFIED":
      return PortfolioSubscriptionStatus.PORTFOLIO_SUBSCRIPTION_STATUS_UNSPECIFIED;
    case 1:
    case "PORTFOLIO_SUBSCRIPTION_STATUS_SUCCESS":
      return PortfolioSubscriptionStatus.PORTFOLIO_SUBSCRIPTION_STATUS_SUCCESS;
    case 2:
    case "PORTFOLIO_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND":
      return PortfolioSubscriptionStatus.PORTFOLIO_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND;
    case 3:
    case "PORTFOLIO_SUBSCRIPTION_STATUS_INTERNAL_ERROR":
      return PortfolioSubscriptionStatus.PORTFOLIO_SUBSCRIPTION_STATUS_INTERNAL_ERROR;
    case -1:
    case "UNRECOGNIZED":
    default:
      return PortfolioSubscriptionStatus.UNRECOGNIZED;
  }
}

export function portfolioSubscriptionStatusToJSON(object: PortfolioSubscriptionStatus): string {
  switch (object) {
    case PortfolioSubscriptionStatus.PORTFOLIO_SUBSCRIPTION_STATUS_UNSPECIFIED:
      return "PORTFOLIO_SUBSCRIPTION_STATUS_UNSPECIFIED";
    case PortfolioSubscriptionStatus.PORTFOLIO_SUBSCRIPTION_STATUS_SUCCESS:
      return "PORTFOLIO_SUBSCRIPTION_STATUS_SUCCESS";
    case PortfolioSubscriptionStatus.PORTFOLIO_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND:
      return "PORTFOLIO_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND";
    case PortfolioSubscriptionStatus.PORTFOLIO_SUBSCRIPTION_STATUS_INTERNAL_ERROR:
      return "PORTFOLIO_SUBSCRIPTION_STATUS_INTERNAL_ERROR";
    case PortfolioSubscriptionStatus.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

/** Результат подписки. */
export enum PositionsAccountSubscriptionStatus {
  /** POSITIONS_SUBSCRIPTION_STATUS_UNSPECIFIED - Тип не определен. */
  POSITIONS_SUBSCRIPTION_STATUS_UNSPECIFIED = 0,
  /** POSITIONS_SUBSCRIPTION_STATUS_SUCCESS - Успешно. */
  POSITIONS_SUBSCRIPTION_STATUS_SUCCESS = 1,
  /** POSITIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND - Счет не найден или недостаточно прав. */
  POSITIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND = 2,
  /** POSITIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR - Произошла ошибка. */
  POSITIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR = 3,
  UNRECOGNIZED = -1,
}

export function positionsAccountSubscriptionStatusFromJSON(object: any): PositionsAccountSubscriptionStatus {
  switch (object) {
    case 0:
    case "POSITIONS_SUBSCRIPTION_STATUS_UNSPECIFIED":
      return PositionsAccountSubscriptionStatus.POSITIONS_SUBSCRIPTION_STATUS_UNSPECIFIED;
    case 1:
    case "POSITIONS_SUBSCRIPTION_STATUS_SUCCESS":
      return PositionsAccountSubscriptionStatus.POSITIONS_SUBSCRIPTION_STATUS_SUCCESS;
    case 2:
    case "POSITIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND":
      return PositionsAccountSubscriptionStatus.POSITIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND;
    case 3:
    case "POSITIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR":
      return PositionsAccountSubscriptionStatus.POSITIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR;
    case -1:
    case "UNRECOGNIZED":
    default:
      return PositionsAccountSubscriptionStatus.UNRECOGNIZED;
  }
}

export function positionsAccountSubscriptionStatusToJSON(object: PositionsAccountSubscriptionStatus): string {
  switch (object) {
    case PositionsAccountSubscriptionStatus.POSITIONS_SUBSCRIPTION_STATUS_UNSPECIFIED:
      return "POSITIONS_SUBSCRIPTION_STATUS_UNSPECIFIED";
    case PositionsAccountSubscriptionStatus.POSITIONS_SUBSCRIPTION_STATUS_SUCCESS:
      return "POSITIONS_SUBSCRIPTION_STATUS_SUCCESS";
    case PositionsAccountSubscriptionStatus.POSITIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND:
      return "POSITIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND";
    case PositionsAccountSubscriptionStatus.POSITIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR:
      return "POSITIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR";
    case PositionsAccountSubscriptionStatus.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

/** Результат подписки. */
export enum OperationsAccountSubscriptionStatus {
  /** OPERATIONS_SUBSCRIPTION_STATUS_UNSPECIFIED - Тип не определен. */
  OPERATIONS_SUBSCRIPTION_STATUS_UNSPECIFIED = 0,
  /** OPERATIONS_SUBSCRIPTION_STATUS_SUCCESS - Успешно. */
  OPERATIONS_SUBSCRIPTION_STATUS_SUCCESS = 1,
  /** OPERATIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND - Счет не найден или недостаточно прав. */
  OPERATIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND = 2,
  /** OPERATIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR - Произошла ошибка. */
  OPERATIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR = 3,
  UNRECOGNIZED = -1,
}

export function operationsAccountSubscriptionStatusFromJSON(object: any): OperationsAccountSubscriptionStatus {
  switch (object) {
    case 0:
    case "OPERATIONS_SUBSCRIPTION_STATUS_UNSPECIFIED":
      return OperationsAccountSubscriptionStatus.OPERATIONS_SUBSCRIPTION_STATUS_UNSPECIFIED;
    case 1:
    case "OPERATIONS_SUBSCRIPTION_STATUS_SUCCESS":
      return OperationsAccountSubscriptionStatus.OPERATIONS_SUBSCRIPTION_STATUS_SUCCESS;
    case 2:
    case "OPERATIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND":
      return OperationsAccountSubscriptionStatus.OPERATIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND;
    case 3:
    case "OPERATIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR":
      return OperationsAccountSubscriptionStatus.OPERATIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR;
    case -1:
    case "UNRECOGNIZED":
    default:
      return OperationsAccountSubscriptionStatus.UNRECOGNIZED;
  }
}

export function operationsAccountSubscriptionStatusToJSON(object: OperationsAccountSubscriptionStatus): string {
  switch (object) {
    case OperationsAccountSubscriptionStatus.OPERATIONS_SUBSCRIPTION_STATUS_UNSPECIFIED:
      return "OPERATIONS_SUBSCRIPTION_STATUS_UNSPECIFIED";
    case OperationsAccountSubscriptionStatus.OPERATIONS_SUBSCRIPTION_STATUS_SUCCESS:
      return "OPERATIONS_SUBSCRIPTION_STATUS_SUCCESS";
    case OperationsAccountSubscriptionStatus.OPERATIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND:
      return "OPERATIONS_SUBSCRIPTION_STATUS_ACCOUNT_NOT_FOUND";
    case OperationsAccountSubscriptionStatus.OPERATIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR:
      return "OPERATIONS_SUBSCRIPTION_STATUS_INTERNAL_ERROR";
    case OperationsAccountSubscriptionStatus.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

/** Запрос получения списка операций по счету. */
export interface OperationsRequest {
  /** Идентификатор счета клиента. */
  accountId: string;
  /** Начало периода по UTC. */
  from?:
    | Date
    | undefined;
  /** Окончание периода по UTC. */
  to?:
    | Date
    | undefined;
  /** Статус запрашиваемых операций. */
  state?:
    | OperationState
    | undefined;
  /** FIGI-идентификатор инструмента для фильтрации. */
  figi?: string | undefined;
}

/** Список операций. */
export interface OperationsResponse {
  /** Массив операций. */
  operations: Operation[];
}

/** Данные по операции. */
export interface Operation {
  /** Идентификатор операции. */
  id: string;
  /** Идентификатор родительской операции. */
  parentOperationId: string;
  /** Валюта операции. */
  currency: string;
  /** Сумма операции. */
  payment?:
    | MoneyValue
    | undefined;
  /** Цена операции за 1 инструмент. Чтобы получить стоимость лота, нужно умножить на лотность инструмента. */
  price?:
    | MoneyValue
    | undefined;
  /** Статус операции. */
  state: OperationState;
  /** Количество единиц инструмента. */
  quantity: number;
  /** Неисполненный остаток по сделке. */
  quantityRest: number;
  /** FIGI-идентификатор инструмента, связанного с операцией. */
  figi: string;
  /** Тип инструмента. Возможные значения: <br/><br/>`bond` — облигация; <br/>`share` — акция; <br/>`currency` — валюта; <br/>`etf` — фонд; <br/>`futures` — фьючерс. */
  instrumentType: string;
  /** Дата и время операции в формате часовом поясе UTC. */
  date?:
    | Date
    | undefined;
  /** Текстовое описание типа операции. */
  type: string;
  /** Тип операции. */
  operationType: OperationType;
  /** Массив сделок. */
  trades: OperationTrade[];
  /** Идентификатор актива */
  assetUid: string;
  /** Уникальный идентификатор позиции. */
  positionUid: string;
  /** Уникальный идентификатор инструмента. */
  instrumentUid: string;
  /** Массив дочерних операций. */
  childOperations: ChildOperationItem[];
}

/** Сделка по операции. */
export interface OperationTrade {
  /** Идентификатор сделки. */
  tradeId: string;
  /** Дата и время сделки по UTC. */
  dateTime?:
    | Date
    | undefined;
  /** Количество инструментов. */
  quantity: number;
  /** Цена за 1 инструмент. Чтобы получить стоимость лота, нужно умножить на лотность инструмента. */
  price?: MoneyValue | undefined;
}

/** Запрос получения текущего портфеля по счету. */
export interface PortfolioRequest {
  /** Идентификатор счета пользователя. */
  accountId: string;
  /** Валюта, в которой нужно рассчитать портфель. */
  currency?: PortfolioRequest_CurrencyRequest | undefined;
}

export enum PortfolioRequest_CurrencyRequest {
  /** RUB - Рубли */
  RUB = 0,
  /** USD - Доллары */
  USD = 1,
  /** EUR - Евро */
  EUR = 2,
  UNRECOGNIZED = -1,
}

export function portfolioRequest_CurrencyRequestFromJSON(object: any): PortfolioRequest_CurrencyRequest {
  switch (object) {
    case 0:
    case "RUB":
      return PortfolioRequest_CurrencyRequest.RUB;
    case 1:
    case "USD":
      return PortfolioRequest_CurrencyRequest.USD;
    case 2:
    case "EUR":
      return PortfolioRequest_CurrencyRequest.EUR;
    case -1:
    case "UNRECOGNIZED":
    default:
      return PortfolioRequest_CurrencyRequest.UNRECOGNIZED;
  }
}

export function portfolioRequest_CurrencyRequestToJSON(object: PortfolioRequest_CurrencyRequest): string {
  switch (object) {
    case PortfolioRequest_CurrencyRequest.RUB:
      return "RUB";
    case PortfolioRequest_CurrencyRequest.USD:
      return "USD";
    case PortfolioRequest_CurrencyRequest.EUR:
      return "EUR";
    case PortfolioRequest_CurrencyRequest.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

/** Текущий портфель по счету. */
export interface PortfolioResponse {
  /** Общая стоимость акций в портфеле. */
  totalAmountShares?:
    | MoneyValue
    | undefined;
  /** Общая стоимость облигаций в портфеле. */
  totalAmountBonds?:
    | MoneyValue
    | undefined;
  /** Общая стоимость фондов в портфеле. */
  totalAmountEtf?:
    | MoneyValue
    | undefined;
  /** Общая стоимость валют в портфеле. */
  totalAmountCurrencies?:
    | MoneyValue
    | undefined;
  /** Общая стоимость фьючерсов в портфеле. */
  totalAmountFutures?:
    | MoneyValue
    | undefined;
  /** Текущая относительная доходность портфеля в %. */
  expectedYield?:
    | Quotation
    | undefined;
  /** Список позиций портфеля. */
  positions: PortfolioPosition[];
  /** Идентификатор счета пользователя. */
  accountId: string;
  /** Общая стоимость опционов в портфеле. */
  totalAmountOptions?:
    | MoneyValue
    | undefined;
  /** Общая стоимость структурных нот в портфеле. */
  totalAmountSp?:
    | MoneyValue
    | undefined;
  /** Общая стоимость портфеля. */
  totalAmountPortfolio?:
    | MoneyValue
    | undefined;
  /** Массив виртуальных позиций портфеля. */
  virtualPositions: VirtualPortfolioPosition[];
  /** Рассчитанная доходность портфеля за день в рублях. */
  dailyYield?:
    | MoneyValue
    | undefined;
  /** Относительная доходность в день в %. */
  dailyYieldRelative?:
    | Quotation
    | undefined;
  /** Общая стоимость смарт-активов в портфеле в рублях. */
  totalAmountDfa?: MoneyValue | undefined;
}

/** Запрос позиций портфеля по счету. */
export interface PositionsRequest {
  /** Идентификатор счета пользователя. */
  accountId: string;
}

/** Список позиций по счету. */
export interface PositionsResponse {
  /** Массив валютных позиций портфеля. */
  money: MoneyValue[];
  /** Массив заблокированных валютных позиций портфеля. */
  blocked: MoneyValue[];
  /** Список ценно-бумажных позиций портфеля. */
  securities: PositionsSecurities[];
  /** Признак идущей выгрузки лимитов в данный момент. */
  limitsLoadingInProgress: boolean;
  /** Список фьючерсов портфеля. */
  futures: PositionsFutures[];
  /** Список опционов портфеля. */
  options: PositionsOptions[];
  /** Идентификатор счёта пользователя. */
  accountId: string;
}

/** Запрос доступного остатка для вывода. */
export interface WithdrawLimitsRequest {
  /** Идентификатор счета пользователя. */
  accountId: string;
}

/** Доступный остаток для вывода. */
export interface WithdrawLimitsResponse {
  /** Массив валютных позиций портфеля. */
  money: MoneyValue[];
  /** Массив заблокированных валютных позиций портфеля. */
  blocked: MoneyValue[];
  /** Заблокировано под гарантийное обеспечение фьючерсов. */
  blockedGuarantee: MoneyValue[];
}

/** Позиции портфеля. */
export interface PortfolioPosition {
  /** FIGI-идентификатор инструмента. */
  figi: string;
  /** Тип инструмента. */
  instrumentType: string;
  /** Количество инструмента в портфеле в штуках. */
  quantity?:
    | Quotation
    | undefined;
  /** Средневзвешенная цена позиции. Для пересчета возможна задержка до одной секунды. */
  averagePositionPrice?:
    | MoneyValue
    | undefined;
  /** Текущая рассчитанная доходность позиции. */
  expectedYield?:
    | Quotation
    | undefined;
  /** Текущий НКД. */
  currentNkd?:
    | MoneyValue
    | undefined;
  /**
   * Deprecated Средняя цена позиции в пунктах (для фьючерсов). Для пересчета возможна задержка до одной секунды.
   *
   * @deprecated
   */
  averagePositionPricePt?:
    | Quotation
    | undefined;
  /** Текущая цена за 1 инструмент. Чтобы получить стоимость лота, нужно умножить на лотность инструмента. */
  currentPrice?:
    | MoneyValue
    | undefined;
  /** Средняя цена позиции по методу FIFO. Для пересчета возможна задержка до одной секунды. */
  averagePositionPriceFifo?:
    | MoneyValue
    | undefined;
  /**
   * Deprecated Количество лотов в портфеле.
   *
   * @deprecated
   */
  quantityLots?:
    | Quotation
    | undefined;
  /** Заблокировано на бирже. */
  blocked: boolean;
  /** Количество бумаг, заблокированных выставленными заявками. */
  blockedLots?:
    | Quotation
    | undefined;
  /** Уникальный идентификатор позиции. */
  positionUid: string;
  /** Уникальный идентификатор инструмента. */
  instrumentUid: string;
  /** Вариационная маржа. */
  varMargin?:
    | MoneyValue
    | undefined;
  /** Текущая рассчитанная доходность позиции. */
  expectedYieldFifo?:
    | Quotation
    | undefined;
  /** Рассчитанная доходность портфеля за день. */
  dailyYield?:
    | MoneyValue
    | undefined;
  /** Тикер инструмента. */
  ticker: string;
  /** Класс-код (секция торгов). */
  classCode: string;
  /** Вариационная маржа (расчетная). */
  varMarginSettled?: MoneyValue | undefined;
}

export interface VirtualPortfolioPosition {
  /** Уникальный идентификатор позиции. */
  positionUid: string;
  /** Уникальный идентификатор инструмента. */
  instrumentUid: string;
  /** FIGI-идентификатор инструмента. */
  figi: string;
  /** Тип инструмента. */
  instrumentType: string;
  /** Количество инструмента в портфеле в штуках. */
  quantity?:
    | Quotation
    | undefined;
  /** Средневзвешенная цена позиции. Для пересчета возможна задержка до одной секунды. */
  averagePositionPrice?:
    | MoneyValue
    | undefined;
  /** Текущая рассчитанная доходность позиции. */
  expectedYield?:
    | Quotation
    | undefined;
  /** Текущая рассчитанная доходность позиции. */
  expectedYieldFifo?:
    | Quotation
    | undefined;
  /** Дата, до которой нужно продать виртуальные бумаги. После этой даты виртуальная позиция «сгораетт». */
  expireDate?:
    | Date
    | undefined;
  /** Текущая цена за 1 инструмент. Чтобы получить стоимость лота, нужно умножить на лотность инструмента. */
  currentPrice?:
    | MoneyValue
    | undefined;
  /** Средняя цена позиции по методу FIFO. Для пересчета возможна задержка до одной секунды. */
  averagePositionPriceFifo?:
    | MoneyValue
    | undefined;
  /** Рассчитанная доходность портфеля за день. */
  dailyYield?:
    | MoneyValue
    | undefined;
  /** Тикер инструмента. */
  ticker: string;
  /** Класс-код (секция торгов). */
  classCode: string;
}

/** Баланс позиции ценной бумаги. */
export interface PositionsSecurities {
  /** FIGI-идентификатор бумаги. */
  figi: string;
  /** Количество бумаг, заблокированных выставленными заявками. */
  blocked: number;
  /** Текущий незаблокированный баланс. */
  balance: number;
  /** Уникальный идентификатор позиции. */
  positionUid: string;
  /** Уникальный идентификатор инструмента. */
  instrumentUid: string;
  /** Тикер инструмента. */
  ticker: string;
  /** Класс-код (секция торгов). */
  classCode: string;
  /** Заблокировано на бирже. */
  exchangeBlocked: boolean;
  /** Тип инструмента. */
  instrumentType: string;
}

/** Баланс фьючерса. */
export interface PositionsFutures {
  /** FIGI-идентификатор фьючерса. */
  figi: string;
  /** Количество бумаг, заблокированных выставленными заявками. */
  blocked: number;
  /** Текущий незаблокированный баланс. */
  balance: number;
  /** Уникальный идентификатор позиции. */
  positionUid: string;
  /** Уникальный идентификатор  инструмента. */
  instrumentUid: string;
  /** Тикер инструмента. */
  ticker: string;
  /** Класс-код (секция торгов). */
  classCode: string;
}

/** Баланс опциона. */
export interface PositionsOptions {
  /** Уникальный идентификатор позиции опциона. */
  positionUid: string;
  /** Уникальный идентификатор  инструмента. */
  instrumentUid: string;
  /** Тикер инструмента. */
  ticker: string;
  /** Класс-код (секция торгов). */
  classCode: string;
  /** Количество бумаг, заблокированных выставленными заявками. */
  blocked: number;
  /** Текущий незаблокированный баланс. */
  balance: number;
}

export interface BrokerReportRequest {
  generateBrokerReportRequest?: GenerateBrokerReportRequest | undefined;
  getBrokerReportRequest?: GetBrokerReportRequest | undefined;
}

export interface BrokerReportResponse {
  generateBrokerReportResponse?: GenerateBrokerReportResponse | undefined;
  getBrokerReportResponse?: GetBrokerReportResponse | undefined;
}

export interface GenerateBrokerReportRequest {
  /** Идентификатор счета клиента. */
  accountId: string;
  /** Начало периода по UTC. */
  from?:
    | Date
    | undefined;
  /** Окончание периода по UTC. */
  to?: Date | undefined;
}

export interface GenerateBrokerReportResponse {
  /** Идентификатор задачи формирования брокерского отчета. */
  taskId: string;
}

export interface GetBrokerReportRequest {
  /** Идентификатор задачи формирования брокерского отчета. */
  taskId: string;
  /** Номер страницы отчета, начинается с 1. Значение по умолчанию — 0. */
  page?: number | undefined;
}

export interface GetBrokerReportResponse {
  brokerReport: BrokerReport[];
  /** Количество записей в отчете. */
  itemsCount: number;
  /** Количество страниц с данными отчета, начинается с 0. */
  pagesCount: number;
  /** Текущая страница, начинается с 0. */
  page: number;
  /** Идентификатор задачи формирования брокерского отчета. */
  taskId: string;
}

export interface BrokerReport {
  /** Номер сделки. */
  tradeId: string;
  /** Номер поручения. */
  orderId: string;
  /** FIGI-идентификаторинструмента. */
  figi: string;
  /** Признак исполнения. */
  executeSign: string;
  /** Дата и время заключения по UTC. */
  tradeDatetime?:
    | Date
    | undefined;
  /** Торговая площадка. */
  exchange: string;
  /** Режим торгов. */
  classCode: string;
  /** Вид сделки. */
  direction: string;
  /** Сокращенное наименование актива. */
  name: string;
  /** Код актива. */
  ticker: string;
  /** Цена за единицу. */
  price?:
    | MoneyValue
    | undefined;
  /** Количество. */
  quantity: number;
  /** Сумма без НКД. */
  orderAmount?:
    | MoneyValue
    | undefined;
  /** НКД. */
  aciValue?:
    | Quotation
    | undefined;
  /** Сумма сделки. */
  totalOrderAmount?:
    | MoneyValue
    | undefined;
  /** Комиссия брокера. */
  brokerCommission?:
    | MoneyValue
    | undefined;
  /** Комиссия биржи. */
  exchangeCommission?:
    | MoneyValue
    | undefined;
  /** Комиссия клирингового центра. */
  exchangeClearingCommission?:
    | MoneyValue
    | undefined;
  /** Ставка РЕПО, %. */
  repoRate?:
    | Quotation
    | undefined;
  /** Контрагент или брокерарокер. */
  party: string;
  /** Дата расчетов по UTC. */
  clearValueDate?:
    | Date
    | undefined;
  /** Дата поставки по UTC. */
  secValueDate?:
    | Date
    | undefined;
  /** Статус брокера. */
  brokerStatus: string;
  /** Тип договора. */
  separateAgreementType: string;
  /** Номер договора. */
  separateAgreementNumber: string;
  /** Дата договора. */
  separateAgreementDate: string;
  /** Тип расчета по сделке. */
  deliveryType: string;
}

export interface GetDividendsForeignIssuerRequest {
  /** Объект запроса формирования отчета. */
  generateDivForeignIssuerReport?:
    | GenerateDividendsForeignIssuerReportRequest
    | undefined;
  /** Объект запроса сформированного отчета. */
  getDivForeignIssuerReport?: GetDividendsForeignIssuerReportRequest | undefined;
}

export interface GetDividendsForeignIssuerResponse {
  /** Объект результата задачи запуска формирования отчета. */
  generateDivForeignIssuerReportResponse?:
    | GenerateDividendsForeignIssuerReportResponse
    | undefined;
  /** Отчет «Справка о доходах за пределами РФ». */
  divForeignIssuerReport?: GetDividendsForeignIssuerReportResponse | undefined;
}

/** Объект запроса формирования отчета «Справка о доходах за пределами РФ». */
export interface GenerateDividendsForeignIssuerReportRequest {
  /** Идентификатор счета клиента. */
  accountId: string;
  /** Начало периода по UTC. */
  from?:
    | Date
    | undefined;
  /** Окончание периода по UTC. Как правило, можно сформировать отчет по дату на несколько дней меньше текущей. Начало и окончание периода должны быть в рамках одного календарного года. */
  to?: Date | undefined;
}

/** Объект запроса сформированного отчета «Справка о доходах за пределами РФ». */
export interface GetDividendsForeignIssuerReportRequest {
  /** Идентификатор задачи формирования отчета. */
  taskId: string;
  /** Номер страницы отчета (начинается с 0), значение по умолчанию: 0. */
  page?: number | undefined;
}

/** Объект результата задачи запуска формирования отчета «Справка о доходах за пределами РФ». */
export interface GenerateDividendsForeignIssuerReportResponse {
  /** Идентификатор задачи формирования отчета. */
  taskId: string;
}

export interface GetDividendsForeignIssuerReportResponse {
  dividendsForeignIssuerReport: DividendsForeignIssuerReport[];
  /** Количество записей в отчете. */
  itemsCount: number;
  /** Количество страниц с данными отчета, начинается с 0. */
  pagesCount: number;
  /** Текущая страница, начинается с 0. */
  page: number;
}

/** Отчет «Справка о доходах за пределами РФ». */
export interface DividendsForeignIssuerReport {
  /** Дата фиксации реестра. */
  recordDate?:
    | Date
    | undefined;
  /** Дата выплаты. */
  paymentDate?:
    | Date
    | undefined;
  /** Наименование ценной бумаги. */
  securityName: string;
  /** ISIN-идентификатор ценной бумаги. */
  isin: string;
  /** Страна эмитента. Для депозитарных расписок указывается страна эмитента базового актива. */
  issuerCountry: string;
  /** Количество ценных бумаг. */
  quantity: number;
  /** Выплаты на одну бумагу */
  dividend?:
    | Quotation
    | undefined;
  /** Комиссия внешних платежных агентов. */
  externalCommission?:
    | Quotation
    | undefined;
  /** Сумма до удержания налога. */
  dividendGross?:
    | Quotation
    | undefined;
  /** Сумма налога, удержанного агентом. */
  tax?:
    | Quotation
    | undefined;
  /** Итоговая сумма выплаты. */
  dividendAmount?:
    | Quotation
    | undefined;
  /** Валюта. */
  currency: string;
}

/** Запрос установки stream-соединения. */
export interface PortfolioStreamRequest {
  /** Массив идентификаторов счетов пользователя. */
  accounts: string[];
  /** Запрос настройки пинга. */
  pingSettings?: PingDelaySettings | undefined;
}

/** Информация по позициям и доходностям портфелей. */
export interface PortfolioStreamResponse {
  /** Объект результата подписки. */
  subscriptions?:
    | PortfolioSubscriptionResult
    | undefined;
  /** Объект стриминга портфеля. */
  portfolio?:
    | PortfolioResponse
    | undefined;
  /** Проверка активности стрима. */
  ping?: Ping | undefined;
}

/** Объект результата подписки. */
export interface PortfolioSubscriptionResult {
  /** Массив счетов клиента. */
  accounts: AccountSubscriptionStatus[];
  /** Уникальный идентификатор запроса, подробнее: [tracking_id](/invest/intro/developer/protocols/grpc#tracking-id). */
  trackingId: string;
  /** Идентификатор открытого соединения */
  streamId: string;
}

/** Счет клиента. */
export interface AccountSubscriptionStatus {
  /** Идентификатор счета. */
  accountId: string;
  /** Результат подписки. */
  subscriptionStatus: PortfolioSubscriptionStatus;
}

/** Запрос списка операций по счету с пагинацией. */
export interface GetOperationsByCursorRequest {
  /** Идентификатор счета клиента, обязательный параметр. Остальные параметры опциональны. */
  accountId: string;
  /** Идентификатор инструмента. Принимает значение `figi`, `instrument_uid` или `ticker + '_' + class_code`. */
  instrumentId?:
    | string
    | undefined;
  /** Начало периода по UTC. */
  from?:
    | Date
    | undefined;
  /** Окончание периода по UTC. */
  to?:
    | Date
    | undefined;
  /** Идентификатор элемента, с которого начать формировать ответ. */
  cursor?:
    | string
    | undefined;
  /** Лимит количества операций. По умолчанию — `100`, максимальное значение — `1000`. */
  limit?:
    | number
    | undefined;
  /** Тип операции. Принимает значение из списка `OperationType`. */
  operationTypes: OperationType[];
  /** Статус запрашиваемых операций. Возможные значения указаны в `OperationState`. */
  state?:
    | OperationState
    | undefined;
  /** Флаг возврата комиссии. По умолчанию — `false`. */
  withoutCommissions?:
    | boolean
    | undefined;
  /** Флаг получения ответа без массива сделок. */
  withoutTrades?:
    | boolean
    | undefined;
  /** Флаг показа overnight операций. */
  withoutOvernights?: boolean | undefined;
}

/** Список операций по счету с пагинацией. */
export interface GetOperationsByCursorResponse {
  /** Признак, есть ли следующий элемент. */
  hasNext: boolean;
  /** Следующий курсор. */
  nextCursor: string;
  /** Список операций. */
  items: OperationItem[];
}

/** Данные об операции. */
export interface OperationItem {
  /** Курсор. */
  cursor: string;
  /** Номер счета клиента. */
  brokerAccountId: string;
  /** Идентификатор операции, может меняться с течением времени. */
  id: string;
  /** Идентификатор родительской операции. Может измениться, если изменился ID родительской операции. */
  parentOperationId: string;
  /** Название операции. */
  name: string;
  /** Дата поручения. */
  date?:
    | Date
    | undefined;
  /** Тип операции. */
  type: OperationType;
  /** Описание операции. */
  description: string;
  /** Статус поручения. */
  state: OperationState;
  /** Уникальный идентификатор инструмента. */
  instrumentUid: string;
  /** FIGI. */
  figi: string;
  /** Тип инструмента. */
  instrumentType: string;
  /** Тип инструмента. */
  instrumentKind: InstrumentType;
  /** Уникальный идентификатор позиции. */
  positionUid: string;
  /** Тикер инструмента. */
  ticker: string;
  /** Класс-код (секция торгов). */
  classCode: string;
  /** Сумма операции. */
  payment?:
    | MoneyValue
    | undefined;
  /** Цена операции за 1 инструмент. */
  price?:
    | MoneyValue
    | undefined;
  /** Комиссия. */
  commission?:
    | MoneyValue
    | undefined;
  /** Доходность. */
  yield?:
    | MoneyValue
    | undefined;
  /** Относительная доходность. */
  yieldRelative?:
    | Quotation
    | undefined;
  /** Накопленный купонный доход. */
  accruedInt?:
    | MoneyValue
    | undefined;
  /** Количество единиц инструмента. */
  quantity: number;
  /** Неисполненный остаток по сделке. */
  quantityRest: number;
  /** Исполненный остаток. */
  quantityDone: number;
  /** Дата и время снятия заявки. */
  cancelDateTime?:
    | Date
    | undefined;
  /** Причина отмены операции. */
  cancelReason: string;
  /** Массив сделок. */
  tradesInfo?:
    | OperationItemTrades
    | undefined;
  /** Идентификатор актива. */
  assetUid: string;
  /** Массив дочерних операций. */
  childOperations: ChildOperationItem[];
}

/** Массив с информацией о сделках. */
export interface OperationItemTrades {
  trades: OperationItemTrade[];
}

/** Сделка по операции. */
export interface OperationItemTrade {
  /** Номер сделки. */
  num: string;
  /** Дата сделки. */
  date?:
    | Date
    | undefined;
  /** Количество в единицах. */
  quantity: number;
  /** Цена. */
  price?:
    | MoneyValue
    | undefined;
  /** Доходность. */
  yield?:
    | MoneyValue
    | undefined;
  /** Относительная доходность. */
  yieldRelative?: Quotation | undefined;
}

/** Запрос установки stream-соединения позиций. */
export interface PositionsStreamRequest {
  /** Массив идентификаторов счетов пользователя. */
  accounts: string[];
  /** Получение состояния позиций на момент подключения. */
  withInitialPositions: boolean;
  /** Запрос настройки пинга. */
  pingSettings?: PingDelaySettings | undefined;
}

/** Информация по изменению позиций портфеля. */
export interface PositionsStreamResponse {
  /** Объект результата подписки. */
  subscriptions?:
    | PositionsSubscriptionResult
    | undefined;
  /** Объект стриминга позиций. */
  position?:
    | PositionData
    | undefined;
  /** Проверка активности стрима. */
  ping?:
    | Ping
    | undefined;
  /** Текущие позиции. */
  initialPositions?: PositionsResponse | undefined;
}

/** Объект результата подписки. */
export interface PositionsSubscriptionResult {
  /** Массив счетов клиента. */
  accounts: PositionsSubscriptionStatus[];
  /** Уникальный идентификатор запроса, подробнее: [tracking_id](/invest/intro/developer/protocols/grpc#tracking-id). */
  trackingId: string;
  /** Идентификатор открытого соединения */
  streamId: string;
}

/** Счет клиента. */
export interface PositionsSubscriptionStatus {
  /** Идентификатор счета. */
  accountId: string;
  /** Результат подписки. */
  subscriptionStatus: PositionsAccountSubscriptionStatus;
}

/** Данные о позиции портфеля. */
export interface PositionData {
  /** Идентификатор счета. */
  accountId: string;
  /** Массив валютных позиций портфеля. */
  money: PositionsMoney[];
  /** Список ценно-бумажных позиций портфеля. */
  securities: PositionsSecurities[];
  /** Список фьючерсов портфеля. */
  futures: PositionsFutures[];
  /** Список опционов портфеля. */
  options: PositionsOptions[];
  /** Дата и время операции в формате UTC. */
  date?: Date | undefined;
}

/** Валютная позиция портфеля. */
export interface PositionsMoney {
  /** Доступное количество валютный позиций. */
  availableValue?:
    | MoneyValue
    | undefined;
  /** Заблокированное количество валютных позиций. */
  blockedValue?: MoneyValue | undefined;
}

export interface ChildOperationItem {
  /** Уникальный идентификатор инструмента. */
  instrumentUid: string;
  /** Сумма операции. */
  payment?: MoneyValue | undefined;
}

/** Запрос установки stream-соединения операций. */
export interface OperationsStreamRequest {
  /** Массив идентификаторов счетов пользователя. */
  accounts: string[];
  /** Запрос настройки пинга. */
  pingSettings?: PingDelaySettings | undefined;
}

/** Информация по операциям. */
export interface OperationsStreamResponse {
  /** Объект результата подписки. */
  subscriptions?:
    | OperationsSubscriptionResult
    | undefined;
  /** Объект стриминга операций. */
  operation?:
    | OperationData
    | undefined;
  /** Проверка активности стрима. */
  ping?: Ping | undefined;
}

/** Объект результата подписки. */
export interface OperationsSubscriptionResult {
  /** Массив счетов клиента. */
  accounts: string[];
  /** Результат подписки. */
  subscriptionStatus: OperationsAccountSubscriptionStatus;
  /** Уникальный идентификатор запроса, подробнее: [tracking_id](/invest/intro/developer/protocols/grpc#tracking-id). */
  trackingId: string;
  /** Идентификатор открытого соединения */
  streamId: string;
}

/** Данные об операции. */
export interface OperationData {
  /** Идентификатор счета. */
  brokerAccountId: string;
  /** Номер поручения. */
  id: string;
  /** Номер родительского поручения. */
  parentOperationId: string;
  /** Название инструмента. */
  name: string;
  /** Дата. */
  date?:
    | Date
    | undefined;
  /** Тип операции. */
  type: OperationType;
  /** Статус поручения. */
  state: OperationState;
  /** Уникальный идентификатор инструмента. */
  instrumentUid: string;
  /** FIGI-идентификатор инструмента. */
  figi: string;
  /** Тип инструмента. */
  instrumentType: string;
  /** Тип инструмента. */
  instrumentKind: InstrumentType;
  /** Идентификатор позиции. */
  positionUid: string;
  /** Тикер инструмента. */
  ticker: string;
  /** Класс-код (секция торгов). */
  classCode: string;
  /** Сумма операции. */
  payment?: MoneyValue | undefined;
}

function createBaseOperationsRequest(): OperationsRequest {
  return { accountId: "", from: undefined, to: undefined, state: undefined, figi: undefined };
}

export const OperationsRequest = {
  encode(message: OperationsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    if (message.from !== undefined) {
      Timestamp.encode(toTimestamp(message.from), writer.uint32(18).fork()).ldelim();
    }
    if (message.to !== undefined) {
      Timestamp.encode(toTimestamp(message.to), writer.uint32(26).fork()).ldelim();
    }
    if (message.state !== undefined) {
      writer.uint32(32).int32(message.state);
    }
    if (message.figi !== undefined) {
      writer.uint32(42).string(message.figi);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationsRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationsRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.from = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.to = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 4:
          if (tag !== 32) {
            break;
          }

          message.state = reader.int32() as any;
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.figi = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationsRequest {
    return {
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      from: isSet(object.from) ? fromJsonTimestamp(object.from) : undefined,
      to: isSet(object.to) ? fromJsonTimestamp(object.to) : undefined,
      state: isSet(object.state) ? operationStateFromJSON(object.state) : undefined,
      figi: isSet(object.figi) ? globalThis.String(object.figi) : undefined,
    };
  },

  toJSON(message: OperationsRequest): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.from !== undefined) {
      obj.from = message.from.toISOString();
    }
    if (message.to !== undefined) {
      obj.to = message.to.toISOString();
    }
    if (message.state !== undefined) {
      obj.state = operationStateToJSON(message.state);
    }
    if (message.figi !== undefined) {
      obj.figi = message.figi;
    }
    return obj;
  },
};

function createBaseOperationsResponse(): OperationsResponse {
  return { operations: [] };
}

export const OperationsResponse = {
  encode(message: OperationsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.operations) {
      Operation.encode(v!, writer.uint32(10).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationsResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationsResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.operations.push(Operation.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationsResponse {
    return {
      operations: globalThis.Array.isArray(object?.operations)
        ? object.operations.map((e: any) => Operation.fromJSON(e))
        : [],
    };
  },

  toJSON(message: OperationsResponse): unknown {
    const obj: any = {};
    if (message.operations?.length) {
      obj.operations = message.operations.map((e) => Operation.toJSON(e));
    }
    return obj;
  },
};

function createBaseOperation(): Operation {
  return {
    id: "",
    parentOperationId: "",
    currency: "",
    payment: undefined,
    price: undefined,
    state: 0,
    quantity: 0,
    quantityRest: 0,
    figi: "",
    instrumentType: "",
    date: undefined,
    type: "",
    operationType: 0,
    trades: [],
    assetUid: "",
    positionUid: "",
    instrumentUid: "",
    childOperations: [],
  };
}

export const Operation = {
  encode(message: Operation, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.id !== "") {
      writer.uint32(10).string(message.id);
    }
    if (message.parentOperationId !== "") {
      writer.uint32(18).string(message.parentOperationId);
    }
    if (message.currency !== "") {
      writer.uint32(26).string(message.currency);
    }
    if (message.payment !== undefined) {
      MoneyValue.encode(message.payment, writer.uint32(34).fork()).ldelim();
    }
    if (message.price !== undefined) {
      MoneyValue.encode(message.price, writer.uint32(42).fork()).ldelim();
    }
    if (message.state !== 0) {
      writer.uint32(48).int32(message.state);
    }
    if (message.quantity !== 0) {
      writer.uint32(56).int64(message.quantity);
    }
    if (message.quantityRest !== 0) {
      writer.uint32(64).int64(message.quantityRest);
    }
    if (message.figi !== "") {
      writer.uint32(74).string(message.figi);
    }
    if (message.instrumentType !== "") {
      writer.uint32(82).string(message.instrumentType);
    }
    if (message.date !== undefined) {
      Timestamp.encode(toTimestamp(message.date), writer.uint32(90).fork()).ldelim();
    }
    if (message.type !== "") {
      writer.uint32(98).string(message.type);
    }
    if (message.operationType !== 0) {
      writer.uint32(104).int32(message.operationType);
    }
    for (const v of message.trades) {
      OperationTrade.encode(v!, writer.uint32(114).fork()).ldelim();
    }
    if (message.assetUid !== "") {
      writer.uint32(130).string(message.assetUid);
    }
    if (message.positionUid !== "") {
      writer.uint32(138).string(message.positionUid);
    }
    if (message.instrumentUid !== "") {
      writer.uint32(146).string(message.instrumentUid);
    }
    for (const v of message.childOperations) {
      ChildOperationItem.encode(v!, writer.uint32(154).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): Operation {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperation();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.id = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.parentOperationId = reader.string();
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.currency = reader.string();
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.payment = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.price = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 6:
          if (tag !== 48) {
            break;
          }

          message.state = reader.int32() as any;
          continue;
        case 7:
          if (tag !== 56) {
            break;
          }

          message.quantity = longToNumber(reader.int64() as Long);
          continue;
        case 8:
          if (tag !== 64) {
            break;
          }

          message.quantityRest = longToNumber(reader.int64() as Long);
          continue;
        case 9:
          if (tag !== 74) {
            break;
          }

          message.figi = reader.string();
          continue;
        case 10:
          if (tag !== 82) {
            break;
          }

          message.instrumentType = reader.string();
          continue;
        case 11:
          if (tag !== 90) {
            break;
          }

          message.date = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 12:
          if (tag !== 98) {
            break;
          }

          message.type = reader.string();
          continue;
        case 13:
          if (tag !== 104) {
            break;
          }

          message.operationType = reader.int32() as any;
          continue;
        case 14:
          if (tag !== 114) {
            break;
          }

          message.trades.push(OperationTrade.decode(reader, reader.uint32()));
          continue;
        case 16:
          if (tag !== 130) {
            break;
          }

          message.assetUid = reader.string();
          continue;
        case 17:
          if (tag !== 138) {
            break;
          }

          message.positionUid = reader.string();
          continue;
        case 18:
          if (tag !== 146) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 19:
          if (tag !== 154) {
            break;
          }

          message.childOperations.push(ChildOperationItem.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): Operation {
    return {
      id: isSet(object.id) ? globalThis.String(object.id) : "",
      parentOperationId: isSet(object.parentOperationId) ? globalThis.String(object.parentOperationId) : "",
      currency: isSet(object.currency) ? globalThis.String(object.currency) : "",
      payment: isSet(object.payment) ? MoneyValue.fromJSON(object.payment) : undefined,
      price: isSet(object.price) ? MoneyValue.fromJSON(object.price) : undefined,
      state: isSet(object.state) ? operationStateFromJSON(object.state) : 0,
      quantity: isSet(object.quantity) ? globalThis.Number(object.quantity) : 0,
      quantityRest: isSet(object.quantityRest) ? globalThis.Number(object.quantityRest) : 0,
      figi: isSet(object.figi) ? globalThis.String(object.figi) : "",
      instrumentType: isSet(object.instrumentType) ? globalThis.String(object.instrumentType) : "",
      date: isSet(object.date) ? fromJsonTimestamp(object.date) : undefined,
      type: isSet(object.type) ? globalThis.String(object.type) : "",
      operationType: isSet(object.operationType) ? operationTypeFromJSON(object.operationType) : 0,
      trades: globalThis.Array.isArray(object?.trades) ? object.trades.map((e: any) => OperationTrade.fromJSON(e)) : [],
      assetUid: isSet(object.assetUid) ? globalThis.String(object.assetUid) : "",
      positionUid: isSet(object.positionUid) ? globalThis.String(object.positionUid) : "",
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      childOperations: globalThis.Array.isArray(object?.childOperations)
        ? object.childOperations.map((e: any) => ChildOperationItem.fromJSON(e))
        : [],
    };
  },

  toJSON(message: Operation): unknown {
    const obj: any = {};
    if (message.id !== "") {
      obj.id = message.id;
    }
    if (message.parentOperationId !== "") {
      obj.parentOperationId = message.parentOperationId;
    }
    if (message.currency !== "") {
      obj.currency = message.currency;
    }
    if (message.payment !== undefined) {
      obj.payment = MoneyValue.toJSON(message.payment);
    }
    if (message.price !== undefined) {
      obj.price = MoneyValue.toJSON(message.price);
    }
    if (message.state !== 0) {
      obj.state = operationStateToJSON(message.state);
    }
    if (message.quantity !== 0) {
      obj.quantity = Math.round(message.quantity);
    }
    if (message.quantityRest !== 0) {
      obj.quantityRest = Math.round(message.quantityRest);
    }
    if (message.figi !== "") {
      obj.figi = message.figi;
    }
    if (message.instrumentType !== "") {
      obj.instrumentType = message.instrumentType;
    }
    if (message.date !== undefined) {
      obj.date = message.date.toISOString();
    }
    if (message.type !== "") {
      obj.type = message.type;
    }
    if (message.operationType !== 0) {
      obj.operationType = operationTypeToJSON(message.operationType);
    }
    if (message.trades?.length) {
      obj.trades = message.trades.map((e) => OperationTrade.toJSON(e));
    }
    if (message.assetUid !== "") {
      obj.assetUid = message.assetUid;
    }
    if (message.positionUid !== "") {
      obj.positionUid = message.positionUid;
    }
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.childOperations?.length) {
      obj.childOperations = message.childOperations.map((e) => ChildOperationItem.toJSON(e));
    }
    return obj;
  },
};

function createBaseOperationTrade(): OperationTrade {
  return { tradeId: "", dateTime: undefined, quantity: 0, price: undefined };
}

export const OperationTrade = {
  encode(message: OperationTrade, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.tradeId !== "") {
      writer.uint32(10).string(message.tradeId);
    }
    if (message.dateTime !== undefined) {
      Timestamp.encode(toTimestamp(message.dateTime), writer.uint32(18).fork()).ldelim();
    }
    if (message.quantity !== 0) {
      writer.uint32(24).int64(message.quantity);
    }
    if (message.price !== undefined) {
      MoneyValue.encode(message.price, writer.uint32(34).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationTrade {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationTrade();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.tradeId = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.dateTime = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 3:
          if (tag !== 24) {
            break;
          }

          message.quantity = longToNumber(reader.int64() as Long);
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.price = MoneyValue.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationTrade {
    return {
      tradeId: isSet(object.tradeId) ? globalThis.String(object.tradeId) : "",
      dateTime: isSet(object.dateTime) ? fromJsonTimestamp(object.dateTime) : undefined,
      quantity: isSet(object.quantity) ? globalThis.Number(object.quantity) : 0,
      price: isSet(object.price) ? MoneyValue.fromJSON(object.price) : undefined,
    };
  },

  toJSON(message: OperationTrade): unknown {
    const obj: any = {};
    if (message.tradeId !== "") {
      obj.tradeId = message.tradeId;
    }
    if (message.dateTime !== undefined) {
      obj.dateTime = message.dateTime.toISOString();
    }
    if (message.quantity !== 0) {
      obj.quantity = Math.round(message.quantity);
    }
    if (message.price !== undefined) {
      obj.price = MoneyValue.toJSON(message.price);
    }
    return obj;
  },
};

function createBasePortfolioRequest(): PortfolioRequest {
  return { accountId: "", currency: undefined };
}

export const PortfolioRequest = {
  encode(message: PortfolioRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    if (message.currency !== undefined) {
      writer.uint32(16).int32(message.currency);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PortfolioRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePortfolioRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 2:
          if (tag !== 16) {
            break;
          }

          message.currency = reader.int32() as any;
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PortfolioRequest {
    return {
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      currency: isSet(object.currency) ? portfolioRequest_CurrencyRequestFromJSON(object.currency) : undefined,
    };
  },

  toJSON(message: PortfolioRequest): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.currency !== undefined) {
      obj.currency = portfolioRequest_CurrencyRequestToJSON(message.currency);
    }
    return obj;
  },
};

function createBasePortfolioResponse(): PortfolioResponse {
  return {
    totalAmountShares: undefined,
    totalAmountBonds: undefined,
    totalAmountEtf: undefined,
    totalAmountCurrencies: undefined,
    totalAmountFutures: undefined,
    expectedYield: undefined,
    positions: [],
    accountId: "",
    totalAmountOptions: undefined,
    totalAmountSp: undefined,
    totalAmountPortfolio: undefined,
    virtualPositions: [],
    dailyYield: undefined,
    dailyYieldRelative: undefined,
    totalAmountDfa: undefined,
  };
}

export const PortfolioResponse = {
  encode(message: PortfolioResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.totalAmountShares !== undefined) {
      MoneyValue.encode(message.totalAmountShares, writer.uint32(10).fork()).ldelim();
    }
    if (message.totalAmountBonds !== undefined) {
      MoneyValue.encode(message.totalAmountBonds, writer.uint32(18).fork()).ldelim();
    }
    if (message.totalAmountEtf !== undefined) {
      MoneyValue.encode(message.totalAmountEtf, writer.uint32(26).fork()).ldelim();
    }
    if (message.totalAmountCurrencies !== undefined) {
      MoneyValue.encode(message.totalAmountCurrencies, writer.uint32(34).fork()).ldelim();
    }
    if (message.totalAmountFutures !== undefined) {
      MoneyValue.encode(message.totalAmountFutures, writer.uint32(42).fork()).ldelim();
    }
    if (message.expectedYield !== undefined) {
      Quotation.encode(message.expectedYield, writer.uint32(50).fork()).ldelim();
    }
    for (const v of message.positions) {
      PortfolioPosition.encode(v!, writer.uint32(58).fork()).ldelim();
    }
    if (message.accountId !== "") {
      writer.uint32(66).string(message.accountId);
    }
    if (message.totalAmountOptions !== undefined) {
      MoneyValue.encode(message.totalAmountOptions, writer.uint32(74).fork()).ldelim();
    }
    if (message.totalAmountSp !== undefined) {
      MoneyValue.encode(message.totalAmountSp, writer.uint32(82).fork()).ldelim();
    }
    if (message.totalAmountPortfolio !== undefined) {
      MoneyValue.encode(message.totalAmountPortfolio, writer.uint32(90).fork()).ldelim();
    }
    for (const v of message.virtualPositions) {
      VirtualPortfolioPosition.encode(v!, writer.uint32(98).fork()).ldelim();
    }
    if (message.dailyYield !== undefined) {
      MoneyValue.encode(message.dailyYield, writer.uint32(122).fork()).ldelim();
    }
    if (message.dailyYieldRelative !== undefined) {
      Quotation.encode(message.dailyYieldRelative, writer.uint32(130).fork()).ldelim();
    }
    if (message.totalAmountDfa !== undefined) {
      MoneyValue.encode(message.totalAmountDfa, writer.uint32(138).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PortfolioResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePortfolioResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.totalAmountShares = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.totalAmountBonds = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.totalAmountEtf = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.totalAmountCurrencies = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.totalAmountFutures = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.expectedYield = Quotation.decode(reader, reader.uint32());
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.positions.push(PortfolioPosition.decode(reader, reader.uint32()));
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 9:
          if (tag !== 74) {
            break;
          }

          message.totalAmountOptions = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 10:
          if (tag !== 82) {
            break;
          }

          message.totalAmountSp = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 11:
          if (tag !== 90) {
            break;
          }

          message.totalAmountPortfolio = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 12:
          if (tag !== 98) {
            break;
          }

          message.virtualPositions.push(VirtualPortfolioPosition.decode(reader, reader.uint32()));
          continue;
        case 15:
          if (tag !== 122) {
            break;
          }

          message.dailyYield = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 16:
          if (tag !== 130) {
            break;
          }

          message.dailyYieldRelative = Quotation.decode(reader, reader.uint32());
          continue;
        case 17:
          if (tag !== 138) {
            break;
          }

          message.totalAmountDfa = MoneyValue.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PortfolioResponse {
    return {
      totalAmountShares: isSet(object.totalAmountShares) ? MoneyValue.fromJSON(object.totalAmountShares) : undefined,
      totalAmountBonds: isSet(object.totalAmountBonds) ? MoneyValue.fromJSON(object.totalAmountBonds) : undefined,
      totalAmountEtf: isSet(object.totalAmountEtf) ? MoneyValue.fromJSON(object.totalAmountEtf) : undefined,
      totalAmountCurrencies: isSet(object.totalAmountCurrencies)
        ? MoneyValue.fromJSON(object.totalAmountCurrencies)
        : undefined,
      totalAmountFutures: isSet(object.totalAmountFutures) ? MoneyValue.fromJSON(object.totalAmountFutures) : undefined,
      expectedYield: isSet(object.expectedYield) ? Quotation.fromJSON(object.expectedYield) : undefined,
      positions: globalThis.Array.isArray(object?.positions)
        ? object.positions.map((e: any) => PortfolioPosition.fromJSON(e))
        : [],
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      totalAmountOptions: isSet(object.totalAmountOptions) ? MoneyValue.fromJSON(object.totalAmountOptions) : undefined,
      totalAmountSp: isSet(object.totalAmountSp) ? MoneyValue.fromJSON(object.totalAmountSp) : undefined,
      totalAmountPortfolio: isSet(object.totalAmountPortfolio)
        ? MoneyValue.fromJSON(object.totalAmountPortfolio)
        : undefined,
      virtualPositions: globalThis.Array.isArray(object?.virtualPositions)
        ? object.virtualPositions.map((e: any) => VirtualPortfolioPosition.fromJSON(e))
        : [],
      dailyYield: isSet(object.dailyYield) ? MoneyValue.fromJSON(object.dailyYield) : undefined,
      dailyYieldRelative: isSet(object.dailyYieldRelative) ? Quotation.fromJSON(object.dailyYieldRelative) : undefined,
      totalAmountDfa: isSet(object.totalAmountDfa) ? MoneyValue.fromJSON(object.totalAmountDfa) : undefined,
    };
  },

  toJSON(message: PortfolioResponse): unknown {
    const obj: any = {};
    if (message.totalAmountShares !== undefined) {
      obj.totalAmountShares = MoneyValue.toJSON(message.totalAmountShares);
    }
    if (message.totalAmountBonds !== undefined) {
      obj.totalAmountBonds = MoneyValue.toJSON(message.totalAmountBonds);
    }
    if (message.totalAmountEtf !== undefined) {
      obj.totalAmountEtf = MoneyValue.toJSON(message.totalAmountEtf);
    }
    if (message.totalAmountCurrencies !== undefined) {
      obj.totalAmountCurrencies = MoneyValue.toJSON(message.totalAmountCurrencies);
    }
    if (message.totalAmountFutures !== undefined) {
      obj.totalAmountFutures = MoneyValue.toJSON(message.totalAmountFutures);
    }
    if (message.expectedYield !== undefined) {
      obj.expectedYield = Quotation.toJSON(message.expectedYield);
    }
    if (message.positions?.length) {
      obj.positions = message.positions.map((e) => PortfolioPosition.toJSON(e));
    }
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.totalAmountOptions !== undefined) {
      obj.totalAmountOptions = MoneyValue.toJSON(message.totalAmountOptions);
    }
    if (message.totalAmountSp !== undefined) {
      obj.totalAmountSp = MoneyValue.toJSON(message.totalAmountSp);
    }
    if (message.totalAmountPortfolio !== undefined) {
      obj.totalAmountPortfolio = MoneyValue.toJSON(message.totalAmountPortfolio);
    }
    if (message.virtualPositions?.length) {
      obj.virtualPositions = message.virtualPositions.map((e) => VirtualPortfolioPosition.toJSON(e));
    }
    if (message.dailyYield !== undefined) {
      obj.dailyYield = MoneyValue.toJSON(message.dailyYield);
    }
    if (message.dailyYieldRelative !== undefined) {
      obj.dailyYieldRelative = Quotation.toJSON(message.dailyYieldRelative);
    }
    if (message.totalAmountDfa !== undefined) {
      obj.totalAmountDfa = MoneyValue.toJSON(message.totalAmountDfa);
    }
    return obj;
  },
};

function createBasePositionsRequest(): PositionsRequest {
  return { accountId: "" };
}

export const PositionsRequest = {
  encode(message: PositionsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsRequest {
    return { accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "" };
  },

  toJSON(message: PositionsRequest): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    return obj;
  },
};

function createBasePositionsResponse(): PositionsResponse {
  return {
    money: [],
    blocked: [],
    securities: [],
    limitsLoadingInProgress: false,
    futures: [],
    options: [],
    accountId: "",
  };
}

export const PositionsResponse = {
  encode(message: PositionsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.money) {
      MoneyValue.encode(v!, writer.uint32(10).fork()).ldelim();
    }
    for (const v of message.blocked) {
      MoneyValue.encode(v!, writer.uint32(18).fork()).ldelim();
    }
    for (const v of message.securities) {
      PositionsSecurities.encode(v!, writer.uint32(26).fork()).ldelim();
    }
    if (message.limitsLoadingInProgress === true) {
      writer.uint32(32).bool(message.limitsLoadingInProgress);
    }
    for (const v of message.futures) {
      PositionsFutures.encode(v!, writer.uint32(42).fork()).ldelim();
    }
    for (const v of message.options) {
      PositionsOptions.encode(v!, writer.uint32(50).fork()).ldelim();
    }
    if (message.accountId !== "") {
      writer.uint32(122).string(message.accountId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.money.push(MoneyValue.decode(reader, reader.uint32()));
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.blocked.push(MoneyValue.decode(reader, reader.uint32()));
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.securities.push(PositionsSecurities.decode(reader, reader.uint32()));
          continue;
        case 4:
          if (tag !== 32) {
            break;
          }

          message.limitsLoadingInProgress = reader.bool();
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.futures.push(PositionsFutures.decode(reader, reader.uint32()));
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.options.push(PositionsOptions.decode(reader, reader.uint32()));
          continue;
        case 15:
          if (tag !== 122) {
            break;
          }

          message.accountId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsResponse {
    return {
      money: globalThis.Array.isArray(object?.money) ? object.money.map((e: any) => MoneyValue.fromJSON(e)) : [],
      blocked: globalThis.Array.isArray(object?.blocked) ? object.blocked.map((e: any) => MoneyValue.fromJSON(e)) : [],
      securities: globalThis.Array.isArray(object?.securities)
        ? object.securities.map((e: any) => PositionsSecurities.fromJSON(e))
        : [],
      limitsLoadingInProgress: isSet(object.limitsLoadingInProgress)
        ? globalThis.Boolean(object.limitsLoadingInProgress)
        : false,
      futures: globalThis.Array.isArray(object?.futures)
        ? object.futures.map((e: any) => PositionsFutures.fromJSON(e))
        : [],
      options: globalThis.Array.isArray(object?.options)
        ? object.options.map((e: any) => PositionsOptions.fromJSON(e))
        : [],
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
    };
  },

  toJSON(message: PositionsResponse): unknown {
    const obj: any = {};
    if (message.money?.length) {
      obj.money = message.money.map((e) => MoneyValue.toJSON(e));
    }
    if (message.blocked?.length) {
      obj.blocked = message.blocked.map((e) => MoneyValue.toJSON(e));
    }
    if (message.securities?.length) {
      obj.securities = message.securities.map((e) => PositionsSecurities.toJSON(e));
    }
    if (message.limitsLoadingInProgress === true) {
      obj.limitsLoadingInProgress = message.limitsLoadingInProgress;
    }
    if (message.futures?.length) {
      obj.futures = message.futures.map((e) => PositionsFutures.toJSON(e));
    }
    if (message.options?.length) {
      obj.options = message.options.map((e) => PositionsOptions.toJSON(e));
    }
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    return obj;
  },
};

function createBaseWithdrawLimitsRequest(): WithdrawLimitsRequest {
  return { accountId: "" };
}

export const WithdrawLimitsRequest = {
  encode(message: WithdrawLimitsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): WithdrawLimitsRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseWithdrawLimitsRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): WithdrawLimitsRequest {
    return { accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "" };
  },

  toJSON(message: WithdrawLimitsRequest): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    return obj;
  },
};

function createBaseWithdrawLimitsResponse(): WithdrawLimitsResponse {
  return { money: [], blocked: [], blockedGuarantee: [] };
}

export const WithdrawLimitsResponse = {
  encode(message: WithdrawLimitsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.money) {
      MoneyValue.encode(v!, writer.uint32(10).fork()).ldelim();
    }
    for (const v of message.blocked) {
      MoneyValue.encode(v!, writer.uint32(18).fork()).ldelim();
    }
    for (const v of message.blockedGuarantee) {
      MoneyValue.encode(v!, writer.uint32(26).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): WithdrawLimitsResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseWithdrawLimitsResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.money.push(MoneyValue.decode(reader, reader.uint32()));
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.blocked.push(MoneyValue.decode(reader, reader.uint32()));
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.blockedGuarantee.push(MoneyValue.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): WithdrawLimitsResponse {
    return {
      money: globalThis.Array.isArray(object?.money) ? object.money.map((e: any) => MoneyValue.fromJSON(e)) : [],
      blocked: globalThis.Array.isArray(object?.blocked) ? object.blocked.map((e: any) => MoneyValue.fromJSON(e)) : [],
      blockedGuarantee: globalThis.Array.isArray(object?.blockedGuarantee)
        ? object.blockedGuarantee.map((e: any) => MoneyValue.fromJSON(e))
        : [],
    };
  },

  toJSON(message: WithdrawLimitsResponse): unknown {
    const obj: any = {};
    if (message.money?.length) {
      obj.money = message.money.map((e) => MoneyValue.toJSON(e));
    }
    if (message.blocked?.length) {
      obj.blocked = message.blocked.map((e) => MoneyValue.toJSON(e));
    }
    if (message.blockedGuarantee?.length) {
      obj.blockedGuarantee = message.blockedGuarantee.map((e) => MoneyValue.toJSON(e));
    }
    return obj;
  },
};

function createBasePortfolioPosition(): PortfolioPosition {
  return {
    figi: "",
    instrumentType: "",
    quantity: undefined,
    averagePositionPrice: undefined,
    expectedYield: undefined,
    currentNkd: undefined,
    averagePositionPricePt: undefined,
    currentPrice: undefined,
    averagePositionPriceFifo: undefined,
    quantityLots: undefined,
    blocked: false,
    blockedLots: undefined,
    positionUid: "",
    instrumentUid: "",
    varMargin: undefined,
    expectedYieldFifo: undefined,
    dailyYield: undefined,
    ticker: "",
    classCode: "",
    varMarginSettled: undefined,
  };
}

export const PortfolioPosition = {
  encode(message: PortfolioPosition, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.figi !== "") {
      writer.uint32(10).string(message.figi);
    }
    if (message.instrumentType !== "") {
      writer.uint32(18).string(message.instrumentType);
    }
    if (message.quantity !== undefined) {
      Quotation.encode(message.quantity, writer.uint32(26).fork()).ldelim();
    }
    if (message.averagePositionPrice !== undefined) {
      MoneyValue.encode(message.averagePositionPrice, writer.uint32(34).fork()).ldelim();
    }
    if (message.expectedYield !== undefined) {
      Quotation.encode(message.expectedYield, writer.uint32(42).fork()).ldelim();
    }
    if (message.currentNkd !== undefined) {
      MoneyValue.encode(message.currentNkd, writer.uint32(50).fork()).ldelim();
    }
    if (message.averagePositionPricePt !== undefined) {
      Quotation.encode(message.averagePositionPricePt, writer.uint32(58).fork()).ldelim();
    }
    if (message.currentPrice !== undefined) {
      MoneyValue.encode(message.currentPrice, writer.uint32(66).fork()).ldelim();
    }
    if (message.averagePositionPriceFifo !== undefined) {
      MoneyValue.encode(message.averagePositionPriceFifo, writer.uint32(74).fork()).ldelim();
    }
    if (message.quantityLots !== undefined) {
      Quotation.encode(message.quantityLots, writer.uint32(82).fork()).ldelim();
    }
    if (message.blocked === true) {
      writer.uint32(168).bool(message.blocked);
    }
    if (message.blockedLots !== undefined) {
      Quotation.encode(message.blockedLots, writer.uint32(178).fork()).ldelim();
    }
    if (message.positionUid !== "") {
      writer.uint32(194).string(message.positionUid);
    }
    if (message.instrumentUid !== "") {
      writer.uint32(202).string(message.instrumentUid);
    }
    if (message.varMargin !== undefined) {
      MoneyValue.encode(message.varMargin, writer.uint32(210).fork()).ldelim();
    }
    if (message.expectedYieldFifo !== undefined) {
      Quotation.encode(message.expectedYieldFifo, writer.uint32(218).fork()).ldelim();
    }
    if (message.dailyYield !== undefined) {
      MoneyValue.encode(message.dailyYield, writer.uint32(250).fork()).ldelim();
    }
    if (message.ticker !== "") {
      writer.uint32(258).string(message.ticker);
    }
    if (message.classCode !== "") {
      writer.uint32(266).string(message.classCode);
    }
    if (message.varMarginSettled !== undefined) {
      MoneyValue.encode(message.varMarginSettled, writer.uint32(274).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PortfolioPosition {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePortfolioPosition();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.figi = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.instrumentType = reader.string();
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.quantity = Quotation.decode(reader, reader.uint32());
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.averagePositionPrice = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.expectedYield = Quotation.decode(reader, reader.uint32());
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.currentNkd = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.averagePositionPricePt = Quotation.decode(reader, reader.uint32());
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.currentPrice = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 9:
          if (tag !== 74) {
            break;
          }

          message.averagePositionPriceFifo = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 10:
          if (tag !== 82) {
            break;
          }

          message.quantityLots = Quotation.decode(reader, reader.uint32());
          continue;
        case 21:
          if (tag !== 168) {
            break;
          }

          message.blocked = reader.bool();
          continue;
        case 22:
          if (tag !== 178) {
            break;
          }

          message.blockedLots = Quotation.decode(reader, reader.uint32());
          continue;
        case 24:
          if (tag !== 194) {
            break;
          }

          message.positionUid = reader.string();
          continue;
        case 25:
          if (tag !== 202) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 26:
          if (tag !== 210) {
            break;
          }

          message.varMargin = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 27:
          if (tag !== 218) {
            break;
          }

          message.expectedYieldFifo = Quotation.decode(reader, reader.uint32());
          continue;
        case 31:
          if (tag !== 250) {
            break;
          }

          message.dailyYield = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 32:
          if (tag !== 258) {
            break;
          }

          message.ticker = reader.string();
          continue;
        case 33:
          if (tag !== 266) {
            break;
          }

          message.classCode = reader.string();
          continue;
        case 34:
          if (tag !== 274) {
            break;
          }

          message.varMarginSettled = MoneyValue.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PortfolioPosition {
    return {
      figi: isSet(object.figi) ? globalThis.String(object.figi) : "",
      instrumentType: isSet(object.instrumentType) ? globalThis.String(object.instrumentType) : "",
      quantity: isSet(object.quantity) ? Quotation.fromJSON(object.quantity) : undefined,
      averagePositionPrice: isSet(object.averagePositionPrice)
        ? MoneyValue.fromJSON(object.averagePositionPrice)
        : undefined,
      expectedYield: isSet(object.expectedYield) ? Quotation.fromJSON(object.expectedYield) : undefined,
      currentNkd: isSet(object.currentNkd) ? MoneyValue.fromJSON(object.currentNkd) : undefined,
      averagePositionPricePt: isSet(object.averagePositionPricePt)
        ? Quotation.fromJSON(object.averagePositionPricePt)
        : undefined,
      currentPrice: isSet(object.currentPrice) ? MoneyValue.fromJSON(object.currentPrice) : undefined,
      averagePositionPriceFifo: isSet(object.averagePositionPriceFifo)
        ? MoneyValue.fromJSON(object.averagePositionPriceFifo)
        : undefined,
      quantityLots: isSet(object.quantityLots) ? Quotation.fromJSON(object.quantityLots) : undefined,
      blocked: isSet(object.blocked) ? globalThis.Boolean(object.blocked) : false,
      blockedLots: isSet(object.blockedLots) ? Quotation.fromJSON(object.blockedLots) : undefined,
      positionUid: isSet(object.positionUid) ? globalThis.String(object.positionUid) : "",
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      varMargin: isSet(object.varMargin) ? MoneyValue.fromJSON(object.varMargin) : undefined,
      expectedYieldFifo: isSet(object.expectedYieldFifo) ? Quotation.fromJSON(object.expectedYieldFifo) : undefined,
      dailyYield: isSet(object.dailyYield) ? MoneyValue.fromJSON(object.dailyYield) : undefined,
      ticker: isSet(object.ticker) ? globalThis.String(object.ticker) : "",
      classCode: isSet(object.classCode) ? globalThis.String(object.classCode) : "",
      varMarginSettled: isSet(object.varMarginSettled) ? MoneyValue.fromJSON(object.varMarginSettled) : undefined,
    };
  },

  toJSON(message: PortfolioPosition): unknown {
    const obj: any = {};
    if (message.figi !== "") {
      obj.figi = message.figi;
    }
    if (message.instrumentType !== "") {
      obj.instrumentType = message.instrumentType;
    }
    if (message.quantity !== undefined) {
      obj.quantity = Quotation.toJSON(message.quantity);
    }
    if (message.averagePositionPrice !== undefined) {
      obj.averagePositionPrice = MoneyValue.toJSON(message.averagePositionPrice);
    }
    if (message.expectedYield !== undefined) {
      obj.expectedYield = Quotation.toJSON(message.expectedYield);
    }
    if (message.currentNkd !== undefined) {
      obj.currentNkd = MoneyValue.toJSON(message.currentNkd);
    }
    if (message.averagePositionPricePt !== undefined) {
      obj.averagePositionPricePt = Quotation.toJSON(message.averagePositionPricePt);
    }
    if (message.currentPrice !== undefined) {
      obj.currentPrice = MoneyValue.toJSON(message.currentPrice);
    }
    if (message.averagePositionPriceFifo !== undefined) {
      obj.averagePositionPriceFifo = MoneyValue.toJSON(message.averagePositionPriceFifo);
    }
    if (message.quantityLots !== undefined) {
      obj.quantityLots = Quotation.toJSON(message.quantityLots);
    }
    if (message.blocked === true) {
      obj.blocked = message.blocked;
    }
    if (message.blockedLots !== undefined) {
      obj.blockedLots = Quotation.toJSON(message.blockedLots);
    }
    if (message.positionUid !== "") {
      obj.positionUid = message.positionUid;
    }
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.varMargin !== undefined) {
      obj.varMargin = MoneyValue.toJSON(message.varMargin);
    }
    if (message.expectedYieldFifo !== undefined) {
      obj.expectedYieldFifo = Quotation.toJSON(message.expectedYieldFifo);
    }
    if (message.dailyYield !== undefined) {
      obj.dailyYield = MoneyValue.toJSON(message.dailyYield);
    }
    if (message.ticker !== "") {
      obj.ticker = message.ticker;
    }
    if (message.classCode !== "") {
      obj.classCode = message.classCode;
    }
    if (message.varMarginSettled !== undefined) {
      obj.varMarginSettled = MoneyValue.toJSON(message.varMarginSettled);
    }
    return obj;
  },
};

function createBaseVirtualPortfolioPosition(): VirtualPortfolioPosition {
  return {
    positionUid: "",
    instrumentUid: "",
    figi: "",
    instrumentType: "",
    quantity: undefined,
    averagePositionPrice: undefined,
    expectedYield: undefined,
    expectedYieldFifo: undefined,
    expireDate: undefined,
    currentPrice: undefined,
    averagePositionPriceFifo: undefined,
    dailyYield: undefined,
    ticker: "",
    classCode: "",
  };
}

export const VirtualPortfolioPosition = {
  encode(message: VirtualPortfolioPosition, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.positionUid !== "") {
      writer.uint32(10).string(message.positionUid);
    }
    if (message.instrumentUid !== "") {
      writer.uint32(18).string(message.instrumentUid);
    }
    if (message.figi !== "") {
      writer.uint32(26).string(message.figi);
    }
    if (message.instrumentType !== "") {
      writer.uint32(34).string(message.instrumentType);
    }
    if (message.quantity !== undefined) {
      Quotation.encode(message.quantity, writer.uint32(42).fork()).ldelim();
    }
    if (message.averagePositionPrice !== undefined) {
      MoneyValue.encode(message.averagePositionPrice, writer.uint32(50).fork()).ldelim();
    }
    if (message.expectedYield !== undefined) {
      Quotation.encode(message.expectedYield, writer.uint32(58).fork()).ldelim();
    }
    if (message.expectedYieldFifo !== undefined) {
      Quotation.encode(message.expectedYieldFifo, writer.uint32(66).fork()).ldelim();
    }
    if (message.expireDate !== undefined) {
      Timestamp.encode(toTimestamp(message.expireDate), writer.uint32(74).fork()).ldelim();
    }
    if (message.currentPrice !== undefined) {
      MoneyValue.encode(message.currentPrice, writer.uint32(82).fork()).ldelim();
    }
    if (message.averagePositionPriceFifo !== undefined) {
      MoneyValue.encode(message.averagePositionPriceFifo, writer.uint32(90).fork()).ldelim();
    }
    if (message.dailyYield !== undefined) {
      MoneyValue.encode(message.dailyYield, writer.uint32(250).fork()).ldelim();
    }
    if (message.ticker !== "") {
      writer.uint32(258).string(message.ticker);
    }
    if (message.classCode !== "") {
      writer.uint32(266).string(message.classCode);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): VirtualPortfolioPosition {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseVirtualPortfolioPosition();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.positionUid = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.figi = reader.string();
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.instrumentType = reader.string();
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.quantity = Quotation.decode(reader, reader.uint32());
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.averagePositionPrice = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.expectedYield = Quotation.decode(reader, reader.uint32());
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.expectedYieldFifo = Quotation.decode(reader, reader.uint32());
          continue;
        case 9:
          if (tag !== 74) {
            break;
          }

          message.expireDate = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 10:
          if (tag !== 82) {
            break;
          }

          message.currentPrice = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 11:
          if (tag !== 90) {
            break;
          }

          message.averagePositionPriceFifo = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 31:
          if (tag !== 250) {
            break;
          }

          message.dailyYield = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 32:
          if (tag !== 258) {
            break;
          }

          message.ticker = reader.string();
          continue;
        case 33:
          if (tag !== 266) {
            break;
          }

          message.classCode = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): VirtualPortfolioPosition {
    return {
      positionUid: isSet(object.positionUid) ? globalThis.String(object.positionUid) : "",
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      figi: isSet(object.figi) ? globalThis.String(object.figi) : "",
      instrumentType: isSet(object.instrumentType) ? globalThis.String(object.instrumentType) : "",
      quantity: isSet(object.quantity) ? Quotation.fromJSON(object.quantity) : undefined,
      averagePositionPrice: isSet(object.averagePositionPrice)
        ? MoneyValue.fromJSON(object.averagePositionPrice)
        : undefined,
      expectedYield: isSet(object.expectedYield) ? Quotation.fromJSON(object.expectedYield) : undefined,
      expectedYieldFifo: isSet(object.expectedYieldFifo) ? Quotation.fromJSON(object.expectedYieldFifo) : undefined,
      expireDate: isSet(object.expireDate) ? fromJsonTimestamp(object.expireDate) : undefined,
      currentPrice: isSet(object.currentPrice) ? MoneyValue.fromJSON(object.currentPrice) : undefined,
      averagePositionPriceFifo: isSet(object.averagePositionPriceFifo)
        ? MoneyValue.fromJSON(object.averagePositionPriceFifo)
        : undefined,
      dailyYield: isSet(object.dailyYield) ? MoneyValue.fromJSON(object.dailyYield) : undefined,
      ticker: isSet(object.ticker) ? globalThis.String(object.ticker) : "",
      classCode: isSet(object.classCode) ? globalThis.String(object.classCode) : "",
    };
  },

  toJSON(message: VirtualPortfolioPosition): unknown {
    const obj: any = {};
    if (message.positionUid !== "") {
      obj.positionUid = message.positionUid;
    }
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.figi !== "") {
      obj.figi = message.figi;
    }
    if (message.instrumentType !== "") {
      obj.instrumentType = message.instrumentType;
    }
    if (message.quantity !== undefined) {
      obj.quantity = Quotation.toJSON(message.quantity);
    }
    if (message.averagePositionPrice !== undefined) {
      obj.averagePositionPrice = MoneyValue.toJSON(message.averagePositionPrice);
    }
    if (message.expectedYield !== undefined) {
      obj.expectedYield = Quotation.toJSON(message.expectedYield);
    }
    if (message.expectedYieldFifo !== undefined) {
      obj.expectedYieldFifo = Quotation.toJSON(message.expectedYieldFifo);
    }
    if (message.expireDate !== undefined) {
      obj.expireDate = message.expireDate.toISOString();
    }
    if (message.currentPrice !== undefined) {
      obj.currentPrice = MoneyValue.toJSON(message.currentPrice);
    }
    if (message.averagePositionPriceFifo !== undefined) {
      obj.averagePositionPriceFifo = MoneyValue.toJSON(message.averagePositionPriceFifo);
    }
    if (message.dailyYield !== undefined) {
      obj.dailyYield = MoneyValue.toJSON(message.dailyYield);
    }
    if (message.ticker !== "") {
      obj.ticker = message.ticker;
    }
    if (message.classCode !== "") {
      obj.classCode = message.classCode;
    }
    return obj;
  },
};

function createBasePositionsSecurities(): PositionsSecurities {
  return {
    figi: "",
    blocked: 0,
    balance: 0,
    positionUid: "",
    instrumentUid: "",
    ticker: "",
    classCode: "",
    exchangeBlocked: false,
    instrumentType: "",
  };
}

export const PositionsSecurities = {
  encode(message: PositionsSecurities, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.figi !== "") {
      writer.uint32(10).string(message.figi);
    }
    if (message.blocked !== 0) {
      writer.uint32(16).int64(message.blocked);
    }
    if (message.balance !== 0) {
      writer.uint32(24).int64(message.balance);
    }
    if (message.positionUid !== "") {
      writer.uint32(34).string(message.positionUid);
    }
    if (message.instrumentUid !== "") {
      writer.uint32(42).string(message.instrumentUid);
    }
    if (message.ticker !== "") {
      writer.uint32(50).string(message.ticker);
    }
    if (message.classCode !== "") {
      writer.uint32(58).string(message.classCode);
    }
    if (message.exchangeBlocked === true) {
      writer.uint32(88).bool(message.exchangeBlocked);
    }
    if (message.instrumentType !== "") {
      writer.uint32(130).string(message.instrumentType);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsSecurities {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsSecurities();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.figi = reader.string();
          continue;
        case 2:
          if (tag !== 16) {
            break;
          }

          message.blocked = longToNumber(reader.int64() as Long);
          continue;
        case 3:
          if (tag !== 24) {
            break;
          }

          message.balance = longToNumber(reader.int64() as Long);
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.positionUid = reader.string();
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.ticker = reader.string();
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.classCode = reader.string();
          continue;
        case 11:
          if (tag !== 88) {
            break;
          }

          message.exchangeBlocked = reader.bool();
          continue;
        case 16:
          if (tag !== 130) {
            break;
          }

          message.instrumentType = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsSecurities {
    return {
      figi: isSet(object.figi) ? globalThis.String(object.figi) : "",
      blocked: isSet(object.blocked) ? globalThis.Number(object.blocked) : 0,
      balance: isSet(object.balance) ? globalThis.Number(object.balance) : 0,
      positionUid: isSet(object.positionUid) ? globalThis.String(object.positionUid) : "",
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      ticker: isSet(object.ticker) ? globalThis.String(object.ticker) : "",
      classCode: isSet(object.classCode) ? globalThis.String(object.classCode) : "",
      exchangeBlocked: isSet(object.exchangeBlocked) ? globalThis.Boolean(object.exchangeBlocked) : false,
      instrumentType: isSet(object.instrumentType) ? globalThis.String(object.instrumentType) : "",
    };
  },

  toJSON(message: PositionsSecurities): unknown {
    const obj: any = {};
    if (message.figi !== "") {
      obj.figi = message.figi;
    }
    if (message.blocked !== 0) {
      obj.blocked = Math.round(message.blocked);
    }
    if (message.balance !== 0) {
      obj.balance = Math.round(message.balance);
    }
    if (message.positionUid !== "") {
      obj.positionUid = message.positionUid;
    }
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.ticker !== "") {
      obj.ticker = message.ticker;
    }
    if (message.classCode !== "") {
      obj.classCode = message.classCode;
    }
    if (message.exchangeBlocked === true) {
      obj.exchangeBlocked = message.exchangeBlocked;
    }
    if (message.instrumentType !== "") {
      obj.instrumentType = message.instrumentType;
    }
    return obj;
  },
};

function createBasePositionsFutures(): PositionsFutures {
  return { figi: "", blocked: 0, balance: 0, positionUid: "", instrumentUid: "", ticker: "", classCode: "" };
}

export const PositionsFutures = {
  encode(message: PositionsFutures, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.figi !== "") {
      writer.uint32(10).string(message.figi);
    }
    if (message.blocked !== 0) {
      writer.uint32(16).int64(message.blocked);
    }
    if (message.balance !== 0) {
      writer.uint32(24).int64(message.balance);
    }
    if (message.positionUid !== "") {
      writer.uint32(34).string(message.positionUid);
    }
    if (message.instrumentUid !== "") {
      writer.uint32(42).string(message.instrumentUid);
    }
    if (message.ticker !== "") {
      writer.uint32(50).string(message.ticker);
    }
    if (message.classCode !== "") {
      writer.uint32(58).string(message.classCode);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsFutures {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsFutures();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.figi = reader.string();
          continue;
        case 2:
          if (tag !== 16) {
            break;
          }

          message.blocked = longToNumber(reader.int64() as Long);
          continue;
        case 3:
          if (tag !== 24) {
            break;
          }

          message.balance = longToNumber(reader.int64() as Long);
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.positionUid = reader.string();
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.ticker = reader.string();
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.classCode = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsFutures {
    return {
      figi: isSet(object.figi) ? globalThis.String(object.figi) : "",
      blocked: isSet(object.blocked) ? globalThis.Number(object.blocked) : 0,
      balance: isSet(object.balance) ? globalThis.Number(object.balance) : 0,
      positionUid: isSet(object.positionUid) ? globalThis.String(object.positionUid) : "",
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      ticker: isSet(object.ticker) ? globalThis.String(object.ticker) : "",
      classCode: isSet(object.classCode) ? globalThis.String(object.classCode) : "",
    };
  },

  toJSON(message: PositionsFutures): unknown {
    const obj: any = {};
    if (message.figi !== "") {
      obj.figi = message.figi;
    }
    if (message.blocked !== 0) {
      obj.blocked = Math.round(message.blocked);
    }
    if (message.balance !== 0) {
      obj.balance = Math.round(message.balance);
    }
    if (message.positionUid !== "") {
      obj.positionUid = message.positionUid;
    }
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.ticker !== "") {
      obj.ticker = message.ticker;
    }
    if (message.classCode !== "") {
      obj.classCode = message.classCode;
    }
    return obj;
  },
};

function createBasePositionsOptions(): PositionsOptions {
  return { positionUid: "", instrumentUid: "", ticker: "", classCode: "", blocked: 0, balance: 0 };
}

export const PositionsOptions = {
  encode(message: PositionsOptions, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.positionUid !== "") {
      writer.uint32(10).string(message.positionUid);
    }
    if (message.instrumentUid !== "") {
      writer.uint32(18).string(message.instrumentUid);
    }
    if (message.ticker !== "") {
      writer.uint32(26).string(message.ticker);
    }
    if (message.classCode !== "") {
      writer.uint32(34).string(message.classCode);
    }
    if (message.blocked !== 0) {
      writer.uint32(88).int64(message.blocked);
    }
    if (message.balance !== 0) {
      writer.uint32(168).int64(message.balance);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsOptions {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsOptions();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.positionUid = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.ticker = reader.string();
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.classCode = reader.string();
          continue;
        case 11:
          if (tag !== 88) {
            break;
          }

          message.blocked = longToNumber(reader.int64() as Long);
          continue;
        case 21:
          if (tag !== 168) {
            break;
          }

          message.balance = longToNumber(reader.int64() as Long);
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsOptions {
    return {
      positionUid: isSet(object.positionUid) ? globalThis.String(object.positionUid) : "",
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      ticker: isSet(object.ticker) ? globalThis.String(object.ticker) : "",
      classCode: isSet(object.classCode) ? globalThis.String(object.classCode) : "",
      blocked: isSet(object.blocked) ? globalThis.Number(object.blocked) : 0,
      balance: isSet(object.balance) ? globalThis.Number(object.balance) : 0,
    };
  },

  toJSON(message: PositionsOptions): unknown {
    const obj: any = {};
    if (message.positionUid !== "") {
      obj.positionUid = message.positionUid;
    }
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.ticker !== "") {
      obj.ticker = message.ticker;
    }
    if (message.classCode !== "") {
      obj.classCode = message.classCode;
    }
    if (message.blocked !== 0) {
      obj.blocked = Math.round(message.blocked);
    }
    if (message.balance !== 0) {
      obj.balance = Math.round(message.balance);
    }
    return obj;
  },
};

function createBaseBrokerReportRequest(): BrokerReportRequest {
  return { generateBrokerReportRequest: undefined, getBrokerReportRequest: undefined };
}

export const BrokerReportRequest = {
  encode(message: BrokerReportRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.generateBrokerReportRequest !== undefined) {
      GenerateBrokerReportRequest.encode(message.generateBrokerReportRequest, writer.uint32(10).fork()).ldelim();
    }
    if (message.getBrokerReportRequest !== undefined) {
      GetBrokerReportRequest.encode(message.getBrokerReportRequest, writer.uint32(18).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): BrokerReportRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseBrokerReportRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.generateBrokerReportRequest = GenerateBrokerReportRequest.decode(reader, reader.uint32());
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.getBrokerReportRequest = GetBrokerReportRequest.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): BrokerReportRequest {
    return {
      generateBrokerReportRequest: isSet(object.generateBrokerReportRequest)
        ? GenerateBrokerReportRequest.fromJSON(object.generateBrokerReportRequest)
        : undefined,
      getBrokerReportRequest: isSet(object.getBrokerReportRequest)
        ? GetBrokerReportRequest.fromJSON(object.getBrokerReportRequest)
        : undefined,
    };
  },

  toJSON(message: BrokerReportRequest): unknown {
    const obj: any = {};
    if (message.generateBrokerReportRequest !== undefined) {
      obj.generateBrokerReportRequest = GenerateBrokerReportRequest.toJSON(message.generateBrokerReportRequest);
    }
    if (message.getBrokerReportRequest !== undefined) {
      obj.getBrokerReportRequest = GetBrokerReportRequest.toJSON(message.getBrokerReportRequest);
    }
    return obj;
  },
};

function createBaseBrokerReportResponse(): BrokerReportResponse {
  return { generateBrokerReportResponse: undefined, getBrokerReportResponse: undefined };
}

export const BrokerReportResponse = {
  encode(message: BrokerReportResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.generateBrokerReportResponse !== undefined) {
      GenerateBrokerReportResponse.encode(message.generateBrokerReportResponse, writer.uint32(10).fork()).ldelim();
    }
    if (message.getBrokerReportResponse !== undefined) {
      GetBrokerReportResponse.encode(message.getBrokerReportResponse, writer.uint32(18).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): BrokerReportResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseBrokerReportResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.generateBrokerReportResponse = GenerateBrokerReportResponse.decode(reader, reader.uint32());
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.getBrokerReportResponse = GetBrokerReportResponse.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): BrokerReportResponse {
    return {
      generateBrokerReportResponse: isSet(object.generateBrokerReportResponse)
        ? GenerateBrokerReportResponse.fromJSON(object.generateBrokerReportResponse)
        : undefined,
      getBrokerReportResponse: isSet(object.getBrokerReportResponse)
        ? GetBrokerReportResponse.fromJSON(object.getBrokerReportResponse)
        : undefined,
    };
  },

  toJSON(message: BrokerReportResponse): unknown {
    const obj: any = {};
    if (message.generateBrokerReportResponse !== undefined) {
      obj.generateBrokerReportResponse = GenerateBrokerReportResponse.toJSON(message.generateBrokerReportResponse);
    }
    if (message.getBrokerReportResponse !== undefined) {
      obj.getBrokerReportResponse = GetBrokerReportResponse.toJSON(message.getBrokerReportResponse);
    }
    return obj;
  },
};

function createBaseGenerateBrokerReportRequest(): GenerateBrokerReportRequest {
  return { accountId: "", from: undefined, to: undefined };
}

export const GenerateBrokerReportRequest = {
  encode(message: GenerateBrokerReportRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    if (message.from !== undefined) {
      Timestamp.encode(toTimestamp(message.from), writer.uint32(18).fork()).ldelim();
    }
    if (message.to !== undefined) {
      Timestamp.encode(toTimestamp(message.to), writer.uint32(26).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GenerateBrokerReportRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGenerateBrokerReportRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.from = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.to = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GenerateBrokerReportRequest {
    return {
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      from: isSet(object.from) ? fromJsonTimestamp(object.from) : undefined,
      to: isSet(object.to) ? fromJsonTimestamp(object.to) : undefined,
    };
  },

  toJSON(message: GenerateBrokerReportRequest): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.from !== undefined) {
      obj.from = message.from.toISOString();
    }
    if (message.to !== undefined) {
      obj.to = message.to.toISOString();
    }
    return obj;
  },
};

function createBaseGenerateBrokerReportResponse(): GenerateBrokerReportResponse {
  return { taskId: "" };
}

export const GenerateBrokerReportResponse = {
  encode(message: GenerateBrokerReportResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.taskId !== "") {
      writer.uint32(10).string(message.taskId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GenerateBrokerReportResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGenerateBrokerReportResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.taskId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GenerateBrokerReportResponse {
    return { taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "" };
  },

  toJSON(message: GenerateBrokerReportResponse): unknown {
    const obj: any = {};
    if (message.taskId !== "") {
      obj.taskId = message.taskId;
    }
    return obj;
  },
};

function createBaseGetBrokerReportRequest(): GetBrokerReportRequest {
  return { taskId: "", page: undefined };
}

export const GetBrokerReportRequest = {
  encode(message: GetBrokerReportRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.taskId !== "") {
      writer.uint32(10).string(message.taskId);
    }
    if (message.page !== undefined) {
      writer.uint32(16).int32(message.page);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GetBrokerReportRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGetBrokerReportRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.taskId = reader.string();
          continue;
        case 2:
          if (tag !== 16) {
            break;
          }

          message.page = reader.int32();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GetBrokerReportRequest {
    return {
      taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "",
      page: isSet(object.page) ? globalThis.Number(object.page) : undefined,
    };
  },

  toJSON(message: GetBrokerReportRequest): unknown {
    const obj: any = {};
    if (message.taskId !== "") {
      obj.taskId = message.taskId;
    }
    if (message.page !== undefined) {
      obj.page = Math.round(message.page);
    }
    return obj;
  },
};

function createBaseGetBrokerReportResponse(): GetBrokerReportResponse {
  return { brokerReport: [], itemsCount: 0, pagesCount: 0, page: 0, taskId: "" };
}

export const GetBrokerReportResponse = {
  encode(message: GetBrokerReportResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.brokerReport) {
      BrokerReport.encode(v!, writer.uint32(10).fork()).ldelim();
    }
    if (message.itemsCount !== 0) {
      writer.uint32(16).int32(message.itemsCount);
    }
    if (message.pagesCount !== 0) {
      writer.uint32(24).int32(message.pagesCount);
    }
    if (message.page !== 0) {
      writer.uint32(32).int32(message.page);
    }
    if (message.taskId !== "") {
      writer.uint32(42).string(message.taskId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GetBrokerReportResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGetBrokerReportResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.brokerReport.push(BrokerReport.decode(reader, reader.uint32()));
          continue;
        case 2:
          if (tag !== 16) {
            break;
          }

          message.itemsCount = reader.int32();
          continue;
        case 3:
          if (tag !== 24) {
            break;
          }

          message.pagesCount = reader.int32();
          continue;
        case 4:
          if (tag !== 32) {
            break;
          }

          message.page = reader.int32();
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.taskId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GetBrokerReportResponse {
    return {
      brokerReport: globalThis.Array.isArray(object?.brokerReport)
        ? object.brokerReport.map((e: any) => BrokerReport.fromJSON(e))
        : [],
      itemsCount: isSet(object.itemsCount) ? globalThis.Number(object.itemsCount) : 0,
      pagesCount: isSet(object.pagesCount) ? globalThis.Number(object.pagesCount) : 0,
      page: isSet(object.page) ? globalThis.Number(object.page) : 0,
      taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "",
    };
  },

  toJSON(message: GetBrokerReportResponse): unknown {
    const obj: any = {};
    if (message.brokerReport?.length) {
      obj.brokerReport = message.brokerReport.map((e) => BrokerReport.toJSON(e));
    }
    if (message.itemsCount !== 0) {
      obj.itemsCount = Math.round(message.itemsCount);
    }
    if (message.pagesCount !== 0) {
      obj.pagesCount = Math.round(message.pagesCount);
    }
    if (message.page !== 0) {
      obj.page = Math.round(message.page);
    }
    if (message.taskId !== "") {
      obj.taskId = message.taskId;
    }
    return obj;
  },
};

function createBaseBrokerReport(): BrokerReport {
  return {
    tradeId: "",
    orderId: "",
    figi: "",
    executeSign: "",
    tradeDatetime: undefined,
    exchange: "",
    classCode: "",
    direction: "",
    name: "",
    ticker: "",
    price: undefined,
    quantity: 0,
    orderAmount: undefined,
    aciValue: undefined,
    totalOrderAmount: undefined,
    brokerCommission: undefined,
    exchangeCommission: undefined,
    exchangeClearingCommission: undefined,
    repoRate: undefined,
    party: "",
    clearValueDate: undefined,
    secValueDate: undefined,
    brokerStatus: "",
    separateAgreementType: "",
    separateAgreementNumber: "",
    separateAgreementDate: "",
    deliveryType: "",
  };
}

export const BrokerReport = {
  encode(message: BrokerReport, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.tradeId !== "") {
      writer.uint32(10).string(message.tradeId);
    }
    if (message.orderId !== "") {
      writer.uint32(18).string(message.orderId);
    }
    if (message.figi !== "") {
      writer.uint32(26).string(message.figi);
    }
    if (message.executeSign !== "") {
      writer.uint32(34).string(message.executeSign);
    }
    if (message.tradeDatetime !== undefined) {
      Timestamp.encode(toTimestamp(message.tradeDatetime), writer.uint32(42).fork()).ldelim();
    }
    if (message.exchange !== "") {
      writer.uint32(50).string(message.exchange);
    }
    if (message.classCode !== "") {
      writer.uint32(58).string(message.classCode);
    }
    if (message.direction !== "") {
      writer.uint32(66).string(message.direction);
    }
    if (message.name !== "") {
      writer.uint32(74).string(message.name);
    }
    if (message.ticker !== "") {
      writer.uint32(82).string(message.ticker);
    }
    if (message.price !== undefined) {
      MoneyValue.encode(message.price, writer.uint32(90).fork()).ldelim();
    }
    if (message.quantity !== 0) {
      writer.uint32(96).int64(message.quantity);
    }
    if (message.orderAmount !== undefined) {
      MoneyValue.encode(message.orderAmount, writer.uint32(106).fork()).ldelim();
    }
    if (message.aciValue !== undefined) {
      Quotation.encode(message.aciValue, writer.uint32(114).fork()).ldelim();
    }
    if (message.totalOrderAmount !== undefined) {
      MoneyValue.encode(message.totalOrderAmount, writer.uint32(122).fork()).ldelim();
    }
    if (message.brokerCommission !== undefined) {
      MoneyValue.encode(message.brokerCommission, writer.uint32(130).fork()).ldelim();
    }
    if (message.exchangeCommission !== undefined) {
      MoneyValue.encode(message.exchangeCommission, writer.uint32(138).fork()).ldelim();
    }
    if (message.exchangeClearingCommission !== undefined) {
      MoneyValue.encode(message.exchangeClearingCommission, writer.uint32(146).fork()).ldelim();
    }
    if (message.repoRate !== undefined) {
      Quotation.encode(message.repoRate, writer.uint32(154).fork()).ldelim();
    }
    if (message.party !== "") {
      writer.uint32(162).string(message.party);
    }
    if (message.clearValueDate !== undefined) {
      Timestamp.encode(toTimestamp(message.clearValueDate), writer.uint32(170).fork()).ldelim();
    }
    if (message.secValueDate !== undefined) {
      Timestamp.encode(toTimestamp(message.secValueDate), writer.uint32(178).fork()).ldelim();
    }
    if (message.brokerStatus !== "") {
      writer.uint32(186).string(message.brokerStatus);
    }
    if (message.separateAgreementType !== "") {
      writer.uint32(194).string(message.separateAgreementType);
    }
    if (message.separateAgreementNumber !== "") {
      writer.uint32(202).string(message.separateAgreementNumber);
    }
    if (message.separateAgreementDate !== "") {
      writer.uint32(210).string(message.separateAgreementDate);
    }
    if (message.deliveryType !== "") {
      writer.uint32(218).string(message.deliveryType);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): BrokerReport {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseBrokerReport();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.tradeId = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.orderId = reader.string();
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.figi = reader.string();
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.executeSign = reader.string();
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.tradeDatetime = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.exchange = reader.string();
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.classCode = reader.string();
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.direction = reader.string();
          continue;
        case 9:
          if (tag !== 74) {
            break;
          }

          message.name = reader.string();
          continue;
        case 10:
          if (tag !== 82) {
            break;
          }

          message.ticker = reader.string();
          continue;
        case 11:
          if (tag !== 90) {
            break;
          }

          message.price = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 12:
          if (tag !== 96) {
            break;
          }

          message.quantity = longToNumber(reader.int64() as Long);
          continue;
        case 13:
          if (tag !== 106) {
            break;
          }

          message.orderAmount = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 14:
          if (tag !== 114) {
            break;
          }

          message.aciValue = Quotation.decode(reader, reader.uint32());
          continue;
        case 15:
          if (tag !== 122) {
            break;
          }

          message.totalOrderAmount = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 16:
          if (tag !== 130) {
            break;
          }

          message.brokerCommission = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 17:
          if (tag !== 138) {
            break;
          }

          message.exchangeCommission = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 18:
          if (tag !== 146) {
            break;
          }

          message.exchangeClearingCommission = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 19:
          if (tag !== 154) {
            break;
          }

          message.repoRate = Quotation.decode(reader, reader.uint32());
          continue;
        case 20:
          if (tag !== 162) {
            break;
          }

          message.party = reader.string();
          continue;
        case 21:
          if (tag !== 170) {
            break;
          }

          message.clearValueDate = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 22:
          if (tag !== 178) {
            break;
          }

          message.secValueDate = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 23:
          if (tag !== 186) {
            break;
          }

          message.brokerStatus = reader.string();
          continue;
        case 24:
          if (tag !== 194) {
            break;
          }

          message.separateAgreementType = reader.string();
          continue;
        case 25:
          if (tag !== 202) {
            break;
          }

          message.separateAgreementNumber = reader.string();
          continue;
        case 26:
          if (tag !== 210) {
            break;
          }

          message.separateAgreementDate = reader.string();
          continue;
        case 27:
          if (tag !== 218) {
            break;
          }

          message.deliveryType = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): BrokerReport {
    return {
      tradeId: isSet(object.tradeId) ? globalThis.String(object.tradeId) : "",
      orderId: isSet(object.orderId) ? globalThis.String(object.orderId) : "",
      figi: isSet(object.figi) ? globalThis.String(object.figi) : "",
      executeSign: isSet(object.executeSign) ? globalThis.String(object.executeSign) : "",
      tradeDatetime: isSet(object.tradeDatetime) ? fromJsonTimestamp(object.tradeDatetime) : undefined,
      exchange: isSet(object.exchange) ? globalThis.String(object.exchange) : "",
      classCode: isSet(object.classCode) ? globalThis.String(object.classCode) : "",
      direction: isSet(object.direction) ? globalThis.String(object.direction) : "",
      name: isSet(object.name) ? globalThis.String(object.name) : "",
      ticker: isSet(object.ticker) ? globalThis.String(object.ticker) : "",
      price: isSet(object.price) ? MoneyValue.fromJSON(object.price) : undefined,
      quantity: isSet(object.quantity) ? globalThis.Number(object.quantity) : 0,
      orderAmount: isSet(object.orderAmount) ? MoneyValue.fromJSON(object.orderAmount) : undefined,
      aciValue: isSet(object.aciValue) ? Quotation.fromJSON(object.aciValue) : undefined,
      totalOrderAmount: isSet(object.totalOrderAmount) ? MoneyValue.fromJSON(object.totalOrderAmount) : undefined,
      brokerCommission: isSet(object.brokerCommission) ? MoneyValue.fromJSON(object.brokerCommission) : undefined,
      exchangeCommission: isSet(object.exchangeCommission) ? MoneyValue.fromJSON(object.exchangeCommission) : undefined,
      exchangeClearingCommission: isSet(object.exchangeClearingCommission)
        ? MoneyValue.fromJSON(object.exchangeClearingCommission)
        : undefined,
      repoRate: isSet(object.repoRate) ? Quotation.fromJSON(object.repoRate) : undefined,
      party: isSet(object.party) ? globalThis.String(object.party) : "",
      clearValueDate: isSet(object.clearValueDate) ? fromJsonTimestamp(object.clearValueDate) : undefined,
      secValueDate: isSet(object.secValueDate) ? fromJsonTimestamp(object.secValueDate) : undefined,
      brokerStatus: isSet(object.brokerStatus) ? globalThis.String(object.brokerStatus) : "",
      separateAgreementType: isSet(object.separateAgreementType) ? globalThis.String(object.separateAgreementType) : "",
      separateAgreementNumber: isSet(object.separateAgreementNumber)
        ? globalThis.String(object.separateAgreementNumber)
        : "",
      separateAgreementDate: isSet(object.separateAgreementDate) ? globalThis.String(object.separateAgreementDate) : "",
      deliveryType: isSet(object.deliveryType) ? globalThis.String(object.deliveryType) : "",
    };
  },

  toJSON(message: BrokerReport): unknown {
    const obj: any = {};
    if (message.tradeId !== "") {
      obj.tradeId = message.tradeId;
    }
    if (message.orderId !== "") {
      obj.orderId = message.orderId;
    }
    if (message.figi !== "") {
      obj.figi = message.figi;
    }
    if (message.executeSign !== "") {
      obj.executeSign = message.executeSign;
    }
    if (message.tradeDatetime !== undefined) {
      obj.tradeDatetime = message.tradeDatetime.toISOString();
    }
    if (message.exchange !== "") {
      obj.exchange = message.exchange;
    }
    if (message.classCode !== "") {
      obj.classCode = message.classCode;
    }
    if (message.direction !== "") {
      obj.direction = message.direction;
    }
    if (message.name !== "") {
      obj.name = message.name;
    }
    if (message.ticker !== "") {
      obj.ticker = message.ticker;
    }
    if (message.price !== undefined) {
      obj.price = MoneyValue.toJSON(message.price);
    }
    if (message.quantity !== 0) {
      obj.quantity = Math.round(message.quantity);
    }
    if (message.orderAmount !== undefined) {
      obj.orderAmount = MoneyValue.toJSON(message.orderAmount);
    }
    if (message.aciValue !== undefined) {
      obj.aciValue = Quotation.toJSON(message.aciValue);
    }
    if (message.totalOrderAmount !== undefined) {
      obj.totalOrderAmount = MoneyValue.toJSON(message.totalOrderAmount);
    }
    if (message.brokerCommission !== undefined) {
      obj.brokerCommission = MoneyValue.toJSON(message.brokerCommission);
    }
    if (message.exchangeCommission !== undefined) {
      obj.exchangeCommission = MoneyValue.toJSON(message.exchangeCommission);
    }
    if (message.exchangeClearingCommission !== undefined) {
      obj.exchangeClearingCommission = MoneyValue.toJSON(message.exchangeClearingCommission);
    }
    if (message.repoRate !== undefined) {
      obj.repoRate = Quotation.toJSON(message.repoRate);
    }
    if (message.party !== "") {
      obj.party = message.party;
    }
    if (message.clearValueDate !== undefined) {
      obj.clearValueDate = message.clearValueDate.toISOString();
    }
    if (message.secValueDate !== undefined) {
      obj.secValueDate = message.secValueDate.toISOString();
    }
    if (message.brokerStatus !== "") {
      obj.brokerStatus = message.brokerStatus;
    }
    if (message.separateAgreementType !== "") {
      obj.separateAgreementType = message.separateAgreementType;
    }
    if (message.separateAgreementNumber !== "") {
      obj.separateAgreementNumber = message.separateAgreementNumber;
    }
    if (message.separateAgreementDate !== "") {
      obj.separateAgreementDate = message.separateAgreementDate;
    }
    if (message.deliveryType !== "") {
      obj.deliveryType = message.deliveryType;
    }
    return obj;
  },
};

function createBaseGetDividendsForeignIssuerRequest(): GetDividendsForeignIssuerRequest {
  return { generateDivForeignIssuerReport: undefined, getDivForeignIssuerReport: undefined };
}

export const GetDividendsForeignIssuerRequest = {
  encode(message: GetDividendsForeignIssuerRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.generateDivForeignIssuerReport !== undefined) {
      GenerateDividendsForeignIssuerReportRequest.encode(
        message.generateDivForeignIssuerReport,
        writer.uint32(10).fork(),
      ).ldelim();
    }
    if (message.getDivForeignIssuerReport !== undefined) {
      GetDividendsForeignIssuerReportRequest.encode(message.getDivForeignIssuerReport, writer.uint32(18).fork())
        .ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GetDividendsForeignIssuerRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGetDividendsForeignIssuerRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.generateDivForeignIssuerReport = GenerateDividendsForeignIssuerReportRequest.decode(
            reader,
            reader.uint32(),
          );
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.getDivForeignIssuerReport = GetDividendsForeignIssuerReportRequest.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GetDividendsForeignIssuerRequest {
    return {
      generateDivForeignIssuerReport: isSet(object.generateDivForeignIssuerReport)
        ? GenerateDividendsForeignIssuerReportRequest.fromJSON(object.generateDivForeignIssuerReport)
        : undefined,
      getDivForeignIssuerReport: isSet(object.getDivForeignIssuerReport)
        ? GetDividendsForeignIssuerReportRequest.fromJSON(object.getDivForeignIssuerReport)
        : undefined,
    };
  },

  toJSON(message: GetDividendsForeignIssuerRequest): unknown {
    const obj: any = {};
    if (message.generateDivForeignIssuerReport !== undefined) {
      obj.generateDivForeignIssuerReport = GenerateDividendsForeignIssuerReportRequest.toJSON(
        message.generateDivForeignIssuerReport,
      );
    }
    if (message.getDivForeignIssuerReport !== undefined) {
      obj.getDivForeignIssuerReport = GetDividendsForeignIssuerReportRequest.toJSON(message.getDivForeignIssuerReport);
    }
    return obj;
  },
};

function createBaseGetDividendsForeignIssuerResponse(): GetDividendsForeignIssuerResponse {
  return { generateDivForeignIssuerReportResponse: undefined, divForeignIssuerReport: undefined };
}

export const GetDividendsForeignIssuerResponse = {
  encode(message: GetDividendsForeignIssuerResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.generateDivForeignIssuerReportResponse !== undefined) {
      GenerateDividendsForeignIssuerReportResponse.encode(
        message.generateDivForeignIssuerReportResponse,
        writer.uint32(10).fork(),
      ).ldelim();
    }
    if (message.divForeignIssuerReport !== undefined) {
      GetDividendsForeignIssuerReportResponse.encode(message.divForeignIssuerReport, writer.uint32(18).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GetDividendsForeignIssuerResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGetDividendsForeignIssuerResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.generateDivForeignIssuerReportResponse = GenerateDividendsForeignIssuerReportResponse.decode(
            reader,
            reader.uint32(),
          );
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.divForeignIssuerReport = GetDividendsForeignIssuerReportResponse.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GetDividendsForeignIssuerResponse {
    return {
      generateDivForeignIssuerReportResponse: isSet(object.generateDivForeignIssuerReportResponse)
        ? GenerateDividendsForeignIssuerReportResponse.fromJSON(object.generateDivForeignIssuerReportResponse)
        : undefined,
      divForeignIssuerReport: isSet(object.divForeignIssuerReport)
        ? GetDividendsForeignIssuerReportResponse.fromJSON(object.divForeignIssuerReport)
        : undefined,
    };
  },

  toJSON(message: GetDividendsForeignIssuerResponse): unknown {
    const obj: any = {};
    if (message.generateDivForeignIssuerReportResponse !== undefined) {
      obj.generateDivForeignIssuerReportResponse = GenerateDividendsForeignIssuerReportResponse.toJSON(
        message.generateDivForeignIssuerReportResponse,
      );
    }
    if (message.divForeignIssuerReport !== undefined) {
      obj.divForeignIssuerReport = GetDividendsForeignIssuerReportResponse.toJSON(message.divForeignIssuerReport);
    }
    return obj;
  },
};

function createBaseGenerateDividendsForeignIssuerReportRequest(): GenerateDividendsForeignIssuerReportRequest {
  return { accountId: "", from: undefined, to: undefined };
}

export const GenerateDividendsForeignIssuerReportRequest = {
  encode(message: GenerateDividendsForeignIssuerReportRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    if (message.from !== undefined) {
      Timestamp.encode(toTimestamp(message.from), writer.uint32(18).fork()).ldelim();
    }
    if (message.to !== undefined) {
      Timestamp.encode(toTimestamp(message.to), writer.uint32(26).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GenerateDividendsForeignIssuerReportRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGenerateDividendsForeignIssuerReportRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.from = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.to = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GenerateDividendsForeignIssuerReportRequest {
    return {
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      from: isSet(object.from) ? fromJsonTimestamp(object.from) : undefined,
      to: isSet(object.to) ? fromJsonTimestamp(object.to) : undefined,
    };
  },

  toJSON(message: GenerateDividendsForeignIssuerReportRequest): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.from !== undefined) {
      obj.from = message.from.toISOString();
    }
    if (message.to !== undefined) {
      obj.to = message.to.toISOString();
    }
    return obj;
  },
};

function createBaseGetDividendsForeignIssuerReportRequest(): GetDividendsForeignIssuerReportRequest {
  return { taskId: "", page: undefined };
}

export const GetDividendsForeignIssuerReportRequest = {
  encode(message: GetDividendsForeignIssuerReportRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.taskId !== "") {
      writer.uint32(10).string(message.taskId);
    }
    if (message.page !== undefined) {
      writer.uint32(16).int32(message.page);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GetDividendsForeignIssuerReportRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGetDividendsForeignIssuerReportRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.taskId = reader.string();
          continue;
        case 2:
          if (tag !== 16) {
            break;
          }

          message.page = reader.int32();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GetDividendsForeignIssuerReportRequest {
    return {
      taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "",
      page: isSet(object.page) ? globalThis.Number(object.page) : undefined,
    };
  },

  toJSON(message: GetDividendsForeignIssuerReportRequest): unknown {
    const obj: any = {};
    if (message.taskId !== "") {
      obj.taskId = message.taskId;
    }
    if (message.page !== undefined) {
      obj.page = Math.round(message.page);
    }
    return obj;
  },
};

function createBaseGenerateDividendsForeignIssuerReportResponse(): GenerateDividendsForeignIssuerReportResponse {
  return { taskId: "" };
}

export const GenerateDividendsForeignIssuerReportResponse = {
  encode(message: GenerateDividendsForeignIssuerReportResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.taskId !== "") {
      writer.uint32(10).string(message.taskId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GenerateDividendsForeignIssuerReportResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGenerateDividendsForeignIssuerReportResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.taskId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GenerateDividendsForeignIssuerReportResponse {
    return { taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "" };
  },

  toJSON(message: GenerateDividendsForeignIssuerReportResponse): unknown {
    const obj: any = {};
    if (message.taskId !== "") {
      obj.taskId = message.taskId;
    }
    return obj;
  },
};

function createBaseGetDividendsForeignIssuerReportResponse(): GetDividendsForeignIssuerReportResponse {
  return { dividendsForeignIssuerReport: [], itemsCount: 0, pagesCount: 0, page: 0 };
}

export const GetDividendsForeignIssuerReportResponse = {
  encode(message: GetDividendsForeignIssuerReportResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.dividendsForeignIssuerReport) {
      DividendsForeignIssuerReport.encode(v!, writer.uint32(10).fork()).ldelim();
    }
    if (message.itemsCount !== 0) {
      writer.uint32(16).int32(message.itemsCount);
    }
    if (message.pagesCount !== 0) {
      writer.uint32(24).int32(message.pagesCount);
    }
    if (message.page !== 0) {
      writer.uint32(32).int32(message.page);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GetDividendsForeignIssuerReportResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGetDividendsForeignIssuerReportResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.dividendsForeignIssuerReport.push(DividendsForeignIssuerReport.decode(reader, reader.uint32()));
          continue;
        case 2:
          if (tag !== 16) {
            break;
          }

          message.itemsCount = reader.int32();
          continue;
        case 3:
          if (tag !== 24) {
            break;
          }

          message.pagesCount = reader.int32();
          continue;
        case 4:
          if (tag !== 32) {
            break;
          }

          message.page = reader.int32();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GetDividendsForeignIssuerReportResponse {
    return {
      dividendsForeignIssuerReport: globalThis.Array.isArray(object?.dividendsForeignIssuerReport)
        ? object.dividendsForeignIssuerReport.map((e: any) => DividendsForeignIssuerReport.fromJSON(e))
        : [],
      itemsCount: isSet(object.itemsCount) ? globalThis.Number(object.itemsCount) : 0,
      pagesCount: isSet(object.pagesCount) ? globalThis.Number(object.pagesCount) : 0,
      page: isSet(object.page) ? globalThis.Number(object.page) : 0,
    };
  },

  toJSON(message: GetDividendsForeignIssuerReportResponse): unknown {
    const obj: any = {};
    if (message.dividendsForeignIssuerReport?.length) {
      obj.dividendsForeignIssuerReport = message.dividendsForeignIssuerReport.map((e) =>
        DividendsForeignIssuerReport.toJSON(e)
      );
    }
    if (message.itemsCount !== 0) {
      obj.itemsCount = Math.round(message.itemsCount);
    }
    if (message.pagesCount !== 0) {
      obj.pagesCount = Math.round(message.pagesCount);
    }
    if (message.page !== 0) {
      obj.page = Math.round(message.page);
    }
    return obj;
  },
};

function createBaseDividendsForeignIssuerReport(): DividendsForeignIssuerReport {
  return {
    recordDate: undefined,
    paymentDate: undefined,
    securityName: "",
    isin: "",
    issuerCountry: "",
    quantity: 0,
    dividend: undefined,
    externalCommission: undefined,
    dividendGross: undefined,
    tax: undefined,
    dividendAmount: undefined,
    currency: "",
  };
}

export const DividendsForeignIssuerReport = {
  encode(message: DividendsForeignIssuerReport, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.recordDate !== undefined) {
      Timestamp.encode(toTimestamp(message.recordDate), writer.uint32(10).fork()).ldelim();
    }
    if (message.paymentDate !== undefined) {
      Timestamp.encode(toTimestamp(message.paymentDate), writer.uint32(18).fork()).ldelim();
    }
    if (message.securityName !== "") {
      writer.uint32(26).string(message.securityName);
    }
    if (message.isin !== "") {
      writer.uint32(34).string(message.isin);
    }
    if (message.issuerCountry !== "") {
      writer.uint32(42).string(message.issuerCountry);
    }
    if (message.quantity !== 0) {
      writer.uint32(48).int64(message.quantity);
    }
    if (message.dividend !== undefined) {
      Quotation.encode(message.dividend, writer.uint32(58).fork()).ldelim();
    }
    if (message.externalCommission !== undefined) {
      Quotation.encode(message.externalCommission, writer.uint32(66).fork()).ldelim();
    }
    if (message.dividendGross !== undefined) {
      Quotation.encode(message.dividendGross, writer.uint32(74).fork()).ldelim();
    }
    if (message.tax !== undefined) {
      Quotation.encode(message.tax, writer.uint32(82).fork()).ldelim();
    }
    if (message.dividendAmount !== undefined) {
      Quotation.encode(message.dividendAmount, writer.uint32(90).fork()).ldelim();
    }
    if (message.currency !== "") {
      writer.uint32(98).string(message.currency);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): DividendsForeignIssuerReport {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseDividendsForeignIssuerReport();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.recordDate = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.paymentDate = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.securityName = reader.string();
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.isin = reader.string();
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.issuerCountry = reader.string();
          continue;
        case 6:
          if (tag !== 48) {
            break;
          }

          message.quantity = longToNumber(reader.int64() as Long);
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.dividend = Quotation.decode(reader, reader.uint32());
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.externalCommission = Quotation.decode(reader, reader.uint32());
          continue;
        case 9:
          if (tag !== 74) {
            break;
          }

          message.dividendGross = Quotation.decode(reader, reader.uint32());
          continue;
        case 10:
          if (tag !== 82) {
            break;
          }

          message.tax = Quotation.decode(reader, reader.uint32());
          continue;
        case 11:
          if (tag !== 90) {
            break;
          }

          message.dividendAmount = Quotation.decode(reader, reader.uint32());
          continue;
        case 12:
          if (tag !== 98) {
            break;
          }

          message.currency = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): DividendsForeignIssuerReport {
    return {
      recordDate: isSet(object.recordDate) ? fromJsonTimestamp(object.recordDate) : undefined,
      paymentDate: isSet(object.paymentDate) ? fromJsonTimestamp(object.paymentDate) : undefined,
      securityName: isSet(object.securityName) ? globalThis.String(object.securityName) : "",
      isin: isSet(object.isin) ? globalThis.String(object.isin) : "",
      issuerCountry: isSet(object.issuerCountry) ? globalThis.String(object.issuerCountry) : "",
      quantity: isSet(object.quantity) ? globalThis.Number(object.quantity) : 0,
      dividend: isSet(object.dividend) ? Quotation.fromJSON(object.dividend) : undefined,
      externalCommission: isSet(object.externalCommission) ? Quotation.fromJSON(object.externalCommission) : undefined,
      dividendGross: isSet(object.dividendGross) ? Quotation.fromJSON(object.dividendGross) : undefined,
      tax: isSet(object.tax) ? Quotation.fromJSON(object.tax) : undefined,
      dividendAmount: isSet(object.dividendAmount) ? Quotation.fromJSON(object.dividendAmount) : undefined,
      currency: isSet(object.currency) ? globalThis.String(object.currency) : "",
    };
  },

  toJSON(message: DividendsForeignIssuerReport): unknown {
    const obj: any = {};
    if (message.recordDate !== undefined) {
      obj.recordDate = message.recordDate.toISOString();
    }
    if (message.paymentDate !== undefined) {
      obj.paymentDate = message.paymentDate.toISOString();
    }
    if (message.securityName !== "") {
      obj.securityName = message.securityName;
    }
    if (message.isin !== "") {
      obj.isin = message.isin;
    }
    if (message.issuerCountry !== "") {
      obj.issuerCountry = message.issuerCountry;
    }
    if (message.quantity !== 0) {
      obj.quantity = Math.round(message.quantity);
    }
    if (message.dividend !== undefined) {
      obj.dividend = Quotation.toJSON(message.dividend);
    }
    if (message.externalCommission !== undefined) {
      obj.externalCommission = Quotation.toJSON(message.externalCommission);
    }
    if (message.dividendGross !== undefined) {
      obj.dividendGross = Quotation.toJSON(message.dividendGross);
    }
    if (message.tax !== undefined) {
      obj.tax = Quotation.toJSON(message.tax);
    }
    if (message.dividendAmount !== undefined) {
      obj.dividendAmount = Quotation.toJSON(message.dividendAmount);
    }
    if (message.currency !== "") {
      obj.currency = message.currency;
    }
    return obj;
  },
};

function createBasePortfolioStreamRequest(): PortfolioStreamRequest {
  return { accounts: [], pingSettings: undefined };
}

export const PortfolioStreamRequest = {
  encode(message: PortfolioStreamRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.accounts) {
      writer.uint32(10).string(v!);
    }
    if (message.pingSettings !== undefined) {
      PingDelaySettings.encode(message.pingSettings, writer.uint32(122).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PortfolioStreamRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePortfolioStreamRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accounts.push(reader.string());
          continue;
        case 15:
          if (tag !== 122) {
            break;
          }

          message.pingSettings = PingDelaySettings.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PortfolioStreamRequest {
    return {
      accounts: globalThis.Array.isArray(object?.accounts) ? object.accounts.map((e: any) => globalThis.String(e)) : [],
      pingSettings: isSet(object.pingSettings) ? PingDelaySettings.fromJSON(object.pingSettings) : undefined,
    };
  },

  toJSON(message: PortfolioStreamRequest): unknown {
    const obj: any = {};
    if (message.accounts?.length) {
      obj.accounts = message.accounts;
    }
    if (message.pingSettings !== undefined) {
      obj.pingSettings = PingDelaySettings.toJSON(message.pingSettings);
    }
    return obj;
  },
};

function createBasePortfolioStreamResponse(): PortfolioStreamResponse {
  return { subscriptions: undefined, portfolio: undefined, ping: undefined };
}

export const PortfolioStreamResponse = {
  encode(message: PortfolioStreamResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.subscriptions !== undefined) {
      PortfolioSubscriptionResult.encode(message.subscriptions, writer.uint32(10).fork()).ldelim();
    }
    if (message.portfolio !== undefined) {
      PortfolioResponse.encode(message.portfolio, writer.uint32(18).fork()).ldelim();
    }
    if (message.ping !== undefined) {
      Ping.encode(message.ping, writer.uint32(26).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PortfolioStreamResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePortfolioStreamResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.subscriptions = PortfolioSubscriptionResult.decode(reader, reader.uint32());
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.portfolio = PortfolioResponse.decode(reader, reader.uint32());
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.ping = Ping.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PortfolioStreamResponse {
    return {
      subscriptions: isSet(object.subscriptions)
        ? PortfolioSubscriptionResult.fromJSON(object.subscriptions)
        : undefined,
      portfolio: isSet(object.portfolio) ? PortfolioResponse.fromJSON(object.portfolio) : undefined,
      ping: isSet(object.ping) ? Ping.fromJSON(object.ping) : undefined,
    };
  },

  toJSON(message: PortfolioStreamResponse): unknown {
    const obj: any = {};
    if (message.subscriptions !== undefined) {
      obj.subscriptions = PortfolioSubscriptionResult.toJSON(message.subscriptions);
    }
    if (message.portfolio !== undefined) {
      obj.portfolio = PortfolioResponse.toJSON(message.portfolio);
    }
    if (message.ping !== undefined) {
      obj.ping = Ping.toJSON(message.ping);
    }
    return obj;
  },
};

function createBasePortfolioSubscriptionResult(): PortfolioSubscriptionResult {
  return { accounts: [], trackingId: "", streamId: "" };
}

export const PortfolioSubscriptionResult = {
  encode(message: PortfolioSubscriptionResult, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.accounts) {
      AccountSubscriptionStatus.encode(v!, writer.uint32(10).fork()).ldelim();
    }
    if (message.trackingId !== "") {
      writer.uint32(58).string(message.trackingId);
    }
    if (message.streamId !== "") {
      writer.uint32(66).string(message.streamId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PortfolioSubscriptionResult {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePortfolioSubscriptionResult();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accounts.push(AccountSubscriptionStatus.decode(reader, reader.uint32()));
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.trackingId = reader.string();
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.streamId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PortfolioSubscriptionResult {
    return {
      accounts: globalThis.Array.isArray(object?.accounts)
        ? object.accounts.map((e: any) => AccountSubscriptionStatus.fromJSON(e))
        : [],
      trackingId: isSet(object.trackingId) ? globalThis.String(object.trackingId) : "",
      streamId: isSet(object.streamId) ? globalThis.String(object.streamId) : "",
    };
  },

  toJSON(message: PortfolioSubscriptionResult): unknown {
    const obj: any = {};
    if (message.accounts?.length) {
      obj.accounts = message.accounts.map((e) => AccountSubscriptionStatus.toJSON(e));
    }
    if (message.trackingId !== "") {
      obj.trackingId = message.trackingId;
    }
    if (message.streamId !== "") {
      obj.streamId = message.streamId;
    }
    return obj;
  },
};

function createBaseAccountSubscriptionStatus(): AccountSubscriptionStatus {
  return { accountId: "", subscriptionStatus: 0 };
}

export const AccountSubscriptionStatus = {
  encode(message: AccountSubscriptionStatus, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    if (message.subscriptionStatus !== 0) {
      writer.uint32(48).int32(message.subscriptionStatus);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): AccountSubscriptionStatus {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseAccountSubscriptionStatus();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 6:
          if (tag !== 48) {
            break;
          }

          message.subscriptionStatus = reader.int32() as any;
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): AccountSubscriptionStatus {
    return {
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      subscriptionStatus: isSet(object.subscriptionStatus)
        ? portfolioSubscriptionStatusFromJSON(object.subscriptionStatus)
        : 0,
    };
  },

  toJSON(message: AccountSubscriptionStatus): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.subscriptionStatus !== 0) {
      obj.subscriptionStatus = portfolioSubscriptionStatusToJSON(message.subscriptionStatus);
    }
    return obj;
  },
};

function createBaseGetOperationsByCursorRequest(): GetOperationsByCursorRequest {
  return {
    accountId: "",
    instrumentId: undefined,
    from: undefined,
    to: undefined,
    cursor: undefined,
    limit: undefined,
    operationTypes: [],
    state: undefined,
    withoutCommissions: undefined,
    withoutTrades: undefined,
    withoutOvernights: undefined,
  };
}

export const GetOperationsByCursorRequest = {
  encode(message: GetOperationsByCursorRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    if (message.instrumentId !== undefined) {
      writer.uint32(18).string(message.instrumentId);
    }
    if (message.from !== undefined) {
      Timestamp.encode(toTimestamp(message.from), writer.uint32(50).fork()).ldelim();
    }
    if (message.to !== undefined) {
      Timestamp.encode(toTimestamp(message.to), writer.uint32(58).fork()).ldelim();
    }
    if (message.cursor !== undefined) {
      writer.uint32(90).string(message.cursor);
    }
    if (message.limit !== undefined) {
      writer.uint32(96).int32(message.limit);
    }
    writer.uint32(106).fork();
    for (const v of message.operationTypes) {
      writer.int32(v);
    }
    writer.ldelim();
    if (message.state !== undefined) {
      writer.uint32(112).int32(message.state);
    }
    if (message.withoutCommissions !== undefined) {
      writer.uint32(120).bool(message.withoutCommissions);
    }
    if (message.withoutTrades !== undefined) {
      writer.uint32(128).bool(message.withoutTrades);
    }
    if (message.withoutOvernights !== undefined) {
      writer.uint32(136).bool(message.withoutOvernights);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GetOperationsByCursorRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGetOperationsByCursorRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.instrumentId = reader.string();
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.from = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.to = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 11:
          if (tag !== 90) {
            break;
          }

          message.cursor = reader.string();
          continue;
        case 12:
          if (tag !== 96) {
            break;
          }

          message.limit = reader.int32();
          continue;
        case 13:
          if (tag === 104) {
            message.operationTypes.push(reader.int32() as any);

            continue;
          }

          if (tag === 106) {
            const end2 = reader.uint32() + reader.pos;
            while (reader.pos < end2) {
              message.operationTypes.push(reader.int32() as any);
            }

            continue;
          }

          break;
        case 14:
          if (tag !== 112) {
            break;
          }

          message.state = reader.int32() as any;
          continue;
        case 15:
          if (tag !== 120) {
            break;
          }

          message.withoutCommissions = reader.bool();
          continue;
        case 16:
          if (tag !== 128) {
            break;
          }

          message.withoutTrades = reader.bool();
          continue;
        case 17:
          if (tag !== 136) {
            break;
          }

          message.withoutOvernights = reader.bool();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GetOperationsByCursorRequest {
    return {
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      instrumentId: isSet(object.instrumentId) ? globalThis.String(object.instrumentId) : undefined,
      from: isSet(object.from) ? fromJsonTimestamp(object.from) : undefined,
      to: isSet(object.to) ? fromJsonTimestamp(object.to) : undefined,
      cursor: isSet(object.cursor) ? globalThis.String(object.cursor) : undefined,
      limit: isSet(object.limit) ? globalThis.Number(object.limit) : undefined,
      operationTypes: globalThis.Array.isArray(object?.operationTypes)
        ? object.operationTypes.map((e: any) => operationTypeFromJSON(e))
        : [],
      state: isSet(object.state) ? operationStateFromJSON(object.state) : undefined,
      withoutCommissions: isSet(object.withoutCommissions) ? globalThis.Boolean(object.withoutCommissions) : undefined,
      withoutTrades: isSet(object.withoutTrades) ? globalThis.Boolean(object.withoutTrades) : undefined,
      withoutOvernights: isSet(object.withoutOvernights) ? globalThis.Boolean(object.withoutOvernights) : undefined,
    };
  },

  toJSON(message: GetOperationsByCursorRequest): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.instrumentId !== undefined) {
      obj.instrumentId = message.instrumentId;
    }
    if (message.from !== undefined) {
      obj.from = message.from.toISOString();
    }
    if (message.to !== undefined) {
      obj.to = message.to.toISOString();
    }
    if (message.cursor !== undefined) {
      obj.cursor = message.cursor;
    }
    if (message.limit !== undefined) {
      obj.limit = Math.round(message.limit);
    }
    if (message.operationTypes?.length) {
      obj.operationTypes = message.operationTypes.map((e) => operationTypeToJSON(e));
    }
    if (message.state !== undefined) {
      obj.state = operationStateToJSON(message.state);
    }
    if (message.withoutCommissions !== undefined) {
      obj.withoutCommissions = message.withoutCommissions;
    }
    if (message.withoutTrades !== undefined) {
      obj.withoutTrades = message.withoutTrades;
    }
    if (message.withoutOvernights !== undefined) {
      obj.withoutOvernights = message.withoutOvernights;
    }
    return obj;
  },
};

function createBaseGetOperationsByCursorResponse(): GetOperationsByCursorResponse {
  return { hasNext: false, nextCursor: "", items: [] };
}

export const GetOperationsByCursorResponse = {
  encode(message: GetOperationsByCursorResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.hasNext === true) {
      writer.uint32(8).bool(message.hasNext);
    }
    if (message.nextCursor !== "") {
      writer.uint32(18).string(message.nextCursor);
    }
    for (const v of message.items) {
      OperationItem.encode(v!, writer.uint32(50).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): GetOperationsByCursorResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseGetOperationsByCursorResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 8) {
            break;
          }

          message.hasNext = reader.bool();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.nextCursor = reader.string();
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.items.push(OperationItem.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): GetOperationsByCursorResponse {
    return {
      hasNext: isSet(object.hasNext) ? globalThis.Boolean(object.hasNext) : false,
      nextCursor: isSet(object.nextCursor) ? globalThis.String(object.nextCursor) : "",
      items: globalThis.Array.isArray(object?.items) ? object.items.map((e: any) => OperationItem.fromJSON(e)) : [],
    };
  },

  toJSON(message: GetOperationsByCursorResponse): unknown {
    const obj: any = {};
    if (message.hasNext === true) {
      obj.hasNext = message.hasNext;
    }
    if (message.nextCursor !== "") {
      obj.nextCursor = message.nextCursor;
    }
    if (message.items?.length) {
      obj.items = message.items.map((e) => OperationItem.toJSON(e));
    }
    return obj;
  },
};

function createBaseOperationItem(): OperationItem {
  return {
    cursor: "",
    brokerAccountId: "",
    id: "",
    parentOperationId: "",
    name: "",
    date: undefined,
    type: 0,
    description: "",
    state: 0,
    instrumentUid: "",
    figi: "",
    instrumentType: "",
    instrumentKind: 0,
    positionUid: "",
    ticker: "",
    classCode: "",
    payment: undefined,
    price: undefined,
    commission: undefined,
    yield: undefined,
    yieldRelative: undefined,
    accruedInt: undefined,
    quantity: 0,
    quantityRest: 0,
    quantityDone: 0,
    cancelDateTime: undefined,
    cancelReason: "",
    tradesInfo: undefined,
    assetUid: "",
    childOperations: [],
  };
}

export const OperationItem = {
  encode(message: OperationItem, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.cursor !== "") {
      writer.uint32(10).string(message.cursor);
    }
    if (message.brokerAccountId !== "") {
      writer.uint32(50).string(message.brokerAccountId);
    }
    if (message.id !== "") {
      writer.uint32(130).string(message.id);
    }
    if (message.parentOperationId !== "") {
      writer.uint32(138).string(message.parentOperationId);
    }
    if (message.name !== "") {
      writer.uint32(146).string(message.name);
    }
    if (message.date !== undefined) {
      Timestamp.encode(toTimestamp(message.date), writer.uint32(170).fork()).ldelim();
    }
    if (message.type !== 0) {
      writer.uint32(176).int32(message.type);
    }
    if (message.description !== "") {
      writer.uint32(186).string(message.description);
    }
    if (message.state !== 0) {
      writer.uint32(192).int32(message.state);
    }
    if (message.instrumentUid !== "") {
      writer.uint32(250).string(message.instrumentUid);
    }
    if (message.figi !== "") {
      writer.uint32(258).string(message.figi);
    }
    if (message.instrumentType !== "") {
      writer.uint32(266).string(message.instrumentType);
    }
    if (message.instrumentKind !== 0) {
      writer.uint32(272).int32(message.instrumentKind);
    }
    if (message.positionUid !== "") {
      writer.uint32(282).string(message.positionUid);
    }
    if (message.ticker !== "") {
      writer.uint32(290).string(message.ticker);
    }
    if (message.classCode !== "") {
      writer.uint32(298).string(message.classCode);
    }
    if (message.payment !== undefined) {
      MoneyValue.encode(message.payment, writer.uint32(330).fork()).ldelim();
    }
    if (message.price !== undefined) {
      MoneyValue.encode(message.price, writer.uint32(338).fork()).ldelim();
    }
    if (message.commission !== undefined) {
      MoneyValue.encode(message.commission, writer.uint32(346).fork()).ldelim();
    }
    if (message.yield !== undefined) {
      MoneyValue.encode(message.yield, writer.uint32(354).fork()).ldelim();
    }
    if (message.yieldRelative !== undefined) {
      Quotation.encode(message.yieldRelative, writer.uint32(362).fork()).ldelim();
    }
    if (message.accruedInt !== undefined) {
      MoneyValue.encode(message.accruedInt, writer.uint32(370).fork()).ldelim();
    }
    if (message.quantity !== 0) {
      writer.uint32(408).int64(message.quantity);
    }
    if (message.quantityRest !== 0) {
      writer.uint32(416).int64(message.quantityRest);
    }
    if (message.quantityDone !== 0) {
      writer.uint32(424).int64(message.quantityDone);
    }
    if (message.cancelDateTime !== undefined) {
      Timestamp.encode(toTimestamp(message.cancelDateTime), writer.uint32(450).fork()).ldelim();
    }
    if (message.cancelReason !== "") {
      writer.uint32(458).string(message.cancelReason);
    }
    if (message.tradesInfo !== undefined) {
      OperationItemTrades.encode(message.tradesInfo, writer.uint32(490).fork()).ldelim();
    }
    if (message.assetUid !== "") {
      writer.uint32(514).string(message.assetUid);
    }
    for (const v of message.childOperations) {
      ChildOperationItem.encode(v!, writer.uint32(522).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationItem {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationItem();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.cursor = reader.string();
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.brokerAccountId = reader.string();
          continue;
        case 16:
          if (tag !== 130) {
            break;
          }

          message.id = reader.string();
          continue;
        case 17:
          if (tag !== 138) {
            break;
          }

          message.parentOperationId = reader.string();
          continue;
        case 18:
          if (tag !== 146) {
            break;
          }

          message.name = reader.string();
          continue;
        case 21:
          if (tag !== 170) {
            break;
          }

          message.date = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 22:
          if (tag !== 176) {
            break;
          }

          message.type = reader.int32() as any;
          continue;
        case 23:
          if (tag !== 186) {
            break;
          }

          message.description = reader.string();
          continue;
        case 24:
          if (tag !== 192) {
            break;
          }

          message.state = reader.int32() as any;
          continue;
        case 31:
          if (tag !== 250) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 32:
          if (tag !== 258) {
            break;
          }

          message.figi = reader.string();
          continue;
        case 33:
          if (tag !== 266) {
            break;
          }

          message.instrumentType = reader.string();
          continue;
        case 34:
          if (tag !== 272) {
            break;
          }

          message.instrumentKind = reader.int32() as any;
          continue;
        case 35:
          if (tag !== 282) {
            break;
          }

          message.positionUid = reader.string();
          continue;
        case 36:
          if (tag !== 290) {
            break;
          }

          message.ticker = reader.string();
          continue;
        case 37:
          if (tag !== 298) {
            break;
          }

          message.classCode = reader.string();
          continue;
        case 41:
          if (tag !== 330) {
            break;
          }

          message.payment = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 42:
          if (tag !== 338) {
            break;
          }

          message.price = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 43:
          if (tag !== 346) {
            break;
          }

          message.commission = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 44:
          if (tag !== 354) {
            break;
          }

          message.yield = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 45:
          if (tag !== 362) {
            break;
          }

          message.yieldRelative = Quotation.decode(reader, reader.uint32());
          continue;
        case 46:
          if (tag !== 370) {
            break;
          }

          message.accruedInt = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 51:
          if (tag !== 408) {
            break;
          }

          message.quantity = longToNumber(reader.int64() as Long);
          continue;
        case 52:
          if (tag !== 416) {
            break;
          }

          message.quantityRest = longToNumber(reader.int64() as Long);
          continue;
        case 53:
          if (tag !== 424) {
            break;
          }

          message.quantityDone = longToNumber(reader.int64() as Long);
          continue;
        case 56:
          if (tag !== 450) {
            break;
          }

          message.cancelDateTime = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 57:
          if (tag !== 458) {
            break;
          }

          message.cancelReason = reader.string();
          continue;
        case 61:
          if (tag !== 490) {
            break;
          }

          message.tradesInfo = OperationItemTrades.decode(reader, reader.uint32());
          continue;
        case 64:
          if (tag !== 514) {
            break;
          }

          message.assetUid = reader.string();
          continue;
        case 65:
          if (tag !== 522) {
            break;
          }

          message.childOperations.push(ChildOperationItem.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationItem {
    return {
      cursor: isSet(object.cursor) ? globalThis.String(object.cursor) : "",
      brokerAccountId: isSet(object.brokerAccountId) ? globalThis.String(object.brokerAccountId) : "",
      id: isSet(object.id) ? globalThis.String(object.id) : "",
      parentOperationId: isSet(object.parentOperationId) ? globalThis.String(object.parentOperationId) : "",
      name: isSet(object.name) ? globalThis.String(object.name) : "",
      date: isSet(object.date) ? fromJsonTimestamp(object.date) : undefined,
      type: isSet(object.type) ? operationTypeFromJSON(object.type) : 0,
      description: isSet(object.description) ? globalThis.String(object.description) : "",
      state: isSet(object.state) ? operationStateFromJSON(object.state) : 0,
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      figi: isSet(object.figi) ? globalThis.String(object.figi) : "",
      instrumentType: isSet(object.instrumentType) ? globalThis.String(object.instrumentType) : "",
      instrumentKind: isSet(object.instrumentKind) ? instrumentTypeFromJSON(object.instrumentKind) : 0,
      positionUid: isSet(object.positionUid) ? globalThis.String(object.positionUid) : "",
      ticker: isSet(object.ticker) ? globalThis.String(object.ticker) : "",
      classCode: isSet(object.classCode) ? globalThis.String(object.classCode) : "",
      payment: isSet(object.payment) ? MoneyValue.fromJSON(object.payment) : undefined,
      price: isSet(object.price) ? MoneyValue.fromJSON(object.price) : undefined,
      commission: isSet(object.commission) ? MoneyValue.fromJSON(object.commission) : undefined,
      yield: isSet(object.yield) ? MoneyValue.fromJSON(object.yield) : undefined,
      yieldRelative: isSet(object.yieldRelative) ? Quotation.fromJSON(object.yieldRelative) : undefined,
      accruedInt: isSet(object.accruedInt) ? MoneyValue.fromJSON(object.accruedInt) : undefined,
      quantity: isSet(object.quantity) ? globalThis.Number(object.quantity) : 0,
      quantityRest: isSet(object.quantityRest) ? globalThis.Number(object.quantityRest) : 0,
      quantityDone: isSet(object.quantityDone) ? globalThis.Number(object.quantityDone) : 0,
      cancelDateTime: isSet(object.cancelDateTime) ? fromJsonTimestamp(object.cancelDateTime) : undefined,
      cancelReason: isSet(object.cancelReason) ? globalThis.String(object.cancelReason) : "",
      tradesInfo: isSet(object.tradesInfo) ? OperationItemTrades.fromJSON(object.tradesInfo) : undefined,
      assetUid: isSet(object.assetUid) ? globalThis.String(object.assetUid) : "",
      childOperations: globalThis.Array.isArray(object?.childOperations)
        ? object.childOperations.map((e: any) => ChildOperationItem.fromJSON(e))
        : [],
    };
  },

  toJSON(message: OperationItem): unknown {
    const obj: any = {};
    if (message.cursor !== "") {
      obj.cursor = message.cursor;
    }
    if (message.brokerAccountId !== "") {
      obj.brokerAccountId = message.brokerAccountId;
    }
    if (message.id !== "") {
      obj.id = message.id;
    }
    if (message.parentOperationId !== "") {
      obj.parentOperationId = message.parentOperationId;
    }
    if (message.name !== "") {
      obj.name = message.name;
    }
    if (message.date !== undefined) {
      obj.date = message.date.toISOString();
    }
    if (message.type !== 0) {
      obj.type = operationTypeToJSON(message.type);
    }
    if (message.description !== "") {
      obj.description = message.description;
    }
    if (message.state !== 0) {
      obj.state = operationStateToJSON(message.state);
    }
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.figi !== "") {
      obj.figi = message.figi;
    }
    if (message.instrumentType !== "") {
      obj.instrumentType = message.instrumentType;
    }
    if (message.instrumentKind !== 0) {
      obj.instrumentKind = instrumentTypeToJSON(message.instrumentKind);
    }
    if (message.positionUid !== "") {
      obj.positionUid = message.positionUid;
    }
    if (message.ticker !== "") {
      obj.ticker = message.ticker;
    }
    if (message.classCode !== "") {
      obj.classCode = message.classCode;
    }
    if (message.payment !== undefined) {
      obj.payment = MoneyValue.toJSON(message.payment);
    }
    if (message.price !== undefined) {
      obj.price = MoneyValue.toJSON(message.price);
    }
    if (message.commission !== undefined) {
      obj.commission = MoneyValue.toJSON(message.commission);
    }
    if (message.yield !== undefined) {
      obj.yield = MoneyValue.toJSON(message.yield);
    }
    if (message.yieldRelative !== undefined) {
      obj.yieldRelative = Quotation.toJSON(message.yieldRelative);
    }
    if (message.accruedInt !== undefined) {
      obj.accruedInt = MoneyValue.toJSON(message.accruedInt);
    }
    if (message.quantity !== 0) {
      obj.quantity = Math.round(message.quantity);
    }
    if (message.quantityRest !== 0) {
      obj.quantityRest = Math.round(message.quantityRest);
    }
    if (message.quantityDone !== 0) {
      obj.quantityDone = Math.round(message.quantityDone);
    }
    if (message.cancelDateTime !== undefined) {
      obj.cancelDateTime = message.cancelDateTime.toISOString();
    }
    if (message.cancelReason !== "") {
      obj.cancelReason = message.cancelReason;
    }
    if (message.tradesInfo !== undefined) {
      obj.tradesInfo = OperationItemTrades.toJSON(message.tradesInfo);
    }
    if (message.assetUid !== "") {
      obj.assetUid = message.assetUid;
    }
    if (message.childOperations?.length) {
      obj.childOperations = message.childOperations.map((e) => ChildOperationItem.toJSON(e));
    }
    return obj;
  },
};

function createBaseOperationItemTrades(): OperationItemTrades {
  return { trades: [] };
}

export const OperationItemTrades = {
  encode(message: OperationItemTrades, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.trades) {
      OperationItemTrade.encode(v!, writer.uint32(50).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationItemTrades {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationItemTrades();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 6:
          if (tag !== 50) {
            break;
          }

          message.trades.push(OperationItemTrade.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationItemTrades {
    return {
      trades: globalThis.Array.isArray(object?.trades)
        ? object.trades.map((e: any) => OperationItemTrade.fromJSON(e))
        : [],
    };
  },

  toJSON(message: OperationItemTrades): unknown {
    const obj: any = {};
    if (message.trades?.length) {
      obj.trades = message.trades.map((e) => OperationItemTrade.toJSON(e));
    }
    return obj;
  },
};

function createBaseOperationItemTrade(): OperationItemTrade {
  return { num: "", date: undefined, quantity: 0, price: undefined, yield: undefined, yieldRelative: undefined };
}

export const OperationItemTrade = {
  encode(message: OperationItemTrade, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.num !== "") {
      writer.uint32(10).string(message.num);
    }
    if (message.date !== undefined) {
      Timestamp.encode(toTimestamp(message.date), writer.uint32(50).fork()).ldelim();
    }
    if (message.quantity !== 0) {
      writer.uint32(88).int64(message.quantity);
    }
    if (message.price !== undefined) {
      MoneyValue.encode(message.price, writer.uint32(130).fork()).ldelim();
    }
    if (message.yield !== undefined) {
      MoneyValue.encode(message.yield, writer.uint32(170).fork()).ldelim();
    }
    if (message.yieldRelative !== undefined) {
      Quotation.encode(message.yieldRelative, writer.uint32(178).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationItemTrade {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationItemTrade();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.num = reader.string();
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.date = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 11:
          if (tag !== 88) {
            break;
          }

          message.quantity = longToNumber(reader.int64() as Long);
          continue;
        case 16:
          if (tag !== 130) {
            break;
          }

          message.price = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 21:
          if (tag !== 170) {
            break;
          }

          message.yield = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 22:
          if (tag !== 178) {
            break;
          }

          message.yieldRelative = Quotation.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationItemTrade {
    return {
      num: isSet(object.num) ? globalThis.String(object.num) : "",
      date: isSet(object.date) ? fromJsonTimestamp(object.date) : undefined,
      quantity: isSet(object.quantity) ? globalThis.Number(object.quantity) : 0,
      price: isSet(object.price) ? MoneyValue.fromJSON(object.price) : undefined,
      yield: isSet(object.yield) ? MoneyValue.fromJSON(object.yield) : undefined,
      yieldRelative: isSet(object.yieldRelative) ? Quotation.fromJSON(object.yieldRelative) : undefined,
    };
  },

  toJSON(message: OperationItemTrade): unknown {
    const obj: any = {};
    if (message.num !== "") {
      obj.num = message.num;
    }
    if (message.date !== undefined) {
      obj.date = message.date.toISOString();
    }
    if (message.quantity !== 0) {
      obj.quantity = Math.round(message.quantity);
    }
    if (message.price !== undefined) {
      obj.price = MoneyValue.toJSON(message.price);
    }
    if (message.yield !== undefined) {
      obj.yield = MoneyValue.toJSON(message.yield);
    }
    if (message.yieldRelative !== undefined) {
      obj.yieldRelative = Quotation.toJSON(message.yieldRelative);
    }
    return obj;
  },
};

function createBasePositionsStreamRequest(): PositionsStreamRequest {
  return { accounts: [], withInitialPositions: false, pingSettings: undefined };
}

export const PositionsStreamRequest = {
  encode(message: PositionsStreamRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.accounts) {
      writer.uint32(10).string(v!);
    }
    if (message.withInitialPositions === true) {
      writer.uint32(24).bool(message.withInitialPositions);
    }
    if (message.pingSettings !== undefined) {
      PingDelaySettings.encode(message.pingSettings, writer.uint32(122).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsStreamRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsStreamRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accounts.push(reader.string());
          continue;
        case 3:
          if (tag !== 24) {
            break;
          }

          message.withInitialPositions = reader.bool();
          continue;
        case 15:
          if (tag !== 122) {
            break;
          }

          message.pingSettings = PingDelaySettings.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsStreamRequest {
    return {
      accounts: globalThis.Array.isArray(object?.accounts) ? object.accounts.map((e: any) => globalThis.String(e)) : [],
      withInitialPositions: isSet(object.withInitialPositions)
        ? globalThis.Boolean(object.withInitialPositions)
        : false,
      pingSettings: isSet(object.pingSettings) ? PingDelaySettings.fromJSON(object.pingSettings) : undefined,
    };
  },

  toJSON(message: PositionsStreamRequest): unknown {
    const obj: any = {};
    if (message.accounts?.length) {
      obj.accounts = message.accounts;
    }
    if (message.withInitialPositions === true) {
      obj.withInitialPositions = message.withInitialPositions;
    }
    if (message.pingSettings !== undefined) {
      obj.pingSettings = PingDelaySettings.toJSON(message.pingSettings);
    }
    return obj;
  },
};

function createBasePositionsStreamResponse(): PositionsStreamResponse {
  return { subscriptions: undefined, position: undefined, ping: undefined, initialPositions: undefined };
}

export const PositionsStreamResponse = {
  encode(message: PositionsStreamResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.subscriptions !== undefined) {
      PositionsSubscriptionResult.encode(message.subscriptions, writer.uint32(10).fork()).ldelim();
    }
    if (message.position !== undefined) {
      PositionData.encode(message.position, writer.uint32(18).fork()).ldelim();
    }
    if (message.ping !== undefined) {
      Ping.encode(message.ping, writer.uint32(26).fork()).ldelim();
    }
    if (message.initialPositions !== undefined) {
      PositionsResponse.encode(message.initialPositions, writer.uint32(42).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsStreamResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsStreamResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.subscriptions = PositionsSubscriptionResult.decode(reader, reader.uint32());
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.position = PositionData.decode(reader, reader.uint32());
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.ping = Ping.decode(reader, reader.uint32());
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.initialPositions = PositionsResponse.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsStreamResponse {
    return {
      subscriptions: isSet(object.subscriptions)
        ? PositionsSubscriptionResult.fromJSON(object.subscriptions)
        : undefined,
      position: isSet(object.position) ? PositionData.fromJSON(object.position) : undefined,
      ping: isSet(object.ping) ? Ping.fromJSON(object.ping) : undefined,
      initialPositions: isSet(object.initialPositions)
        ? PositionsResponse.fromJSON(object.initialPositions)
        : undefined,
    };
  },

  toJSON(message: PositionsStreamResponse): unknown {
    const obj: any = {};
    if (message.subscriptions !== undefined) {
      obj.subscriptions = PositionsSubscriptionResult.toJSON(message.subscriptions);
    }
    if (message.position !== undefined) {
      obj.position = PositionData.toJSON(message.position);
    }
    if (message.ping !== undefined) {
      obj.ping = Ping.toJSON(message.ping);
    }
    if (message.initialPositions !== undefined) {
      obj.initialPositions = PositionsResponse.toJSON(message.initialPositions);
    }
    return obj;
  },
};

function createBasePositionsSubscriptionResult(): PositionsSubscriptionResult {
  return { accounts: [], trackingId: "", streamId: "" };
}

export const PositionsSubscriptionResult = {
  encode(message: PositionsSubscriptionResult, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.accounts) {
      PositionsSubscriptionStatus.encode(v!, writer.uint32(10).fork()).ldelim();
    }
    if (message.trackingId !== "") {
      writer.uint32(58).string(message.trackingId);
    }
    if (message.streamId !== "") {
      writer.uint32(66).string(message.streamId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsSubscriptionResult {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsSubscriptionResult();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accounts.push(PositionsSubscriptionStatus.decode(reader, reader.uint32()));
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.trackingId = reader.string();
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.streamId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsSubscriptionResult {
    return {
      accounts: globalThis.Array.isArray(object?.accounts)
        ? object.accounts.map((e: any) => PositionsSubscriptionStatus.fromJSON(e))
        : [],
      trackingId: isSet(object.trackingId) ? globalThis.String(object.trackingId) : "",
      streamId: isSet(object.streamId) ? globalThis.String(object.streamId) : "",
    };
  },

  toJSON(message: PositionsSubscriptionResult): unknown {
    const obj: any = {};
    if (message.accounts?.length) {
      obj.accounts = message.accounts.map((e) => PositionsSubscriptionStatus.toJSON(e));
    }
    if (message.trackingId !== "") {
      obj.trackingId = message.trackingId;
    }
    if (message.streamId !== "") {
      obj.streamId = message.streamId;
    }
    return obj;
  },
};

function createBasePositionsSubscriptionStatus(): PositionsSubscriptionStatus {
  return { accountId: "", subscriptionStatus: 0 };
}

export const PositionsSubscriptionStatus = {
  encode(message: PositionsSubscriptionStatus, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    if (message.subscriptionStatus !== 0) {
      writer.uint32(48).int32(message.subscriptionStatus);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsSubscriptionStatus {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsSubscriptionStatus();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 6:
          if (tag !== 48) {
            break;
          }

          message.subscriptionStatus = reader.int32() as any;
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsSubscriptionStatus {
    return {
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      subscriptionStatus: isSet(object.subscriptionStatus)
        ? positionsAccountSubscriptionStatusFromJSON(object.subscriptionStatus)
        : 0,
    };
  },

  toJSON(message: PositionsSubscriptionStatus): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.subscriptionStatus !== 0) {
      obj.subscriptionStatus = positionsAccountSubscriptionStatusToJSON(message.subscriptionStatus);
    }
    return obj;
  },
};

function createBasePositionData(): PositionData {
  return { accountId: "", money: [], securities: [], futures: [], options: [], date: undefined };
}

export const PositionData = {
  encode(message: PositionData, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.accountId !== "") {
      writer.uint32(10).string(message.accountId);
    }
    for (const v of message.money) {
      PositionsMoney.encode(v!, writer.uint32(18).fork()).ldelim();
    }
    for (const v of message.securities) {
      PositionsSecurities.encode(v!, writer.uint32(26).fork()).ldelim();
    }
    for (const v of message.futures) {
      PositionsFutures.encode(v!, writer.uint32(34).fork()).ldelim();
    }
    for (const v of message.options) {
      PositionsOptions.encode(v!, writer.uint32(42).fork()).ldelim();
    }
    if (message.date !== undefined) {
      Timestamp.encode(toTimestamp(message.date), writer.uint32(50).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionData {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionData();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accountId = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.money.push(PositionsMoney.decode(reader, reader.uint32()));
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.securities.push(PositionsSecurities.decode(reader, reader.uint32()));
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.futures.push(PositionsFutures.decode(reader, reader.uint32()));
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.options.push(PositionsOptions.decode(reader, reader.uint32()));
          continue;
        case 6:
          if (tag !== 50) {
            break;
          }

          message.date = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionData {
    return {
      accountId: isSet(object.accountId) ? globalThis.String(object.accountId) : "",
      money: globalThis.Array.isArray(object?.money) ? object.money.map((e: any) => PositionsMoney.fromJSON(e)) : [],
      securities: globalThis.Array.isArray(object?.securities)
        ? object.securities.map((e: any) => PositionsSecurities.fromJSON(e))
        : [],
      futures: globalThis.Array.isArray(object?.futures)
        ? object.futures.map((e: any) => PositionsFutures.fromJSON(e))
        : [],
      options: globalThis.Array.isArray(object?.options)
        ? object.options.map((e: any) => PositionsOptions.fromJSON(e))
        : [],
      date: isSet(object.date) ? fromJsonTimestamp(object.date) : undefined,
    };
  },

  toJSON(message: PositionData): unknown {
    const obj: any = {};
    if (message.accountId !== "") {
      obj.accountId = message.accountId;
    }
    if (message.money?.length) {
      obj.money = message.money.map((e) => PositionsMoney.toJSON(e));
    }
    if (message.securities?.length) {
      obj.securities = message.securities.map((e) => PositionsSecurities.toJSON(e));
    }
    if (message.futures?.length) {
      obj.futures = message.futures.map((e) => PositionsFutures.toJSON(e));
    }
    if (message.options?.length) {
      obj.options = message.options.map((e) => PositionsOptions.toJSON(e));
    }
    if (message.date !== undefined) {
      obj.date = message.date.toISOString();
    }
    return obj;
  },
};

function createBasePositionsMoney(): PositionsMoney {
  return { availableValue: undefined, blockedValue: undefined };
}

export const PositionsMoney = {
  encode(message: PositionsMoney, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.availableValue !== undefined) {
      MoneyValue.encode(message.availableValue, writer.uint32(10).fork()).ldelim();
    }
    if (message.blockedValue !== undefined) {
      MoneyValue.encode(message.blockedValue, writer.uint32(18).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): PositionsMoney {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBasePositionsMoney();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.availableValue = MoneyValue.decode(reader, reader.uint32());
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.blockedValue = MoneyValue.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): PositionsMoney {
    return {
      availableValue: isSet(object.availableValue) ? MoneyValue.fromJSON(object.availableValue) : undefined,
      blockedValue: isSet(object.blockedValue) ? MoneyValue.fromJSON(object.blockedValue) : undefined,
    };
  },

  toJSON(message: PositionsMoney): unknown {
    const obj: any = {};
    if (message.availableValue !== undefined) {
      obj.availableValue = MoneyValue.toJSON(message.availableValue);
    }
    if (message.blockedValue !== undefined) {
      obj.blockedValue = MoneyValue.toJSON(message.blockedValue);
    }
    return obj;
  },
};

function createBaseChildOperationItem(): ChildOperationItem {
  return { instrumentUid: "", payment: undefined };
}

export const ChildOperationItem = {
  encode(message: ChildOperationItem, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.instrumentUid !== "") {
      writer.uint32(10).string(message.instrumentUid);
    }
    if (message.payment !== undefined) {
      MoneyValue.encode(message.payment, writer.uint32(18).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): ChildOperationItem {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseChildOperationItem();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.payment = MoneyValue.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): ChildOperationItem {
    return {
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      payment: isSet(object.payment) ? MoneyValue.fromJSON(object.payment) : undefined,
    };
  },

  toJSON(message: ChildOperationItem): unknown {
    const obj: any = {};
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.payment !== undefined) {
      obj.payment = MoneyValue.toJSON(message.payment);
    }
    return obj;
  },
};

function createBaseOperationsStreamRequest(): OperationsStreamRequest {
  return { accounts: [], pingSettings: undefined };
}

export const OperationsStreamRequest = {
  encode(message: OperationsStreamRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.accounts) {
      writer.uint32(10).string(v!);
    }
    if (message.pingSettings !== undefined) {
      PingDelaySettings.encode(message.pingSettings, writer.uint32(122).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationsStreamRequest {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationsStreamRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accounts.push(reader.string());
          continue;
        case 15:
          if (tag !== 122) {
            break;
          }

          message.pingSettings = PingDelaySettings.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationsStreamRequest {
    return {
      accounts: globalThis.Array.isArray(object?.accounts) ? object.accounts.map((e: any) => globalThis.String(e)) : [],
      pingSettings: isSet(object.pingSettings) ? PingDelaySettings.fromJSON(object.pingSettings) : undefined,
    };
  },

  toJSON(message: OperationsStreamRequest): unknown {
    const obj: any = {};
    if (message.accounts?.length) {
      obj.accounts = message.accounts;
    }
    if (message.pingSettings !== undefined) {
      obj.pingSettings = PingDelaySettings.toJSON(message.pingSettings);
    }
    return obj;
  },
};

function createBaseOperationsStreamResponse(): OperationsStreamResponse {
  return { subscriptions: undefined, operation: undefined, ping: undefined };
}

export const OperationsStreamResponse = {
  encode(message: OperationsStreamResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.subscriptions !== undefined) {
      OperationsSubscriptionResult.encode(message.subscriptions, writer.uint32(10).fork()).ldelim();
    }
    if (message.operation !== undefined) {
      OperationData.encode(message.operation, writer.uint32(18).fork()).ldelim();
    }
    if (message.ping !== undefined) {
      Ping.encode(message.ping, writer.uint32(26).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationsStreamResponse {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationsStreamResponse();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.subscriptions = OperationsSubscriptionResult.decode(reader, reader.uint32());
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.operation = OperationData.decode(reader, reader.uint32());
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.ping = Ping.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationsStreamResponse {
    return {
      subscriptions: isSet(object.subscriptions)
        ? OperationsSubscriptionResult.fromJSON(object.subscriptions)
        : undefined,
      operation: isSet(object.operation) ? OperationData.fromJSON(object.operation) : undefined,
      ping: isSet(object.ping) ? Ping.fromJSON(object.ping) : undefined,
    };
  },

  toJSON(message: OperationsStreamResponse): unknown {
    const obj: any = {};
    if (message.subscriptions !== undefined) {
      obj.subscriptions = OperationsSubscriptionResult.toJSON(message.subscriptions);
    }
    if (message.operation !== undefined) {
      obj.operation = OperationData.toJSON(message.operation);
    }
    if (message.ping !== undefined) {
      obj.ping = Ping.toJSON(message.ping);
    }
    return obj;
  },
};

function createBaseOperationsSubscriptionResult(): OperationsSubscriptionResult {
  return { accounts: [], subscriptionStatus: 0, trackingId: "", streamId: "" };
}

export const OperationsSubscriptionResult = {
  encode(message: OperationsSubscriptionResult, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.accounts) {
      writer.uint32(10).string(v!);
    }
    if (message.subscriptionStatus !== 0) {
      writer.uint32(16).int32(message.subscriptionStatus);
    }
    if (message.trackingId !== "") {
      writer.uint32(58).string(message.trackingId);
    }
    if (message.streamId !== "") {
      writer.uint32(66).string(message.streamId);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationsSubscriptionResult {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationsSubscriptionResult();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.accounts.push(reader.string());
          continue;
        case 2:
          if (tag !== 16) {
            break;
          }

          message.subscriptionStatus = reader.int32() as any;
          continue;
        case 7:
          if (tag !== 58) {
            break;
          }

          message.trackingId = reader.string();
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.streamId = reader.string();
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationsSubscriptionResult {
    return {
      accounts: globalThis.Array.isArray(object?.accounts) ? object.accounts.map((e: any) => globalThis.String(e)) : [],
      subscriptionStatus: isSet(object.subscriptionStatus)
        ? operationsAccountSubscriptionStatusFromJSON(object.subscriptionStatus)
        : 0,
      trackingId: isSet(object.trackingId) ? globalThis.String(object.trackingId) : "",
      streamId: isSet(object.streamId) ? globalThis.String(object.streamId) : "",
    };
  },

  toJSON(message: OperationsSubscriptionResult): unknown {
    const obj: any = {};
    if (message.accounts?.length) {
      obj.accounts = message.accounts;
    }
    if (message.subscriptionStatus !== 0) {
      obj.subscriptionStatus = operationsAccountSubscriptionStatusToJSON(message.subscriptionStatus);
    }
    if (message.trackingId !== "") {
      obj.trackingId = message.trackingId;
    }
    if (message.streamId !== "") {
      obj.streamId = message.streamId;
    }
    return obj;
  },
};

function createBaseOperationData(): OperationData {
  return {
    brokerAccountId: "",
    id: "",
    parentOperationId: "",
    name: "",
    date: undefined,
    type: 0,
    state: 0,
    instrumentUid: "",
    figi: "",
    instrumentType: "",
    instrumentKind: 0,
    positionUid: "",
    ticker: "",
    classCode: "",
    payment: undefined,
  };
}

export const OperationData = {
  encode(message: OperationData, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.brokerAccountId !== "") {
      writer.uint32(10).string(message.brokerAccountId);
    }
    if (message.id !== "") {
      writer.uint32(18).string(message.id);
    }
    if (message.parentOperationId !== "") {
      writer.uint32(26).string(message.parentOperationId);
    }
    if (message.name !== "") {
      writer.uint32(34).string(message.name);
    }
    if (message.date !== undefined) {
      Timestamp.encode(toTimestamp(message.date), writer.uint32(42).fork()).ldelim();
    }
    if (message.type !== 0) {
      writer.uint32(48).int32(message.type);
    }
    if (message.state !== 0) {
      writer.uint32(56).int32(message.state);
    }
    if (message.instrumentUid !== "") {
      writer.uint32(66).string(message.instrumentUid);
    }
    if (message.figi !== "") {
      writer.uint32(74).string(message.figi);
    }
    if (message.instrumentType !== "") {
      writer.uint32(82).string(message.instrumentType);
    }
    if (message.instrumentKind !== 0) {
      writer.uint32(88).int32(message.instrumentKind);
    }
    if (message.positionUid !== "") {
      writer.uint32(98).string(message.positionUid);
    }
    if (message.ticker !== "") {
      writer.uint32(106).string(message.ticker);
    }
    if (message.classCode !== "") {
      writer.uint32(114).string(message.classCode);
    }
    if (message.payment !== undefined) {
      MoneyValue.encode(message.payment, writer.uint32(122).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): OperationData {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseOperationData();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag !== 10) {
            break;
          }

          message.brokerAccountId = reader.string();
          continue;
        case 2:
          if (tag !== 18) {
            break;
          }

          message.id = reader.string();
          continue;
        case 3:
          if (tag !== 26) {
            break;
          }

          message.parentOperationId = reader.string();
          continue;
        case 4:
          if (tag !== 34) {
            break;
          }

          message.name = reader.string();
          continue;
        case 5:
          if (tag !== 42) {
            break;
          }

          message.date = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
          continue;
        case 6:
          if (tag !== 48) {
            break;
          }

          message.type = reader.int32() as any;
          continue;
        case 7:
          if (tag !== 56) {
            break;
          }

          message.state = reader.int32() as any;
          continue;
        case 8:
          if (tag !== 66) {
            break;
          }

          message.instrumentUid = reader.string();
          continue;
        case 9:
          if (tag !== 74) {
            break;
          }

          message.figi = reader.string();
          continue;
        case 10:
          if (tag !== 82) {
            break;
          }

          message.instrumentType = reader.string();
          continue;
        case 11:
          if (tag !== 88) {
            break;
          }

          message.instrumentKind = reader.int32() as any;
          continue;
        case 12:
          if (tag !== 98) {
            break;
          }

          message.positionUid = reader.string();
          continue;
        case 13:
          if (tag !== 106) {
            break;
          }

          message.ticker = reader.string();
          continue;
        case 14:
          if (tag !== 114) {
            break;
          }

          message.classCode = reader.string();
          continue;
        case 15:
          if (tag !== 122) {
            break;
          }

          message.payment = MoneyValue.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): OperationData {
    return {
      brokerAccountId: isSet(object.brokerAccountId) ? globalThis.String(object.brokerAccountId) : "",
      id: isSet(object.id) ? globalThis.String(object.id) : "",
      parentOperationId: isSet(object.parentOperationId) ? globalThis.String(object.parentOperationId) : "",
      name: isSet(object.name) ? globalThis.String(object.name) : "",
      date: isSet(object.date) ? fromJsonTimestamp(object.date) : undefined,
      type: isSet(object.type) ? operationTypeFromJSON(object.type) : 0,
      state: isSet(object.state) ? operationStateFromJSON(object.state) : 0,
      instrumentUid: isSet(object.instrumentUid) ? globalThis.String(object.instrumentUid) : "",
      figi: isSet(object.figi) ? globalThis.String(object.figi) : "",
      instrumentType: isSet(object.instrumentType) ? globalThis.String(object.instrumentType) : "",
      instrumentKind: isSet(object.instrumentKind) ? instrumentTypeFromJSON(object.instrumentKind) : 0,
      positionUid: isSet(object.positionUid) ? globalThis.String(object.positionUid) : "",
      ticker: isSet(object.ticker) ? globalThis.String(object.ticker) : "",
      classCode: isSet(object.classCode) ? globalThis.String(object.classCode) : "",
      payment: isSet(object.payment) ? MoneyValue.fromJSON(object.payment) : undefined,
    };
  },

  toJSON(message: OperationData): unknown {
    const obj: any = {};
    if (message.brokerAccountId !== "") {
      obj.brokerAccountId = message.brokerAccountId;
    }
    if (message.id !== "") {
      obj.id = message.id;
    }
    if (message.parentOperationId !== "") {
      obj.parentOperationId = message.parentOperationId;
    }
    if (message.name !== "") {
      obj.name = message.name;
    }
    if (message.date !== undefined) {
      obj.date = message.date.toISOString();
    }
    if (message.type !== 0) {
      obj.type = operationTypeToJSON(message.type);
    }
    if (message.state !== 0) {
      obj.state = operationStateToJSON(message.state);
    }
    if (message.instrumentUid !== "") {
      obj.instrumentUid = message.instrumentUid;
    }
    if (message.figi !== "") {
      obj.figi = message.figi;
    }
    if (message.instrumentType !== "") {
      obj.instrumentType = message.instrumentType;
    }
    if (message.instrumentKind !== 0) {
      obj.instrumentKind = instrumentTypeToJSON(message.instrumentKind);
    }
    if (message.positionUid !== "") {
      obj.positionUid = message.positionUid;
    }
    if (message.ticker !== "") {
      obj.ticker = message.ticker;
    }
    if (message.classCode !== "") {
      obj.classCode = message.classCode;
    }
    if (message.payment !== undefined) {
      obj.payment = MoneyValue.toJSON(message.payment);
    }
    return obj;
  },
};

/**
 * С помощью методов сервиса можно получить:<br/><br/> **1**. Список операций по счету.<br/> **2**.
 * Портфель по счету.<br/> **3**. Позиции ценных бумаг на счете.<br/> **4**.
 * Доступный остаток для вывода средств.<br/> **5**. Различные отчеты.
 */
export type OperationsServiceDefinition = typeof OperationsServiceDefinition;
export const OperationsServiceDefinition = {
  name: "OperationsService",
  fullName: "tinkoff.public.invest.api.contract.v1.OperationsService",
  methods: {
    /**
     * Deprecated GetOperations — список операций по счету
     * При работе с методом учитывайте [особенности взаимодействия](/invest/services/operations/operations_problems).
     */
    getOperations: {
      name: "GetOperations",
      requestType: OperationsRequest,
      requestStream: false,
      responseType: OperationsResponse,
      responseStream: false,
      options: {},
    },
    /** GetPortfolio — портфель по счету */
    getPortfolio: {
      name: "GetPortfolio",
      requestType: PortfolioRequest,
      requestStream: false,
      responseType: PortfolioResponse,
      responseStream: false,
      options: {},
    },
    /** GetPositions — список позиций по счету */
    getPositions: {
      name: "GetPositions",
      requestType: PositionsRequest,
      requestStream: false,
      responseType: PositionsResponse,
      responseStream: false,
      options: {},
    },
    /** GetWithdrawLimits — доступный остаток для вывода средств */
    getWithdrawLimits: {
      name: "GetWithdrawLimits",
      requestType: WithdrawLimitsRequest,
      requestStream: false,
      responseType: WithdrawLimitsResponse,
      responseStream: false,
      options: {},
    },
    /** GetBrokerReport — брокерский отчет. */
    getBrokerReport: {
      name: "GetBrokerReport",
      requestType: BrokerReportRequest,
      requestStream: false,
      responseType: BrokerReportResponse,
      responseStream: false,
      options: {},
    },
    /** GetDividendsForeignIssuer — отчет «Справка о доходах за пределами РФ» */
    getDividendsForeignIssuer: {
      name: "GetDividendsForeignIssuer",
      requestType: GetDividendsForeignIssuerRequest,
      requestStream: false,
      responseType: GetDividendsForeignIssuerResponse,
      responseStream: false,
      options: {},
    },
    /**
     * GetOperationsByCursor — список операций по счету с пагинацией
     * При работе с методом учитывайте [особенности взаимодействия](/invest/services/operations/operations_problems).
     */
    getOperationsByCursor: {
      name: "GetOperationsByCursor",
      requestType: GetOperationsByCursorRequest,
      requestStream: false,
      responseType: GetOperationsByCursorResponse,
      responseStream: false,
      options: {},
    },
  },
} as const;

export interface OperationsServiceImplementation<CallContextExt = {}> {
  /**
   * Deprecated GetOperations — список операций по счету
   * При работе с методом учитывайте [особенности взаимодействия](/invest/services/operations/operations_problems).
   */
  getOperations(request: OperationsRequest, context: CallContext & CallContextExt): Promise<OperationsResponse>;
  /** GetPortfolio — портфель по счету */
  getPortfolio(request: PortfolioRequest, context: CallContext & CallContextExt): Promise<PortfolioResponse>;
  /** GetPositions — список позиций по счету */
  getPositions(request: PositionsRequest, context: CallContext & CallContextExt): Promise<PositionsResponse>;
  /** GetWithdrawLimits — доступный остаток для вывода средств */
  getWithdrawLimits(
    request: WithdrawLimitsRequest,
    context: CallContext & CallContextExt,
  ): Promise<WithdrawLimitsResponse>;
  /** GetBrokerReport — брокерский отчет. */
  getBrokerReport(request: BrokerReportRequest, context: CallContext & CallContextExt): Promise<BrokerReportResponse>;
  /** GetDividendsForeignIssuer — отчет «Справка о доходах за пределами РФ» */
  getDividendsForeignIssuer(
    request: GetDividendsForeignIssuerRequest,
    context: CallContext & CallContextExt,
  ): Promise<GetDividendsForeignIssuerResponse>;
  /**
   * GetOperationsByCursor — список операций по счету с пагинацией
   * При работе с методом учитывайте [особенности взаимодействия](/invest/services/operations/operations_problems).
   */
  getOperationsByCursor(
    request: GetOperationsByCursorRequest,
    context: CallContext & CallContextExt,
  ): Promise<GetOperationsByCursorResponse>;
}

export interface OperationsServiceClient<CallOptionsExt = {}> {
  /**
   * Deprecated GetOperations — список операций по счету
   * При работе с методом учитывайте [особенности взаимодействия](/invest/services/operations/operations_problems).
   */
  getOperations(request: OperationsRequest, options?: CallOptions & CallOptionsExt): Promise<OperationsResponse>;
  /** GetPortfolio — портфель по счету */
  getPortfolio(request: PortfolioRequest, options?: CallOptions & CallOptionsExt): Promise<PortfolioResponse>;
  /** GetPositions — список позиций по счету */
  getPositions(request: PositionsRequest, options?: CallOptions & CallOptionsExt): Promise<PositionsResponse>;
  /** GetWithdrawLimits — доступный остаток для вывода средств */
  getWithdrawLimits(
    request: WithdrawLimitsRequest,
    options?: CallOptions & CallOptionsExt,
  ): Promise<WithdrawLimitsResponse>;
  /** GetBrokerReport — брокерский отчет. */
  getBrokerReport(request: BrokerReportRequest, options?: CallOptions & CallOptionsExt): Promise<BrokerReportResponse>;
  /** GetDividendsForeignIssuer — отчет «Справка о доходах за пределами РФ» */
  getDividendsForeignIssuer(
    request: GetDividendsForeignIssuerRequest,
    options?: CallOptions & CallOptionsExt,
  ): Promise<GetDividendsForeignIssuerResponse>;
  /**
   * GetOperationsByCursor — список операций по счету с пагинацией
   * При работе с методом учитывайте [особенности взаимодействия](/invest/services/operations/operations_problems).
   */
  getOperationsByCursor(
    request: GetOperationsByCursorRequest,
    options?: CallOptions & CallOptionsExt,
  ): Promise<GetOperationsByCursorResponse>;
}

export type OperationsStreamServiceDefinition = typeof OperationsStreamServiceDefinition;
export const OperationsStreamServiceDefinition = {
  name: "OperationsStreamService",
  fullName: "tinkoff.public.invest.api.contract.v1.OperationsStreamService",
  methods: {
    /** PortfolioStream — стрим обновлений портфеля */
    portfolioStream: {
      name: "PortfolioStream",
      requestType: PortfolioStreamRequest,
      requestStream: false,
      responseType: PortfolioStreamResponse,
      responseStream: true,
      options: {},
    },
    /** PositionsStream — стрим обновлений информации по изменению позиций портфеля */
    positionsStream: {
      name: "PositionsStream",
      requestType: PositionsStreamRequest,
      requestStream: false,
      responseType: PositionsStreamResponse,
      responseStream: true,
      options: {},
    },
    /** OperationsStream — стрим обновлений операций */
    operationsStream: {
      name: "OperationsStream",
      requestType: OperationsStreamRequest,
      requestStream: false,
      responseType: OperationsStreamResponse,
      responseStream: true,
      options: {},
    },
  },
} as const;

export interface OperationsStreamServiceImplementation<CallContextExt = {}> {
  /** PortfolioStream — стрим обновлений портфеля */
  portfolioStream(
    request: PortfolioStreamRequest,
    context: CallContext & CallContextExt,
  ): ServerStreamingMethodResult<PortfolioStreamResponse>;
  /** PositionsStream — стрим обновлений информации по изменению позиций портфеля */
  positionsStream(
    request: PositionsStreamRequest,
    context: CallContext & CallContextExt,
  ): ServerStreamingMethodResult<PositionsStreamResponse>;
  /** OperationsStream — стрим обновлений операций */
  operationsStream(
    request: OperationsStreamRequest,
    context: CallContext & CallContextExt,
  ): ServerStreamingMethodResult<OperationsStreamResponse>;
}

export interface OperationsStreamServiceClient<CallOptionsExt = {}> {
  /** PortfolioStream — стрим обновлений портфеля */
  portfolioStream(
    request: PortfolioStreamRequest,
    options?: CallOptions & CallOptionsExt,
  ): AsyncIterable<PortfolioStreamResponse>;
  /** PositionsStream — стрим обновлений информации по изменению позиций портфеля */
  positionsStream(
    request: PositionsStreamRequest,
    options?: CallOptions & CallOptionsExt,
  ): AsyncIterable<PositionsStreamResponse>;
  /** OperationsStream — стрим обновлений операций */
  operationsStream(
    request: OperationsStreamRequest,
    options?: CallOptions & CallOptionsExt,
  ): AsyncIterable<OperationsStreamResponse>;
}

function toTimestamp(date: Date): Timestamp {
  const seconds = date.getTime() / 1_000;
  const nanos = (date.getTime() % 1_000) * 1_000_000;
  return { seconds, nanos };
}

function fromTimestamp(t: Timestamp): Date {
  let millis = (t.seconds || 0) * 1_000;
  millis += (t.nanos || 0) / 1_000_000;
  return new globalThis.Date(millis);
}

function fromJsonTimestamp(o: any): Date {
  if (o instanceof globalThis.Date) {
    return o;
  } else if (typeof o === "string") {
    return new globalThis.Date(o);
  } else {
    return fromTimestamp(Timestamp.fromJSON(o));
  }
}

function longToNumber(long: Long): number {
  if (long.gt(globalThis.Number.MAX_SAFE_INTEGER)) {
    throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
  }
  return long.toNumber();
}

if (_m0.util.Long !== Long) {
  _m0.util.Long = Long as any;
  _m0.configure();
}

function isSet(value: any): boolean {
  return value !== null && value !== undefined;
}

export type ServerStreamingMethodResult<Response> = { [Symbol.asyncIterator](): AsyncIterator<Response, void> };
