code: def forward(self, x, feat_size: List[int]):
      x_norm = self.norm1(x)
      # NOTE as per the original impl, this seems odd, but shortcut uses un-normalized input if no proj
      x_shortcut = (
          x
          if self.shortcut_proj_attn is None
          else self.shortcut_proj_attn(x_norm)
      )
      x_shortcut = self._shortcut_pool(x_shortcut, feat_size)
      x, feat_size_new = self.attn(x_norm, feat_size)
      x = x_shortcut + self.drop_path1(x)
  
      x_norm = self.norm2(x)
      x_shortcut = (
          x
          if self.shortcut_proj_mlp is None
          else self.shortcut_proj_mlp(x_norm)
      )
      x = x_shortcut + self.drop_path2(self.mlp(x_norm))
      return x, feat_size_new
  
imports: import operator
  from collections import OrderedDict
  from dataclasses import dataclass
  from functools import partial, reduce
  from typing import Union, List, Tuple, Optional
  import torch
  import torch.utils.checkpoint
  from torch import nn
  from timm.data import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD
  from timm.layers import Mlp, DropPath, trunc_normal_tf_, get_norm_layer, to_2tuple
  from ._builder import build_model_with_cfg
  from ._features_fx import register_notrace_function
  from ._registry import register_model, register_model_deprecations, generate_default_cfgs
label_desc: Use image node_id 3 for calling the MultiScaleBlock obj's underlying member method code with example usage: obj.forward(x, feat_size) and returns: x,  feat_size_new