anchor.diff:    FValues.Assign(Source.Values);
   end;
   
  -function THashMap.Get(const AKey: Variant; var AValue: Variant): Boolean;
  +function THashMap.Get(const AKey: Variant; out AValue: Variant): Boolean;
   var
     Index: Integer;
   begin
     Index := FKeys.IndexOf(AKey);
     AValue := FValues[Index];
     Result := Index > -1;
  +end;
  +
  +procedure THashMap.Put(const AList: IImmutableList);
  +var
  +  I, N: Integer;
  +begin
  +  N := AList.Count;
  +  if Odd(N) then raise EArrayListError.Create('The Count of Alist must be even.');
  +  I := 0;
  +  while I < N do begin
  +      Put(AList[I], AList[I + 1]);
  +      Inc(I, 2);
  +  end;
  +end;
  +
  +procedure THashMap.Put(const AMap: IMap);
  +begin
  +  PutAll(AMap);
  +end;
  +
  +procedure THashMap.Put(const Container: Variant);
  +var
  +  I, N: Integer;
  +begin
  +  if VarIsList(Container) then
  +    Put(VarToList(Container))
  +  else if VarIsMap(Container) then
  +    PutAll(VarToMap(Container))
  +  else if VarIsArray(Container) then begin
  +    if Odd(Length(Container)) then raise EArrayListError.Create('The array length must be even.');
  +    I := VarArrayLowBound(Container, 1);
  +    N := VarArrayHighBound(Container, 1);
  +    while I < N do begin
  +      Put(Container[I], Container[I + 1]);
  +      Inc(I, 2);
  +    end;
  +  end;
  +end;
  +
  +procedure THashMap.Put(const ConstArray: array of const);
  +var
  +  I, N: Integer;
  +begin
  +  N := Length(ConstArray);
  +  if Odd(N) then raise EArrayListError.Create('The array length must be even.');
  +  I := 0;
  +  while I < N do begin
  +      Put(VarRecToVar(ConstArray[I]), VarRecToVar(ConstArray[I + 1]));
  +      Inc(I, 2);
  +  end;
   end;
   
   function THashMap.Add(const AKey, AValue: Variant): Boolean;
  
positive.code:     procedure PutAll(const AList: IImmutableList); overload;
      procedure PutAll(const AMap: IMap); overload;
      procedure PutAll(const Container: Variant); overload;
      function ToList(ListClass: TListClass; Sync: Boolean = True;
        ReadWriteSync: Boolean = False): IList;
      property Count: Integer read GetCount;
  
negative.code:     function GetValues: IImmutableList;
      function GetKey(const AValue: Variant): Variant;
      function Get(const AKey: Variant): Variant; overload;
      function Get(const AKey: Variant; out AValue: Variant): Boolean; overload;
      procedure Put(const AKey, AValue: Variant); overload;
      procedure Put(const AList: IImmutableList); overload;
      procedure Put(const AMap: IMap); overload;
      procedure Put(const Container: Variant); overload;
      procedure Put(const ConstArray: array of const); overload;
      function Add(const AKey, AValue: Variant): Boolean;
      procedure Clear;
      function ContainsKey(const AKey: Variant): Boolean;
  