Hex Artifact Content
Not logged in

Artifact a7e38ad7715a7bee4668828269dd0a9d0da37b2b:


0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 36 20 4d 61 69 64 53 61 66 65 2e 6e 65 74 20 6c  6 MaidSafe.net l
0020: 69 6d 69 74 65 64 2e 0a 2f 2f 0a 2f 2f 20 54 68  imited..//.// Th
0030: 69 73 20 53 41 46 45 20 4e 65 74 77 6f 72 6b 20  is SAFE Network 
0040: 53 6f 66 74 77 61 72 65 20 69 73 20 6c 69 63 65  Software is lice
0050: 6e 73 65 64 20 74 6f 20 79 6f 75 20 75 6e 64 65  nsed to you unde
0060: 72 20 28 31 29 20 74 68 65 20 4d 61 69 64 53 61  r (1) the MaidSa
0070: 66 65 2e 6e 65 74 20 43 6f 6d 6d 65 72 63 69 61  fe.net Commercia
0080: 6c 20 4c 69 63 65 6e 73 65 2c 0a 2f 2f 20 76 65  l License,.// ve
0090: 72 73 69 6f 6e 20 31 2e 30 20 6f 72 20 6c 61 74  rsion 1.0 or lat
00a0: 65 72 2c 20 6f 72 20 28 32 29 20 54 68 65 20 47  er, or (2) The G
00b0: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69  eneral Public Li
00c0: 63 65 6e 73 65 20 28 47 50 4c 29 2c 20 76 65 72  cense (GPL), ver
00d0: 73 69 6f 6e 20 33 2c 20 64 65 70 65 6e 64 69 6e  sion 3, dependin
00e0: 67 20 6f 6e 20 77 68 69 63 68 0a 2f 2f 20 6c 69  g on which.// li
00f0: 63 65 6e 63 65 20 79 6f 75 20 61 63 63 65 70 74  cence you accept
0100: 65 64 20 6f 6e 20 69 6e 69 74 69 61 6c 20 61 63  ed on initial ac
0110: 63 65 73 73 20 74 6f 20 74 68 65 20 53 6f 66 74  cess to the Soft
0120: 77 61 72 65 20 28 74 68 65 20 22 4c 69 63 65 6e  ware (the "Licen
0130: 63 65 73 22 29 2e 0a 2f 2f 0a 2f 2f 20 42 79 20  ces")..//.// By 
0140: 63 6f 6e 74 72 69 62 75 74 69 6e 67 20 63 6f 64  contributing cod
0150: 65 20 74 6f 20 74 68 65 20 53 41 46 45 20 4e 65  e to the SAFE Ne
0160: 74 77 6f 72 6b 20 53 6f 66 74 77 61 72 65 2c 20  twork Software, 
0170: 6f 72 20 74 6f 20 74 68 69 73 20 70 72 6f 6a 65  or to this proje
0180: 63 74 20 67 65 6e 65 72 61 6c 6c 79 2c 20 79 6f  ct generally, yo
0190: 75 20 61 67 72 65 65 20 74 6f 20 62 65 0a 2f 2f  u agree to be.//
01a0: 20 62 6f 75 6e 64 20 62 79 20 74 68 65 20 74 65   bound by the te
01b0: 72 6d 73 20 6f 66 20 74 68 65 20 4d 61 69 64 53  rms of the MaidS
01c0: 61 66 65 20 43 6f 6e 74 72 69 62 75 74 6f 72 20  afe Contributor 
01d0: 41 67 72 65 65 6d 65 6e 74 2e 20 20 54 68 69 73  Agreement.  This
01e0: 2c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  , along with the
01f0: 20 4c 69 63 65 6e 73 65 73 20 63 61 6e 20 62 65   Licenses can be
0200: 0a 2f 2f 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  .// found in the
0210: 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20   root directory 
0220: 6f 66 20 74 68 69 73 20 70 72 6f 6a 65 63 74 20  of this project 
0230: 61 74 20 4c 49 43 45 4e 53 45 2c 20 43 4f 50 59  at LICENSE, COPY
0240: 49 4e 47 20 61 6e 64 20 43 4f 4e 54 52 49 42 55  ING and CONTRIBU
0250: 54 4f 52 2e 0a 2f 2f 0a 2f 2f 20 55 6e 6c 65 73  TOR..//.// Unles
0260: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70  s required by ap
0270: 70 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20  plicable law or 
0280: 61 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69  agreed to in wri
0290: 74 69 6e 67 2c 20 74 68 65 20 53 41 46 45 20 4e  ting, the SAFE N
02a0: 65 74 77 6f 72 6b 20 53 6f 66 74 77 61 72 65 20  etwork Software 
02b0: 64 69 73 74 72 69 62 75 74 65 64 0a 2f 2f 20 75  distributed.// u
02c0: 6e 64 65 72 20 74 68 65 20 47 50 4c 20 4c 69 63  nder the GPL Lic
02d0: 65 6e 63 65 20 69 73 20 64 69 73 74 72 69 62 75  ence is distribu
02e0: 74 65 64 20 6f 6e 20 61 6e 20 22 41 53 20 49 53  ted on an "AS IS
02f0: 22 20 42 41 53 49 53 2c 20 57 49 54 48 4f 55 54  " BASIS, WITHOUT
0300: 20 57 41 52 52 41 4e 54 49 45 53 20 4f 52 20 43   WARRANTIES OR C
0310: 4f 4e 44 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59  ONDITIONS OF ANY
0320: 0a 2f 2f 20 4b 49 4e 44 2c 20 65 69 74 68 65 72  .// KIND, either
0330: 20 65 78 70 72 65 73 73 20 6f 72 20 69 6d 70 6c   express or impl
0340: 69 65 64 2e 0a 2f 2f 0a 2f 2f 20 50 6c 65 61 73  ied..//.// Pleas
0350: 65 20 72 65 76 69 65 77 20 74 68 65 20 4c 69 63  e review the Lic
0360: 65 6e 63 65 73 20 66 6f 72 20 74 68 65 20 73 70  ences for the sp
0370: 65 63 69 66 69 63 20 6c 61 6e 67 75 61 67 65 20  ecific language 
0380: 67 6f 76 65 72 6e 69 6e 67 20 70 65 72 6d 69 73  governing permis
0390: 73 69 6f 6e 73 20 61 6e 64 20 6c 69 6d 69 74 61  sions and limita
03a0: 74 69 6f 6e 73 0a 2f 2f 20 72 65 6c 61 74 69 6e  tions.// relatin
03b0: 67 20 74 6f 20 75 73 65 20 6f 66 20 74 68 65 20  g to use of the 
03c0: 53 41 46 45 20 4e 65 74 77 6f 72 6b 20 53 6f 66  SAFE Network Sof
03d0: 74 77 61 72 65 2e 0a 0a 75 73 65 20 63 6f 72 65  tware...use core
03e0: 3a 3a 65 72 72 6f 72 73 3a 3a 43 6f 72 65 45 72  ::errors::CoreEr
03f0: 72 6f 72 3b 0a 75 73 65 20 66 66 69 3a 3a 61 70  ror;.use ffi::ap
0400: 70 3a 3a 41 70 70 3b 0a 75 73 65 20 66 66 69 3a  p::App;.use ffi:
0410: 3a 65 72 72 6f 72 73 3a 3a 46 66 69 45 72 72 6f  :errors::FfiErro
0420: 72 3b 0a 75 73 65 20 66 66 69 3a 3a 68 65 6c 70  r;.use ffi::help
0430: 65 72 3b 0a 75 73 65 20 66 66 69 3a 3a 6c 6f 77  er;.use ffi::low
0440: 5f 6c 65 76 65 6c 5f 61 70 69 3a 3a 7b 41 70 70  _level_api::{App
0450: 65 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c  endableDataHandl
0460: 65 2c 20 44 61 74 61 49 64 48 61 6e 64 6c 65 2c  e, DataIdHandle,
0470: 20 45 6e 63 72 79 70 74 4b 65 79 48 61 6e 64 6c   EncryptKeyHandl
0480: 65 2c 20 53 69 67 6e 4b 65 79 48 61 6e 64 6c 65  e, SignKeyHandle
0490: 7d 3b 0a 75 73 65 20 66 66 69 3a 3a 6c 6f 77 5f  };.use ffi::low_
04a0: 6c 65 76 65 6c 5f 61 70 69 3a 3a 6f 62 6a 65 63  level_api::objec
04b0: 74 5f 63 61 63 68 65 3a 3a 6f 62 6a 65 63 74 5f  t_cache::object_
04c0: 63 61 63 68 65 3b 0a 75 73 65 20 72 6f 75 74 69  cache;.use routi
04d0: 6e 67 3a 3a 7b 41 70 70 65 6e 64 57 72 61 70 70  ng::{AppendWrapp
04e0: 65 72 2c 20 41 70 70 65 6e 64 65 64 44 61 74 61  er, AppendedData
04f0: 2c 20 44 61 74 61 2c 20 46 69 6c 74 65 72 2c 20  , Data, Filter, 
0500: 50 72 69 76 41 70 70 65 6e 64 61 62 6c 65 44 61  PrivAppendableDa
0510: 74 61 2c 20 50 72 69 76 41 70 70 65 6e 64 65 64  ta, PrivAppended
0520: 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Data,.          
0530: 20 20 20 20 50 75 62 41 70 70 65 6e 64 61 62 6c      PubAppendabl
0540: 65 44 61 74 61 2c 20 58 4f 52 5f 4e 41 4d 45 5f  eData, XOR_NAME_
0550: 4c 45 4e 2c 20 58 6f 72 4e 61 6d 65 7d 3b 0a 75  LEN, XorName};.u
0560: 73 65 20 73 74 64 3a 3a 7b 6d 65 6d 2c 20 70 74  se std::{mem, pt
0570: 72 7d 3b 0a 75 73 65 20 73 74 64 3a 3a 63 6f 6c  r};.use std::col
0580: 6c 65 63 74 69 6f 6e 73 3a 3a 42 54 72 65 65 53  lections::BTreeS
0590: 65 74 3b 0a 75 73 65 20 73 74 64 3a 3a 69 74 65  et;.use std::ite
05a0: 72 3b 0a 0a 2f 2f 2f 20 57 72 61 70 70 65 72 20  r;../// Wrapper 
05b0: 66 6f 72 20 60 50 72 69 76 41 70 70 65 6e 64 61  for `PrivAppenda
05c0: 62 6c 65 44 61 74 61 60 20 61 6e 64 20 60 50 75  bleData` and `Pu
05d0: 62 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 60  bAppendableData`
05e0: 2e 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65  ..#[derive(Clone
05f0: 2c 20 44 65 62 75 67 2c 20 48 61 73 68 29 5d 0a  , Debug, Hash)].
0600: 70 75 62 20 65 6e 75 6d 20 41 70 70 65 6e 64 61  pub enum Appenda
0610: 62 6c 65 44 61 74 61 20 7b 0a 20 20 20 20 2f 2f  bleData {.    //
0620: 2f 20 50 75 62 6c 69 63 20 61 70 70 65 6e 64 61  / Public appenda
0630: 62 6c 65 20 64 61 74 61 2e 0a 20 20 20 20 50 75  ble data..    Pu
0640: 62 28 50 75 62 41 70 70 65 6e 64 61 62 6c 65 44  b(PubAppendableD
0650: 61 74 61 29 2c 0a 20 20 20 20 2f 2f 2f 20 50 72  ata),.    /// Pr
0660: 69 76 61 74 65 20 61 70 70 65 6e 64 61 62 6c 65  ivate appendable
0670: 20 64 61 74 61 2e 0a 20 20 20 20 50 72 69 76 28   data..    Priv(
0680: 50 72 69 76 41 70 70 65 6e 64 61 62 6c 65 44 61  PrivAppendableDa
0690: 74 61 29 2c 0a 7d 0a 0a 69 6d 70 6c 20 41 70 70  ta),.}..impl App
06a0: 65 6e 64 61 62 6c 65 44 61 74 61 20 7b 0a 20 20  endableData {.  
06b0: 20 20 66 6e 20 66 69 6c 74 65 72 5f 6d 75 74 28    fn filter_mut(
06c0: 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20 26 6d  &mut self) -> &m
06d0: 75 74 20 46 69 6c 74 65 72 20 7b 0a 20 20 20 20  ut Filter {.    
06e0: 20 20 20 20 6d 61 74 63 68 20 2a 73 65 6c 66 20      match *self 
06f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 70  {.            Ap
0700: 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 75  pendableData::Pu
0710: 62 28 72 65 66 20 6d 75 74 20 64 61 74 61 29 20  b(ref mut data) 
0720: 3d 3e 20 26 6d 75 74 20 64 61 74 61 2e 66 69 6c  => &mut data.fil
0730: 74 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ter,.           
0740: 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 3a   AppendableData:
0750: 3a 50 72 69 76 28 72 65 66 20 6d 75 74 20 64 61  :Priv(ref mut da
0760: 74 61 29 20 3d 3e 20 26 6d 75 74 20 64 61 74 61  ta) => &mut data
0770: 2e 66 69 6c 74 65 72 2c 0a 20 20 20 20 20 20 20  .filter,.       
0780: 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c   }.    }.}..impl
0790: 20 49 6e 74 6f 3c 44 61 74 61 3e 20 66 6f 72 20   Into<Data> for 
07a0: 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 20 7b  AppendableData {
07b0: 0a 20 20 20 20 66 6e 20 69 6e 74 6f 28 73 65 6c  .    fn into(sel
07c0: 66 29 20 2d 3e 20 44 61 74 61 20 7b 0a 20 20 20  f) -> Data {.   
07d0: 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 20       match self 
07e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 70  {.            Ap
07f0: 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 75  pendableData::Pu
0800: 62 28 64 61 74 61 29 20 3d 3e 20 44 61 74 61 3a  b(data) => Data:
0810: 3a 50 75 62 41 70 70 65 6e 64 61 62 6c 65 28 64  :PubAppendable(d
0820: 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
0830: 20 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61    AppendableData
0840: 3a 3a 50 72 69 76 28 64 61 74 61 29 20 3d 3e 20  ::Priv(data) => 
0850: 44 61 74 61 3a 3a 50 72 69 76 41 70 70 65 6e 64  Data::PrivAppend
0860: 61 62 6c 65 28 64 61 74 61 29 2c 0a 20 20 20 20  able(data),.    
0870: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 2f      }.    }.}../
0880: 2f 2f 20 46 69 6c 74 65 72 20 54 79 70 65 0a 23  // Filter Type.#
0890: 5b 72 65 70 72 28 43 29 5d 0a 23 5b 64 65 72 69  [repr(C)].#[deri
08a0: 76 65 28 44 65 62 75 67 2c 20 50 61 72 74 69 61  ve(Debug, Partia
08b0: 6c 45 71 29 5d 0a 70 75 62 20 65 6e 75 6d 20 46  lEq)].pub enum F
08c0: 69 6c 74 65 72 54 79 70 65 20 7b 0a 20 20 20 20  ilterType {.    
08d0: 2f 2f 2f 20 42 6c 61 63 6b 4c 69 73 74 0a 20 20  /// BlackList.  
08e0: 20 20 42 6c 61 63 6b 4c 69 73 74 2c 0a 20 20 20    BlackList,.   
08f0: 20 2f 2f 2f 20 57 68 69 74 65 4c 69 73 74 0a 20   /// WhiteList. 
0900: 20 20 20 57 68 69 74 65 4c 69 73 74 2c 0a 7d 0a     WhiteList,.}.
0910: 0a 2f 2f 2f 20 43 72 65 61 74 65 20 6e 65 77 20  ./// Create new 
0920: 60 50 75 62 41 70 70 65 6e 64 61 62 6c 65 44 61  `PubAppendableDa
0930: 74 61 60 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d  ta`.#[no_mangle]
0940: 0a 70 75 62 20 75 6e 73 61 66 65 20 65 78 74 65  .pub unsafe exte
0950: 72 6e 20 22 43 22 20 66 6e 20 61 70 70 65 6e 64  rn "C" fn append
0960: 61 62 6c 65 5f 64 61 74 61 5f 6e 65 77 5f 70 75  able_data_new_pu
0970: 62 28 61 70 70 3a 20 2a 63 6f 6e 73 74 20 41 70  b(app: *const Ap
0980: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 20 20 6e 61 6d 65 3a 20 2a 63 6f 6e 73 74      name: *const
09c0: 20 5b 75 38 3b 20 58 4f 52 5f 4e 41 4d 45 5f 4c   [u8; XOR_NAME_L
09d0: 45 4e 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EN],.           
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 20 6f 5f 68 61 6e 64 6c 65 3a 20        o_handle: 
0a10: 2a 6d 75 74 20 41 70 70 65 6e 64 61 62 6c 65 44  *mut AppendableD
0a20: 61 74 61 48 61 6e 64 6c 65 29 0a 20 20 20 20 20  ataHandle).     
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20 69              -> i
0a60: 33 32 20 7b 0a 20 20 20 20 68 65 6c 70 65 72 3a  32 {.    helper:
0a70: 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69 33  :catch_unwind_i3
0a80: 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 6c  2(|| {.        l
0a90: 65 74 20 63 6c 69 65 6e 74 20 3d 20 28 2a 61 70  et client = (*ap
0aa0: 70 29 2e 67 65 74 5f 63 6c 69 65 6e 74 28 29 3b  p).get_client();
0ab0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 61 6d  .        let nam
0ac0: 65 20 3d 20 58 6f 72 4e 61 6d 65 28 2a 6e 61 6d  e = XorName(*nam
0ad0: 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74  e);..        let
0ae0: 20 28 6f 77 6e 65 72 5f 6b 65 79 2c 20 70 72 69   (owner_key, pri
0af0: 76 61 74 65 5f 73 69 67 6e 69 6e 67 5f 6b 65 79  vate_signing_key
0b00: 29 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ) = {.          
0b10: 20 20 6c 65 74 20 63 6c 69 65 6e 74 20 3d 20 75    let client = u
0b20: 6e 77 72 61 70 21 28 63 6c 69 65 6e 74 2e 6c 6f  nwrap!(client.lo
0b30: 63 6b 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ck());.         
0b40: 20 20 20 6c 65 74 20 6f 77 6e 65 72 5f 6b 65 79     let owner_key
0b50: 20 3d 20 2a 66 66 69 5f 74 72 79 21 28 63 6c 69   = *ffi_try!(cli
0b60: 65 6e 74 2e 67 65 74 5f 70 75 62 6c 69 63 5f 73  ent.get_public_s
0b70: 69 67 6e 69 6e 67 5f 6b 65 79 28 29 29 3b 0a 20  igning_key());. 
0b80: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 70             let p
0b90: 72 69 76 61 74 65 5f 73 69 67 6e 69 6e 67 5f 6b  rivate_signing_k
0ba0: 65 79 20 3d 20 66 66 69 5f 74 72 79 21 28 63 6c  ey = ffi_try!(cl
0bb0: 69 65 6e 74 2e 67 65 74 5f 73 65 63 72 65 74 5f  ient.get_secret_
0bc0: 73 69 67 6e 69 6e 67 5f 6b 65 79 28 29 29 2e 63  signing_key()).c
0bd0: 6c 6f 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20  lone();.        
0be0: 20 20 20 20 28 6f 77 6e 65 72 5f 6b 65 79 2c 20      (owner_key, 
0bf0: 70 72 69 76 61 74 65 5f 73 69 67 6e 69 6e 67 5f  private_signing_
0c00: 6b 65 79 29 0a 20 20 20 20 20 20 20 20 7d 3b 0a  key).        };.
0c10: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74  .        let mut
0c20: 20 6f 77 6e 65 72 73 20 3d 20 42 54 72 65 65 53   owners = BTreeS
0c30: 65 74 3a 3a 6e 65 77 28 29 3b 0a 20 20 20 20 20  et::new();.     
0c40: 20 20 20 6f 77 6e 65 72 73 2e 69 6e 73 65 72 74     owners.insert
0c50: 28 6f 77 6e 65 72 5f 6b 65 79 29 3b 0a 0a 20 20  (owner_key);..  
0c60: 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 64 61        let mut da
0c70: 74 61 20 3d 20 66 66 69 5f 74 72 79 21 28 50 75  ta = ffi_try!(Pu
0c80: 62 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 3a  bAppendableData:
0c90: 3a 6e 65 77 28 6e 61 6d 65 2c 0a 20 20 20 20 20  :new(name,.     
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65              owne
0d10: 72 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rs,.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 20 20 20 20 20 20 20 44 65 66 61 75             Defau
0d50: 6c 74 3a 3a 64 65 66 61 75 6c 74 28 29 2c 0a 20  lt::default(),. 
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 20 46 69 6c 74 65 72 3a 3a 62 6c        Filter::bl
0da0: 61 63 6b 5f 6c 69 73 74 28 69 74 65 72 3a 3a 65  ack_list(iter::e
0db0: 6d 70 74 79 28 29 29 29 0a 20 20 20 20 20 20 20  mpty())).       
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 2e 6d 61 70 5f 65 72 72 28 43 6f 72 65 45 72   .map_err(CoreEr
0df0: 72 6f 72 3a 3a 66 72 6f 6d 29 29 3b 0a 20 20 20  ror::from));.   
0e00: 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 66 66 69       let _ = ffi
0e10: 5f 74 72 79 21 28 64 61 74 61 2e 61 64 64 5f 73  _try!(data.add_s
0e20: 69 67 6e 61 74 75 72 65 28 26 28 6f 77 6e 65 72  ignature(&(owner
0e30: 5f 6b 65 79 2c 20 70 72 69 76 61 74 65 5f 73 69  _key, private_si
0e40: 67 6e 69 6e 67 5f 6b 65 79 29 29 0a 20 20 20 20  gning_key)).    
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 20 20 20 20 20 20 20 20 2e 6d 61 70 5f 65 72           .map_er
0e70: 72 28 43 6f 72 65 45 72 72 6f 72 3a 3a 66 72 6f  r(CoreError::fro
0e80: 6d 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65  m));..        le
0e90: 74 20 68 61 6e 64 6c 65 20 3d 20 75 6e 77 72 61  t handle = unwra
0ea0: 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 28  p!(object_cache(
0eb0: 29 29 2e 69 6e 73 65 72 74 5f 61 64 28 41 70 70  )).insert_ad(App
0ec0: 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 75 62  endableData::Pub
0ed0: 28 64 61 74 61 29 29 3b 0a 0a 20 20 20 20 20 20  (data));..      
0ee0: 20 20 70 74 72 3a 3a 77 72 69 74 65 28 6f 5f 68    ptr::write(o_h
0ef0: 61 6e 64 6c 65 2c 20 68 61 6e 64 6c 65 29 3b 0a  andle, handle);.
0f00: 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 7d 29          0.    })
0f10: 0a 7d 0a 0a 2f 2f 2f 20 43 72 65 61 74 65 20 6e  .}../// Create n
0f20: 65 77 20 60 50 72 69 76 41 70 70 65 6e 64 61 62  ew `PrivAppendab
0f30: 6c 65 44 61 74 61 60 0a 23 5b 6e 6f 5f 6d 61 6e  leData`.#[no_man
0f40: 67 6c 65 5d 0a 70 75 62 20 75 6e 73 61 66 65 20  gle].pub unsafe 
0f50: 65 78 74 65 72 6e 20 22 43 22 20 66 6e 20 61 70  extern "C" fn ap
0f60: 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 6e 65  pendable_data_ne
0f70: 77 5f 70 72 69 76 28 61 70 70 3a 20 2a 63 6f 6e  w_priv(app: *con
0f80: 73 74 20 41 70 70 2c 0a 20 20 20 20 20 20 20 20  st App,.        
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a 20            name: 
0fc0: 2a 63 6f 6e 73 74 20 5b 75 38 3b 20 58 4f 52 5f  *const [u8; XOR_
0fd0: 4e 41 4d 45 5f 4c 45 4e 5d 2c 0a 20 20 20 20 20  NAME_LEN],.     
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 5f 68               o_h
1010: 61 6e 64 6c 65 3a 20 2a 6d 75 74 20 41 70 70 65  andle: *mut Appe
1020: 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65  ndableDataHandle
1030: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1060: 20 20 20 20 2d 3e 20 69 33 32 20 7b 0a 20 20 20      -> i32 {.   
1070: 20 68 65 6c 70 65 72 3a 3a 63 61 74 63 68 5f 75   helper::catch_u
1080: 6e 77 69 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a 20  nwind_i32(|| {. 
1090: 20 20 20 20 20 20 20 6c 65 74 20 61 70 70 20 3d         let app =
10a0: 20 26 2a 61 70 70 3b 0a 20 20 20 20 20 20 20 20   &*app;.        
10b0: 6c 65 74 20 63 6c 69 65 6e 74 20 3d 20 61 70 70  let client = app
10c0: 2e 67 65 74 5f 63 6c 69 65 6e 74 28 29 3b 0a 20  .get_client();. 
10d0: 20 20 20 20 20 20 20 6c 65 74 20 6e 61 6d 65 20         let name 
10e0: 3d 20 58 6f 72 4e 61 6d 65 28 2a 6e 61 6d 65 29  = XorName(*name)
10f0: 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74 20 28  ;..        let (
1100: 6f 77 6e 65 72 5f 6b 65 79 2c 20 70 72 69 76 61  owner_key, priva
1110: 74 65 5f 73 69 67 6e 69 6e 67 5f 6b 65 79 29 20  te_signing_key) 
1120: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
1130: 6c 65 74 20 63 6c 69 65 6e 74 20 3d 20 75 6e 77  let client = unw
1140: 72 61 70 21 28 63 6c 69 65 6e 74 2e 6c 6f 63 6b  rap!(client.lock
1150: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ());.           
1160: 20 6c 65 74 20 6f 77 6e 65 72 5f 6b 65 79 20 3d   let owner_key =
1170: 20 2a 66 66 69 5f 74 72 79 21 28 63 6c 69 65 6e   *ffi_try!(clien
1180: 74 2e 67 65 74 5f 70 75 62 6c 69 63 5f 73 69 67  t.get_public_sig
1190: 6e 69 6e 67 5f 6b 65 79 28 29 29 3b 0a 20 20 20  ning_key());.   
11a0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 70 72 69           let pri
11b0: 76 61 74 65 5f 73 69 67 6e 69 6e 67 5f 6b 65 79  vate_signing_key
11c0: 20 3d 20 66 66 69 5f 74 72 79 21 28 63 6c 69 65   = ffi_try!(clie
11d0: 6e 74 2e 67 65 74 5f 73 65 63 72 65 74 5f 73 69  nt.get_secret_si
11e0: 67 6e 69 6e 67 5f 6b 65 79 28 29 29 2e 63 6c 6f  gning_key()).clo
11f0: 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ne();.          
1200: 20 20 28 6f 77 6e 65 72 5f 6b 65 79 2c 20 70 72    (owner_key, pr
1210: 69 76 61 74 65 5f 73 69 67 6e 69 6e 67 5f 6b 65  ivate_signing_ke
1220: 79 29 0a 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  y).        };.. 
1230: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6f         let mut o
1240: 77 6e 65 72 73 20 3d 20 42 54 72 65 65 53 65 74  wners = BTreeSet
1250: 3a 3a 6e 65 77 28 29 3b 0a 20 20 20 20 20 20 20  ::new();.       
1260: 20 6f 77 6e 65 72 73 2e 69 6e 73 65 72 74 28 6f   owners.insert(o
1270: 77 6e 65 72 5f 6b 65 79 29 3b 0a 0a 20 20 20 20  wner_key);..    
1280: 20 20 20 20 6c 65 74 20 6d 75 74 20 64 61 74 61      let mut data
1290: 20 3d 20 66 66 69 5f 74 72 79 21 28 50 72 69 76   = ffi_try!(Priv
12a0: 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a  AppendableData::
12b0: 6e 65 77 28 6e 61 6d 65 2c 0a 20 20 20 20 20 20  new(name,.      
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e               own
1330: 65 72 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ers,.           
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 65 66               Def
1370: 61 75 6c 74 3a 3a 64 65 66 61 75 6c 74 28 29 2c  ault::default(),
1380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 46 69 6c 74 65 72 3a           Filter:
13c0: 3a 62 6c 61 63 6b 5f 6c 69 73 74 28 69 74 65 72  :black_list(iter
13d0: 3a 3a 65 6d 70 74 79 28 29 29 2c 0a 20 20 20 20  ::empty()),.    
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 66 66 69 5f 74 72 79 21 28 61 70 70      ffi_try!(app
1420: 2e 61 73 79 6d 5f 6b 65 79 73 28 29 29 2e 30 29  .asym_keys()).0)
1430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 20 20 20 20 20 20 20 20 2e 6d 61 70 5f 65 72           .map_er
1460: 72 28 43 6f 72 65 45 72 72 6f 72 3a 3a 66 72 6f  r(CoreError::fro
1470: 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  m));.        let
1480: 20 5f 20 3d 20 66 66 69 5f 74 72 79 21 28 64 61   _ = ffi_try!(da
1490: 74 61 2e 61 64 64 5f 73 69 67 6e 61 74 75 72 65  ta.add_signature
14a0: 28 26 28 6f 77 6e 65 72 5f 6b 65 79 2c 20 70 72  (&(owner_key, pr
14b0: 69 76 61 74 65 5f 73 69 67 6e 69 6e 67 5f 6b 65  ivate_signing_ke
14c0: 79 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  y)).            
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 2e 6d 61 70 5f 65 72 72 28 43 6f 72 65 45 72   .map_err(CoreEr
14f0: 72 6f 72 3a 3a 66 72 6f 6d 29 29 3b 0a 0a 20 20  ror::from));..  
1500: 20 20 20 20 20 20 6c 65 74 20 68 61 6e 64 6c 65        let handle
1510: 20 3d 20 75 6e 77 72 61 70 21 28 6f 62 6a 65 63   = unwrap!(objec
1520: 74 5f 63 61 63 68 65 28 29 29 2e 69 6e 73 65 72  t_cache()).inser
1530: 74 5f 61 64 28 41 70 70 65 6e 64 61 62 6c 65 44  t_ad(AppendableD
1540: 61 74 61 3a 3a 50 72 69 76 28 64 61 74 61 29 29  ata::Priv(data))
1550: 3b 0a 0a 20 20 20 20 20 20 20 20 70 74 72 3a 3a  ;..        ptr::
1560: 77 72 69 74 65 28 6f 5f 68 61 6e 64 6c 65 2c 20  write(o_handle, 
1570: 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20 20 20 20  handle);.       
1580: 20 30 0a 20 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f   0.    }).}..///
1590: 20 47 65 74 20 65 78 69 73 74 69 6e 67 20 61 70   Get existing ap
15a0: 70 65 6e 64 61 62 6c 65 20 64 61 74 61 20 66 72  pendable data fr
15b0: 6f 6d 20 4e 65 74 77 6f 72 6b 2e 0a 23 5b 6e 6f  om Network..#[no
15c0: 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20 75 6e 73  _mangle].pub uns
15d0: 61 66 65 20 65 78 74 65 72 6e 20 22 43 22 20 66  afe extern "C" f
15e0: 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  n appendable_dat
15f0: 61 5f 67 65 74 28 61 70 70 3a 20 2a 63 6f 6e 73  a_get(app: *cons
1600: 74 20 41 70 70 2c 0a 20 20 20 20 20 20 20 20 20  t App,.         
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 64 61 74 61 5f 69 64 5f 68 3a 20 44      data_id_h: D
1640: 61 74 61 49 64 48 61 6e 64 6c 65 2c 0a 20 20 20  ataIdHandle,.   
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 20 20 20 20 6f 5f 68 61 6e 64            o_hand
1680: 6c 65 3a 20 2a 6d 75 74 20 41 70 70 65 6e 64 61  le: *mut Appenda
1690: 62 6c 65 44 61 74 61 48 61 6e 64 6c 65 29 0a 20  bleDataHandle). 
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20 69              -> i
16d0: 33 32 20 7b 0a 20 20 20 20 68 65 6c 70 65 72 3a  32 {.    helper:
16e0: 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69 33  :catch_unwind_i3
16f0: 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 6c  2(|| {.        l
1700: 65 74 20 64 61 74 61 5f 69 64 20 3d 20 2a 66 66  et data_id = *ff
1710: 69 5f 74 72 79 21 28 75 6e 77 72 61 70 21 28 6f  i_try!(unwrap!(o
1720: 62 6a 65 63 74 5f 63 61 63 68 65 28 29 29 2e 67  bject_cache()).g
1730: 65 74 5f 64 61 74 61 5f 69 64 28 64 61 74 61 5f  et_data_id(data_
1740: 69 64 5f 68 29 29 3b 0a 0a 20 20 20 20 20 20 20  id_h));..       
1750: 20 6c 65 74 20 63 6c 69 65 6e 74 20 3d 20 28 2a   let client = (*
1760: 61 70 70 29 2e 67 65 74 5f 63 6c 69 65 6e 74 28  app).get_client(
1770: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 72  );.        let r
1780: 65 73 70 5f 67 65 74 74 65 72 20 3d 20 66 66 69  esp_getter = ffi
1790: 5f 74 72 79 21 28 75 6e 77 72 61 70 21 28 63 6c  _try!(unwrap!(cl
17a0: 69 65 6e 74 2e 6c 6f 63 6b 28 29 29 2e 67 65 74  ient.lock()).get
17b0: 28 64 61 74 61 5f 69 64 2c 20 4e 6f 6e 65 29 29  (data_id, None))
17c0: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 64 61  ;.        let da
17d0: 74 61 20 3d 20 6d 61 74 63 68 20 66 66 69 5f 74  ta = match ffi_t
17e0: 72 79 21 28 72 65 73 70 5f 67 65 74 74 65 72 2e  ry!(resp_getter.
17f0: 67 65 74 28 29 29 20 7b 0a 20 20 20 20 20 20 20  get()) {.       
1800: 20 20 20 20 20 44 61 74 61 3a 3a 50 75 62 41 70       Data::PubAp
1810: 70 65 6e 64 61 62 6c 65 28 64 61 74 61 29 20 3d  pendable(data) =
1820: 3e 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61  > AppendableData
1830: 3a 3a 50 75 62 28 64 61 74 61 29 2c 0a 20 20 20  ::Pub(data),.   
1840: 20 20 20 20 20 20 20 20 20 44 61 74 61 3a 3a 50           Data::P
1850: 72 69 76 41 70 70 65 6e 64 61 62 6c 65 28 64 61  rivAppendable(da
1860: 74 61 29 20 3d 3e 20 41 70 70 65 6e 64 61 62 6c  ta) => Appendabl
1870: 65 44 61 74 61 3a 3a 50 72 69 76 28 64 61 74 61  eData::Priv(data
1880: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f  ),.            _
1890: 20 3d 3e 20 66 66 69 5f 74 72 79 21 28 45 72 72   => ffi_try!(Err
18a0: 28 43 6f 72 65 45 72 72 6f 72 3a 3a 52 65 63 65  (CoreError::Rece
18b0: 69 76 65 64 55 6e 65 78 70 65 63 74 65 64 44 61  ivedUnexpectedDa
18c0: 74 61 29 29 2c 0a 20 20 20 20 20 20 20 20 7d 3b  ta)),.        };
18d0: 0a 0a 20 20 20 20 20 20 20 20 6c 65 74 20 68 61  ..        let ha
18e0: 6e 64 6c 65 20 3d 20 75 6e 77 72 61 70 21 28 6f  ndle = unwrap!(o
18f0: 62 6a 65 63 74 5f 63 61 63 68 65 28 29 29 2e 69  bject_cache()).i
1900: 6e 73 65 72 74 5f 61 64 28 64 61 74 61 29 3b 0a  nsert_ad(data);.
1910: 0a 20 20 20 20 20 20 20 20 70 74 72 3a 3a 77 72  .        ptr::wr
1920: 69 74 65 28 6f 5f 68 61 6e 64 6c 65 2c 20 68 61  ite(o_handle, ha
1930: 6e 64 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 30  ndle);.        0
1940: 0a 20 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20 45  .    }).}../// E
1950: 78 74 72 61 63 74 20 60 44 61 74 61 49 64 65 6e  xtract `DataIden
1960: 74 69 66 69 65 72 60 20 66 72 6f 6d 20 60 41 70  tifier` from `Ap
1970: 70 65 6e 64 61 62 6c 65 44 61 74 61 60 2e 0a 23  pendableData`..#
1980: 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20  [no_mangle].pub 
1990: 75 6e 73 61 66 65 20 65 78 74 65 72 6e 20 22 43  unsafe extern "C
19a0: 22 20 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f  " fn appendable_
19b0: 64 61 74 61 5f 65 78 74 72 61 63 74 5f 64 61 74  data_extract_dat
19c0: 61 5f 69 64 28 61 64 5f 68 3a 20 41 70 70 65 6e  a_id(ad_h: Appen
19d0: 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65 2c  dableDataHandle,
19e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 20 20 6f 5f 68 61 6e 64            o_hand
1a20: 6c 65 3a 20 2a 6d 75 74 20 44 61 74 61 49 64 48  le: *mut DataIdH
1a30: 61 6e 64 6c 65 29 0a 20 20 20 20 20 20 20 20 20  andle).         
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 2d 3e 20 69 33 32 20 7b 0a 20 20 20 20 68 65 6c  -> i32 {.    hel
1a80: 70 65 72 3a 3a 63 61 74 63 68 5f 75 6e 77 69 6e  per::catch_unwin
1a90: 64 5f 69 33 32 28 7c 7c 20 7b 0a 20 20 20 20 20  d_i32(|| {.     
1aa0: 20 20 20 6c 65 74 20 6d 75 74 20 6f 62 6a 65 63     let mut objec
1ab0: 74 5f 63 61 63 68 65 20 3d 20 75 6e 77 72 61 70  t_cache = unwrap
1ac0: 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 28 29  !(object_cache()
1ad0: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 64  );.        let d
1ae0: 61 74 61 5f 69 64 20 3d 20 6d 61 74 63 68 20 2a  ata_id = match *
1af0: 66 66 69 5f 74 72 79 21 28 6f 62 6a 65 63 74 5f  ffi_try!(object_
1b00: 63 61 63 68 65 2e 67 65 74 5f 61 64 28 61 64 5f  cache.get_ad(ad_
1b10: 68 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  h)) {.          
1b20: 20 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61    AppendableData
1b30: 3a 3a 50 75 62 28 72 65 66 20 65 6c 74 29 20 3d  ::Pub(ref elt) =
1b40: 3e 20 65 6c 74 2e 69 64 65 6e 74 69 66 69 65 72  > elt.identifier
1b50: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1b60: 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a  AppendableData::
1b70: 50 72 69 76 28 72 65 66 20 65 6c 74 29 20 3d 3e  Priv(ref elt) =>
1b80: 20 65 6c 74 2e 69 64 65 6e 74 69 66 69 65 72 28   elt.identifier(
1b90: 29 2c 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  ),.        };.  
1ba0: 20 20 20 20 20 20 6c 65 74 20 68 61 6e 64 6c 65        let handle
1bb0: 20 3d 20 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e   = object_cache.
1bc0: 69 6e 73 65 72 74 5f 64 61 74 61 5f 69 64 28 64  insert_data_id(d
1bd0: 61 74 61 5f 69 64 29 3b 0a 0a 20 20 20 20 20 20  ata_id);..      
1be0: 20 20 70 74 72 3a 3a 77 72 69 74 65 28 6f 5f 68    ptr::write(o_h
1bf0: 61 6e 64 6c 65 2c 20 68 61 6e 64 6c 65 29 3b 0a  andle, handle);.
1c00: 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 7d 29          0.    })
1c10: 0a 7d 0a 0a 2f 2f 2f 20 50 55 54 20 61 70 70 65  .}../// PUT appe
1c20: 6e 64 61 62 6c 65 20 64 61 74 61 2e 0a 23 5b 6e  ndable data..#[n
1c30: 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20 75 6e  o_mangle].pub un
1c40: 73 61 66 65 20 65 78 74 65 72 6e 20 22 43 22 20  safe extern "C" 
1c50: 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  fn appendable_da
1c60: 74 61 5f 70 75 74 28 61 70 70 3a 20 2a 63 6f 6e  ta_put(app: *con
1c70: 73 74 20 41 70 70 2c 20 61 64 5f 68 3a 20 41 70  st App, ad_h: Ap
1c80: 70 65 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64  pendableDataHand
1c90: 6c 65 29 20 2d 3e 20 69 33 32 20 7b 0a 20 20 20  le) -> i32 {.   
1ca0: 20 68 65 6c 70 65 72 3a 3a 63 61 74 63 68 5f 75   helper::catch_u
1cb0: 6e 77 69 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a 20  nwind_i32(|| {. 
1cc0: 20 20 20 20 20 20 20 6c 65 74 20 64 61 74 61 20         let data 
1cd0: 3d 20 66 66 69 5f 74 72 79 21 28 75 6e 77 72 61  = ffi_try!(unwra
1ce0: 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 28  p!(object_cache(
1cf0: 29 29 2e 67 65 74 5f 61 64 28 61 64 5f 68 29 29  )).get_ad(ad_h))
1d00: 2e 63 6c 6f 6e 65 28 29 3b 0a 0a 20 20 20 20 20  .clone();..     
1d10: 20 20 20 6c 65 74 20 63 6c 69 65 6e 74 20 3d 20     let client = 
1d20: 28 2a 61 70 70 29 2e 67 65 74 5f 63 6c 69 65 6e  (*app).get_clien
1d30: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  t();.        let
1d40: 20 72 65 73 70 5f 67 65 74 74 65 72 20 3d 20 66   resp_getter = f
1d50: 66 69 5f 74 72 79 21 28 75 6e 77 72 61 70 21 28  fi_try!(unwrap!(
1d60: 63 6c 69 65 6e 74 2e 6c 6f 63 6b 28 29 29 2e 70  client.lock()).p
1d70: 75 74 28 64 61 74 61 2e 69 6e 74 6f 28 29 2c 20  ut(data.into(), 
1d80: 4e 6f 6e 65 29 29 3b 0a 20 20 20 20 20 20 20 20  None));.        
1d90: 66 66 69 5f 74 72 79 21 28 72 65 73 70 5f 67 65  ffi_try!(resp_ge
1da0: 74 74 65 72 2e 67 65 74 28 29 29 3b 0a 0a 20 20  tter.get());..  
1db0: 20 20 20 20 20 20 30 0a 20 20 20 20 7d 29 0a 7d        0.    }).}
1dc0: 0a 0a 2f 2f 2f 20 50 4f 53 54 20 61 70 70 65 6e  ../// POST appen
1dd0: 64 61 62 6c 65 20 64 61 74 61 20 28 62 75 6d 70  dable data (bump
1de0: 73 20 74 68 65 20 76 65 72 73 69 6f 6e 29 2e 0a  s the version)..
1df0: 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62  #[no_mangle].pub
1e00: 20 75 6e 73 61 66 65 20 65 78 74 65 72 6e 20 22   unsafe extern "
1e10: 43 22 20 66 6e 20 61 70 70 65 6e 64 61 62 6c 65  C" fn appendable
1e20: 5f 64 61 74 61 5f 70 6f 73 74 28 61 70 70 3a 20  _data_post(app: 
1e30: 2a 63 6f 6e 73 74 20 41 70 70 2c 0a 20 20 20 20  *const App,.    
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 20 20 20 20 20 20 20 20 61 64 5f 68 3a 20            ad_h: 
1e70: 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 48 61  AppendableDataHa
1e80: 6e 64 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ndle,.          
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 69 6e 63 6c 75 64 65 5f 64 61 74 61      include_data
1ec0: 3a 20 62 6f 6f 6c 29 0a 20 20 20 20 20 20 20 20  : bool).        
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 20 20 20 20 20 2d 3e 20 69 33 32 20 7b 0a 20        -> i32 {. 
1f00: 20 20 20 68 65 6c 70 65 72 3a 3a 63 61 74 63 68     helper::catch
1f10: 5f 75 6e 77 69 6e 64 5f 69 33 32 28 7c 7c 20 7b  _unwind_i32(|| {
1f20: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 63 6c 69  .        let cli
1f30: 65 6e 74 20 3d 20 28 2a 61 70 70 29 2e 67 65 74  ent = (*app).get
1f40: 5f 63 6c 69 65 6e 74 28 29 3b 0a 0a 20 20 20 20  _client();..    
1f50: 20 20 20 20 6c 65 74 20 6e 65 77 5f 61 64 20 3d      let new_ad =
1f60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
1f70: 65 74 20 6d 75 74 20 6f 62 6a 65 63 74 5f 63 61  et mut object_ca
1f80: 63 68 65 20 3d 20 75 6e 77 72 61 70 21 28 6f 62  che = unwrap!(ob
1f90: 6a 65 63 74 5f 63 61 63 68 65 28 29 29 3b 0a 20  ject_cache());. 
1fa0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 61             let a
1fb0: 64 20 3d 20 66 66 69 5f 74 72 79 21 28 6f 62 6a  d = ffi_try!(obj
1fc0: 65 63 74 5f 63 61 63 68 65 2e 67 65 74 5f 61 64  ect_cache.get_ad
1fd0: 28 61 64 5f 68 29 29 3b 0a 0a 20 20 20 20 20 20  (ad_h));..      
1fe0: 20 20 20 20 20 20 6d 61 74 63 68 20 2a 61 64 20        match *ad 
1ff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2000: 20 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61    AppendableData
2010: 3a 3a 50 75 62 28 72 65 66 20 6f 6c 64 5f 64 61  ::Pub(ref old_da
2020: 74 61 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20  ta) => {.       
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
2040: 20 6d 75 74 20 6e 65 77 5f 64 61 74 61 20 3d 0a   mut new_data =.
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 20 20 20 20 20 66 66 69 5f 74 72 79 21          ffi_try!
2070: 28 50 75 62 41 70 70 65 6e 64 61 62 6c 65 44 61  (PubAppendableDa
2080: 74 61 3a 3a 6e 65 77 28 6f 6c 64 5f 64 61 74 61  ta::new(old_data
2090: 2e 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  .name,.         
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
20d0: 6c 64 5f 64 61 74 61 2e 76 65 72 73 69 6f 6e 20  ld_data.version 
20e0: 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  + 1,.           
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64               old
2120: 5f 64 61 74 61 2e 6f 77 6e 65 72 73 2e 63 6c 6f  _data.owners.clo
2130: 6e 65 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ne(),.          
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
2170: 64 5f 64 61 74 61 2e 64 65 6c 65 74 65 64 5f 64  d_data.deleted_d
2180: 61 74 61 2e 63 6c 6f 6e 65 28 29 2c 0a 20 20 20  ata.clone(),.   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 6f 6c 64 5f 64 61 74 61 2e 66 69       old_data.fi
21d0: 6c 74 65 72 2e 63 6c 6f 6e 65 28 29 29 0a 20 20  lter.clone()).  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 20 20 2e 6d 61 70 5f 65 72 72 28         .map_err(
2210: 43 6f 72 65 45 72 72 6f 72 3a 3a 66 72 6f 6d 29  CoreError::from)
2220: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2230: 20 20 20 20 20 20 20 69 66 20 69 6e 63 6c 75 64         if includ
2240: 65 5f 64 61 74 61 20 7b 0a 20 20 20 20 20 20 20  e_data {.       
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 6e 65 77 5f 64 61 74 61 2e 64 61 74 61 20 3d   new_data.data =
2270: 20 6f 6c 64 5f 64 61 74 61 2e 64 61 74 61 2e 63   old_data.data.c
2280: 6c 6f 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20  lone();.        
2290: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 6c 65 74 20 6f 77 6e 65 72 5f 6b 65 79 20    let owner_key 
22c0: 3d 20 2a 66 66 69 5f 74 72 79 21 28 75 6e 77 72  = *ffi_try!(unwr
22d0: 61 70 21 28 63 6c 69 65 6e 74 2e 6c 6f 63 6b 28  ap!(client.lock(
22e0: 29 29 2e 67 65 74 5f 70 75 62 6c 69 63 5f 73 69  )).get_public_si
22f0: 67 6e 69 6e 67 5f 6b 65 79 28 29 29 3b 0a 20 20  gning_key());.  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 6c 65 74 20 70 72 69 76 61 74 65 5f 73 69    let private_si
2320: 67 6e 69 6e 67 5f 6b 65 79 20 3d 0a 20 20 20 20  gning_key =.    
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 20 66 66 69 5f 74 72 79 21 28 75 6e 77      ffi_try!(unw
2350: 72 61 70 21 28 63 6c 69 65 6e 74 2e 6c 6f 63 6b  rap!(client.lock
2360: 28 29 29 2e 67 65 74 5f 73 65 63 72 65 74 5f 73  ()).get_secret_s
2370: 69 67 6e 69 6e 67 5f 6b 65 79 28 29 29 2e 63 6c  igning_key()).cl
2380: 6f 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  one();.         
2390: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 5f             let _
23a0: 20 3d 20 66 66 69 5f 74 72 79 21 28 6e 65 77 5f   = ffi_try!(new_
23b0: 64 61 74 61 0a 20 20 20 20 20 20 20 20 20 20 20  data.           
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 61                .a
23e0: 64 64 5f 73 69 67 6e 61 74 75 72 65 28 26 28 6f  dd_signature(&(o
23f0: 77 6e 65 72 5f 6b 65 79 2c 20 70 72 69 76 61 74  wner_key, privat
2400: 65 5f 73 69 67 6e 69 6e 67 5f 6b 65 79 29 29 0a  e_signing_key)).
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 2e 6d 61 70 5f 65 72           .map_er
2440: 72 28 43 6f 72 65 45 72 72 6f 72 3a 3a 66 72 6f  r(CoreError::fro
2450: 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m));.           
2460: 20 20 20 20 20 20 20 20 20 41 70 70 65 6e 64 61           Appenda
2470: 62 6c 65 44 61 74 61 3a 3a 50 75 62 28 6e 65 77  bleData::Pub(new
2480: 5f 64 61 74 61 29 0a 20 20 20 20 20 20 20 20 20  _data).         
2490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24a0: 20 20 20 20 20 20 20 20 20 41 70 70 65 6e 64 61           Appenda
24b0: 62 6c 65 44 61 74 61 3a 3a 50 72 69 76 28 72 65  bleData::Priv(re
24c0: 66 20 6f 6c 64 5f 64 61 74 61 29 20 3d 3e 20 7b  f old_data) => {
24d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24e0: 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6e 65 77       let mut new
24f0: 5f 64 61 74 61 20 3d 0a 20 20 20 20 20 20 20 20  _data =.        
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 66 66 69 5f 74 72 79 21 28 50 72 69 76 41 70 70  ffi_try!(PrivApp
2520: 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 6e 65 77  endableData::new
2530: 28 6f 6c 64 5f 64 61 74 61 2e 6e 61 6d 65 2c 0a  (old_data.name,.
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 20 6f 6c 64 5f 64 61 74           old_dat
2580: 61 2e 76 65 72 73 69 6f 6e 20 2b 20 31 2c 0a 20  a.version + 1,. 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 6f 6c 64 5f 64 61 74 61          old_data
25d0: 2e 6f 77 6e 65 72 73 2e 63 6c 6f 6e 65 28 29 2c  .owners.clone(),
25e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 20 20 20 20 20 20 20 20 20 6f 6c 64 5f 64 61            old_da
2620: 74 61 2e 64 65 6c 65 74 65 64 5f 64 61 74 61 2e  ta.deleted_data.
2630: 63 6c 6f 6e 65 28 29 2c 0a 20 20 20 20 20 20 20  clone(),.       
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 6f 6c 64 5f 64 61 74 61 2e 66 69 6c 74 65    old_data.filte
2680: 72 2e 63 6c 6f 6e 65 28 29 2c 0a 20 20 20 20 20  r.clone(),.     
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 6f 6c 64 5f 64 61 74 61 2e 65 6e 63      old_data.enc
26d0: 72 79 70 74 5f 6b 65 79 2e 63 6c 6f 6e 65 28 29  rypt_key.clone()
26e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 20 20 20 20 2e 6d 61 70 5f             .map_
2710: 65 72 72 28 43 6f 72 65 45 72 72 6f 72 3a 3a 66  err(CoreError::f
2720: 72 6f 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 20  rom));.         
2730: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69 6e             if in
2740: 63 6c 75 64 65 5f 64 61 74 61 20 7b 0a 20 20 20  clude_data {.   
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 6e 65 77 5f 64 61 74 61 2e 64 61       new_data.da
2770: 74 61 20 3d 20 6f 6c 64 5f 64 61 74 61 2e 64 61  ta = old_data.da
2780: 74 61 2e 63 6c 6f 6e 65 28 29 3b 0a 20 20 20 20  ta.clone();.    
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
27b0: 20 20 20 20 20 20 6c 65 74 20 6f 77 6e 65 72 5f        let owner_
27c0: 6b 65 79 20 3d 20 2a 66 66 69 5f 74 72 79 21 28  key = *ffi_try!(
27d0: 75 6e 77 72 61 70 21 28 63 6c 69 65 6e 74 2e 6c  unwrap!(client.l
27e0: 6f 63 6b 28 29 29 2e 67 65 74 5f 70 75 62 6c 69  ock()).get_publi
27f0: 63 5f 73 69 67 6e 69 6e 67 5f 6b 65 79 28 29 29  c_signing_key())
2800: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2810: 20 20 20 20 20 20 6c 65 74 20 70 72 69 76 61 74        let privat
2820: 65 5f 73 69 67 6e 69 6e 67 5f 6b 65 79 20 3d 0a  e_signing_key =.
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 20 20 66 66 69 5f 74 72 79 21          ffi_try!
2850: 28 75 6e 77 72 61 70 21 28 63 6c 69 65 6e 74 2e  (unwrap!(client.
2860: 6c 6f 63 6b 28 29 29 2e 67 65 74 5f 73 65 63 72  lock()).get_secr
2870: 65 74 5f 73 69 67 6e 69 6e 67 5f 6b 65 79 28 29  et_signing_key()
2880: 29 2e 63 6c 6f 6e 65 28 29 3b 0a 20 20 20 20 20  ).clone();.     
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
28a0: 65 74 20 5f 20 3d 20 66 66 69 5f 74 72 79 21 28  et _ = ffi_try!(
28b0: 6e 65 77 5f 64 61 74 61 0a 20 20 20 20 20 20 20  new_data.       
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 2e 61 64 64 5f 73 69 67 6e 61 74 75 72 65    .add_signature
28f0: 28 26 28 6f 77 6e 65 72 5f 6b 65 79 2c 20 70 72  (&(owner_key, pr
2900: 69 76 61 74 65 5f 73 69 67 6e 69 6e 67 5f 6b 65  ivate_signing_ke
2910: 79 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  y)).            
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 6d 61               .ma
2940: 70 5f 65 72 72 28 43 6f 72 65 45 72 72 6f 72 3a  p_err(CoreError:
2950: 3a 66 72 6f 6d 29 29 3b 0a 20 20 20 20 20 20 20  :from));.       
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
2970: 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 72 69  endableData::Pri
2980: 76 28 6e 65 77 5f 64 61 74 61 29 0a 20 20 20 20  v(new_data).    
2990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29b0: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 6c      };.        l
29c0: 65 74 20 72 65 73 70 5f 67 65 74 74 65 72 20 3d  et resp_getter =
29d0: 20 66 66 69 5f 74 72 79 21 28 75 6e 77 72 61 70   ffi_try!(unwrap
29e0: 21 28 63 6c 69 65 6e 74 2e 6c 6f 63 6b 28 29 29  !(client.lock())
29f0: 2e 70 6f 73 74 28 6e 65 77 5f 61 64 2e 63 6c 6f  .post(new_ad.clo
2a00: 6e 65 28 29 2e 69 6e 74 6f 28 29 2c 20 4e 6f 6e  ne().into(), Non
2a10: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 66 66 69  e));.        ffi
2a20: 5f 74 72 79 21 28 72 65 73 70 5f 67 65 74 74 65  _try!(resp_gette
2a30: 72 2e 67 65 74 28 29 29 3b 0a 20 20 20 20 20 20  r.get());.      
2a40: 20 20 2a 66 66 69 5f 74 72 79 21 28 75 6e 77 72    *ffi_try!(unwr
2a50: 61 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65  ap!(object_cache
2a60: 28 29 29 2e 67 65 74 5f 61 64 28 61 64 5f 68 29  ()).get_ad(ad_h)
2a70: 29 20 3d 20 6e 65 77 5f 61 64 3b 0a 0a 20 20 20  ) = new_ad;..   
2a80: 20 20 20 20 20 30 0a 20 20 20 20 7d 29 0a 7d 0a       0.    }).}.
2a90: 0a 2f 2f 20 54 4f 44 4f 3a 20 44 45 4c 45 54 45  .// TODO: DELETE
2aa0: 20 28 64 69 73 61 62 6c 65 64 20 66 6f 72 20 6e   (disabled for n
2ab0: 6f 77 29 0a 0a 2f 2f 2f 20 47 65 74 20 74 68 65  ow)../// Get the
2ac0: 20 66 69 6c 74 65 72 20 74 79 70 65 0a 23 5b 6e   filter type.#[n
2ad0: 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20 75 6e  o_mangle].pub un
2ae0: 73 61 66 65 20 65 78 74 65 72 6e 20 22 43 22 20  safe extern "C" 
2af0: 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  fn appendable_da
2b00: 74 61 5f 66 69 6c 74 65 72 5f 74 79 70 65 28 61  ta_filter_type(a
2b10: 64 5f 68 3a 20 41 70 70 65 6e 64 61 62 6c 65 44  d_h: AppendableD
2b20: 61 74 61 48 61 6e 64 6c 65 2c 0a 20 20 20 20 20  ataHandle,.     
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 6f 5f 74 79 70 65 3a 20 2a 6d 75 74 20 46 69 6c  o_type: *mut Fil
2b70: 74 65 72 54 79 70 65 29 0a 20 20 20 20 20 20 20  terType).       
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
2bb0: 20 69 33 32 20 7b 0a 20 20 20 20 68 65 6c 70 65   i32 {.    helpe
2bc0: 72 3a 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64 5f  r::catch_unwind_
2bd0: 69 33 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20 20  i32(|| {.       
2be0: 20 6c 65 74 20 6d 75 74 20 6f 62 6a 65 63 74 5f   let mut object_
2bf0: 63 61 63 68 65 20 3d 20 75 6e 77 72 61 70 21 28  cache = unwrap!(
2c00: 6f 62 6a 65 63 74 5f 63 61 63 68 65 28 29 29 3b  object_cache());
2c10: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 64 20  .        let ad 
2c20: 3d 20 66 66 69 5f 74 72 79 21 28 6f 62 6a 65 63  = ffi_try!(objec
2c30: 74 5f 63 61 63 68 65 2e 67 65 74 5f 61 64 28 61  t_cache.get_ad(a
2c40: 64 5f 68 29 29 3b 0a 20 20 20 20 20 20 20 20 6c  d_h));.        l
2c50: 65 74 20 66 69 6c 74 65 72 20 3d 20 61 64 2e 66  et filter = ad.f
2c60: 69 6c 74 65 72 5f 6d 75 74 28 29 3b 0a 20 20 20  ilter_mut();.   
2c70: 20 20 20 20 20 6c 65 74 20 66 69 6c 74 65 72 5f       let filter_
2c80: 74 79 70 65 20 3d 20 6d 61 74 63 68 20 2a 66 69  type = match *fi
2c90: 6c 74 65 72 20 7b 0a 20 20 20 20 20 20 20 20 20  lter {.         
2ca0: 20 20 20 46 69 6c 74 65 72 3a 3a 42 6c 61 63 6b     Filter::Black
2cb0: 4c 69 73 74 28 5f 29 20 3d 3e 20 46 69 6c 74 65  List(_) => Filte
2cc0: 72 54 79 70 65 3a 3a 42 6c 61 63 6b 4c 69 73 74  rType::BlackList
2cd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69  ,.            Fi
2ce0: 6c 74 65 72 3a 3a 57 68 69 74 65 4c 69 73 74 28  lter::WhiteList(
2cf0: 5f 29 20 3d 3e 20 46 69 6c 74 65 72 54 79 70 65  _) => FilterType
2d00: 3a 3a 57 68 69 74 65 4c 69 73 74 2c 0a 20 20 20  ::WhiteList,.   
2d10: 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
2d20: 20 70 74 72 3a 3a 77 72 69 74 65 28 6f 5f 74 79   ptr::write(o_ty
2d30: 70 65 2c 20 66 69 6c 74 65 72 5f 74 79 70 65 29  pe, filter_type)
2d40: 3b 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20 20  ;.        0.    
2d50: 7d 29 0a 7d 0a 0a 2f 2f 2f 20 53 77 69 74 63 68  }).}../// Switch
2d60: 20 74 68 65 20 66 69 6c 74 65 72 20 6f 66 20 74   the filter of t
2d70: 68 65 20 61 70 70 65 6e 64 61 62 6c 65 20 64 61  he appendable da
2d80: 74 61 2e 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d  ta..#[no_mangle]
2d90: 0a 70 75 62 20 65 78 74 65 72 6e 20 22 43 22 20  .pub extern "C" 
2da0: 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  fn appendable_da
2db0: 74 61 5f 74 6f 67 67 6c 65 5f 66 69 6c 74 65 72  ta_toggle_filter
2dc0: 28 61 64 5f 68 3a 20 41 70 70 65 6e 64 61 62 6c  (ad_h: Appendabl
2dd0: 65 44 61 74 61 48 61 6e 64 6c 65 29 20 2d 3e 20  eDataHandle) -> 
2de0: 69 33 32 20 7b 0a 20 20 20 20 68 65 6c 70 65 72  i32 {.    helper
2df0: 3a 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69  ::catch_unwind_i
2e00: 33 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20  32(|| {.        
2e10: 6c 65 74 20 6d 75 74 20 6f 62 6a 65 63 74 5f 63  let mut object_c
2e20: 61 63 68 65 20 3d 20 75 6e 77 72 61 70 21 28 6f  ache = unwrap!(o
2e30: 62 6a 65 63 74 5f 63 61 63 68 65 28 29 29 3b 0a  bject_cache());.
2e40: 20 20 20 20 20 20 20 20 6c 65 74 20 61 64 20 3d          let ad =
2e50: 20 66 66 69 5f 74 72 79 21 28 6f 62 6a 65 63 74   ffi_try!(object
2e60: 5f 63 61 63 68 65 2e 67 65 74 5f 61 64 28 61 64  _cache.get_ad(ad
2e70: 5f 68 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c  _h));..        l
2e80: 65 74 20 66 69 6c 74 65 72 20 3d 20 61 64 2e 66  et filter = ad.f
2e90: 69 6c 74 65 72 5f 6d 75 74 28 29 3b 0a 20 20 20  ilter_mut();.   
2ea0: 20 20 20 20 20 6d 61 74 63 68 20 2a 66 69 6c 74       match *filt
2eb0: 65 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  er {.           
2ec0: 20 46 69 6c 74 65 72 3a 3a 42 6c 61 63 6b 4c 69   Filter::BlackLi
2ed0: 73 74 28 5f 29 20 3d 3e 20 2a 66 69 6c 74 65 72  st(_) => *filter
2ee0: 20 3d 20 46 69 6c 74 65 72 3a 3a 77 68 69 74 65   = Filter::white
2ef0: 5f 6c 69 73 74 28 69 74 65 72 3a 3a 65 6d 70 74  _list(iter::empt
2f00: 79 28 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y()),.          
2f10: 20 20 46 69 6c 74 65 72 3a 3a 57 68 69 74 65 4c    Filter::WhiteL
2f20: 69 73 74 28 5f 29 20 3d 3e 20 2a 66 69 6c 74 65  ist(_) => *filte
2f30: 72 20 3d 20 46 69 6c 74 65 72 3a 3a 62 6c 61 63  r = Filter::blac
2f40: 6b 5f 6c 69 73 74 28 69 74 65 72 3a 3a 65 6d 70  k_list(iter::emp
2f50: 74 79 28 29 29 2c 0a 20 20 20 20 20 20 20 20 7d  ty()),.        }
2f60: 0a 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20 20  ..        0.    
2f70: 7d 29 0a 7d 0a 0a 2f 2f 2f 20 49 6e 73 65 72 74  }).}../// Insert
2f80: 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20   a new entry to 
2f90: 74 68 65 20 28 77 68 69 74 65 6c 69 73 74 20 6f  the (whitelist o
2fa0: 72 20 62 6c 61 63 6b 6c 69 73 74 29 20 66 69 6c  r blacklist) fil
2fb0: 74 65 72 2e 20 49 66 20 74 68 65 20 6b 65 79 20  ter. If the key 
2fc0: 77 61 73 0a 2f 2f 2f 20 61 6c 72 65 61 64 79 20  was./// already 
2fd0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 66  present in the f
2fe0: 69 6c 74 65 72 2c 20 74 68 69 73 20 69 73 20 61  ilter, this is a
2ff0: 20 6e 6f 2d 6f 70 2e 0a 23 5b 6e 6f 5f 6d 61 6e   no-op..#[no_man
3000: 67 6c 65 5d 0a 70 75 62 20 65 78 74 65 72 6e 20  gle].pub extern 
3010: 22 43 22 20 66 6e 20 61 70 70 65 6e 64 61 62 6c  "C" fn appendabl
3020: 65 5f 64 61 74 61 5f 69 6e 73 65 72 74 5f 74 6f  e_data_insert_to
3030: 5f 66 69 6c 74 65 72 28 61 64 5f 68 3a 20 41 70  _filter(ad_h: Ap
3040: 70 65 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64  pendableDataHand
3050: 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 20 20 20 73 69 67 6e 5f 6b 65 79 5f         sign_key_
3090: 68 3a 20 53 69 67 6e 4b 65 79 48 61 6e 64 6c 65  h: SignKeyHandle
30a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 20 20 2d 3e 20 69 33 32 20 7b 0a 20 20       -> i32 {.  
30e0: 20 20 68 65 6c 70 65 72 3a 3a 63 61 74 63 68 5f    helper::catch_
30f0: 75 6e 77 69 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a  unwind_i32(|| {.
3100: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20          let mut 
3110: 6f 62 6a 65 63 74 5f 63 61 63 68 65 20 3d 20 75  object_cache = u
3120: 6e 77 72 61 70 21 28 6f 62 6a 65 63 74 5f 63 61  nwrap!(object_ca
3130: 63 68 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20  che());.        
3140: 6c 65 74 20 73 69 67 6e 5f 6b 65 79 20 3d 20 2a  let sign_key = *
3150: 66 66 69 5f 74 72 79 21 28 6f 62 6a 65 63 74 5f  ffi_try!(object_
3160: 63 61 63 68 65 2e 67 65 74 5f 73 69 67 6e 5f 6b  cache.get_sign_k
3170: 65 79 28 73 69 67 6e 5f 6b 65 79 5f 68 29 29 3b  ey(sign_key_h));
3180: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 64 20  .        let ad 
3190: 3d 20 66 66 69 5f 74 72 79 21 28 6f 62 6a 65 63  = ffi_try!(objec
31a0: 74 5f 63 61 63 68 65 2e 67 65 74 5f 61 64 28 61  t_cache.get_ad(a
31b0: 64 5f 68 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  d_h));..        
31c0: 6c 65 74 20 5f 20 3d 20 6d 61 74 63 68 20 2a 61  let _ = match *a
31d0: 64 2e 66 69 6c 74 65 72 5f 6d 75 74 28 29 20 7b  d.filter_mut() {
31e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69 6c  .            Fil
31f0: 74 65 72 3a 3a 57 68 69 74 65 4c 69 73 74 28 72  ter::WhiteList(r
3200: 65 66 20 6d 75 74 20 6c 69 73 74 29 20 7c 0a 20  ef mut list) |. 
3210: 20 20 20 20 20 20 20 20 20 20 20 46 69 6c 74 65             Filte
3220: 72 3a 3a 42 6c 61 63 6b 4c 69 73 74 28 72 65 66  r::BlackList(ref
3230: 20 6d 75 74 20 6c 69 73 74 29 20 3d 3e 20 6c 69   mut list) => li
3240: 73 74 2e 69 6e 73 65 72 74 28 73 69 67 6e 5f 6b  st.insert(sign_k
3250: 65 79 29 2c 0a 20 20 20 20 20 20 20 20 7d 3b 0a  ey),.        };.
3260: 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 7d  .        0.    }
3270: 29 0a 7d 0a 0a 2f 2f 2f 20 52 65 6d 6f 76 65 20  ).}../// Remove 
3280: 74 68 65 20 67 69 76 65 6e 20 6b 65 79 20 66 72  the given key fr
3290: 6f 6d 20 74 68 65 20 28 77 68 69 74 65 6c 69 73  om the (whitelis
32a0: 74 20 6f 72 20 62 6c 61 63 6b 6c 69 73 74 29 20  t or blacklist) 
32b0: 66 69 6c 74 65 72 2e 20 49 66 20 74 68 65 20 6b  filter. If the k
32c0: 65 79 0a 2f 2f 2f 20 69 73 6e 27 74 20 70 72 65  ey./// isn't pre
32d0: 73 65 6e 74 20 69 6e 20 74 68 65 20 66 69 6c 74  sent in the filt
32e0: 65 72 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  er, this is a no
32f0: 2d 6f 70 2e 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65  -op..#[no_mangle
3300: 5d 0a 70 75 62 20 65 78 74 65 72 6e 20 22 43 22  ].pub extern "C"
3310: 20 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64   fn appendable_d
3320: 61 74 61 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  ata_remove_from_
3330: 66 69 6c 74 65 72 28 61 64 5f 68 3a 20 41 70 70  filter(ad_h: App
3340: 65 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c  endableDataHandl
3350: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 20 20 20 20 20 20 73 69 67 6e 5f 6b 65 79          sign_key
3390: 5f 68 3a 20 53 69 67 6e 4b 65 79 48 61 6e 64 6c  _h: SignKeyHandl
33a0: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e).             
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 20 20 20 20 20 20 20 20 2d 3e 20 69 33 32 20 7b          -> i32 {
33e0: 0a 20 20 20 20 68 65 6c 70 65 72 3a 3a 63 61 74  .    helper::cat
33f0: 63 68 5f 75 6e 77 69 6e 64 5f 69 33 32 28 7c 7c  ch_unwind_i32(||
3400: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d   {.        let m
3410: 75 74 20 6f 62 6a 65 63 74 5f 63 61 63 68 65 20  ut object_cache 
3420: 3d 20 75 6e 77 72 61 70 21 28 6f 62 6a 65 63 74  = unwrap!(object
3430: 5f 63 61 63 68 65 28 29 29 3b 0a 20 20 20 20 20  _cache());.     
3440: 20 20 20 6c 65 74 20 73 69 67 6e 5f 6b 65 79 20     let sign_key 
3450: 3d 20 2a 66 66 69 5f 74 72 79 21 28 6f 62 6a 65  = *ffi_try!(obje
3460: 63 74 5f 63 61 63 68 65 2e 67 65 74 5f 73 69 67  ct_cache.get_sig
3470: 6e 5f 6b 65 79 28 73 69 67 6e 5f 6b 65 79 5f 68  n_key(sign_key_h
3480: 29 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ));.        let 
3490: 61 64 20 3d 20 66 66 69 5f 74 72 79 21 28 6f 62  ad = ffi_try!(ob
34a0: 6a 65 63 74 5f 63 61 63 68 65 2e 67 65 74 5f 61  ject_cache.get_a
34b0: 64 28 61 64 5f 68 29 29 3b 0a 0a 20 20 20 20 20  d(ad_h));..     
34c0: 20 20 20 6c 65 74 20 5f 20 3d 20 6d 61 74 63 68     let _ = match
34d0: 20 2a 61 64 2e 66 69 6c 74 65 72 5f 6d 75 74 28   *ad.filter_mut(
34e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
34f0: 46 69 6c 74 65 72 3a 3a 57 68 69 74 65 4c 69 73  Filter::WhiteLis
3500: 74 28 72 65 66 20 6d 75 74 20 6c 69 73 74 29 20  t(ref mut list) 
3510: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69  |.            Fi
3520: 6c 74 65 72 3a 3a 42 6c 61 63 6b 4c 69 73 74 28  lter::BlackList(
3530: 72 65 66 20 6d 75 74 20 6c 69 73 74 29 20 3d 3e  ref mut list) =>
3540: 20 6c 69 73 74 2e 72 65 6d 6f 76 65 28 26 73 69   list.remove(&si
3550: 67 6e 5f 6b 65 79 29 2c 0a 20 20 20 20 20 20 20  gn_key),.       
3560: 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 30 0a 20   };..        0. 
3570: 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20 47 65 74     }).}../// Get
3580: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
3590: 69 6c 74 65 72 65 64 20 6b 65 79 73 2e 0a 23 5b  iltered keys..#[
35a0: 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20 75  no_mangle].pub u
35b0: 6e 73 61 66 65 20 65 78 74 65 72 6e 20 22 43 22  nsafe extern "C"
35c0: 20 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64   fn appendable_d
35d0: 61 74 61 5f 6e 75 6d 5f 6f 66 5f 66 69 6c 74 65  ata_num_of_filte
35e0: 72 5f 6b 65 79 73 28 61 64 5f 68 3a 20 41 70 70  r_keys(ad_h: App
35f0: 65 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c  endableDataHandl
3600: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
3640: 5f 6e 75 6d 3a 20 2a 6d 75 74 20 75 73 69 7a 65  _num: *mut usize
3650: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
3690: 20 69 33 32 20 7b 0a 20 20 20 20 68 65 6c 70 65   i32 {.    helpe
36a0: 72 3a 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64 5f  r::catch_unwind_
36b0: 69 33 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20 20  i32(|| {.       
36c0: 20 6c 65 74 20 6d 75 74 20 6f 62 6a 65 63 74 5f   let mut object_
36d0: 63 61 63 68 65 20 3d 20 75 6e 77 72 61 70 21 28  cache = unwrap!(
36e0: 6f 62 6a 65 63 74 5f 63 61 63 68 65 28 29 29 3b  object_cache());
36f0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 64 20  .        let ad 
3700: 3d 20 66 66 69 5f 74 72 79 21 28 6f 62 6a 65 63  = ffi_try!(objec
3710: 74 5f 63 61 63 68 65 2e 67 65 74 5f 61 64 28 61  t_cache.get_ad(a
3720: 64 5f 68 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  d_h));..        
3730: 6c 65 74 20 6e 75 6d 20 3d 20 6d 61 74 63 68 20  let num = match 
3740: 2a 61 64 2e 66 69 6c 74 65 72 5f 6d 75 74 28 29  *ad.filter_mut()
3750: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 46   {.            F
3760: 69 6c 74 65 72 3a 3a 57 68 69 74 65 4c 69 73 74  ilter::WhiteList
3770: 28 72 65 66 20 6d 75 74 20 6c 69 73 74 29 20 7c  (ref mut list) |
3780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69 6c  .            Fil
3790: 74 65 72 3a 3a 42 6c 61 63 6b 4c 69 73 74 28 72  ter::BlackList(r
37a0: 65 66 20 6d 75 74 20 6c 69 73 74 29 20 3d 3e 20  ef mut list) => 
37b0: 6c 69 73 74 2e 6c 65 6e 28 29 2c 0a 20 20 20 20  list.len(),.    
37c0: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
37d0: 2a 6f 5f 6e 75 6d 20 3d 20 6e 75 6d 3b 0a 20 20  *o_num = num;.  
37e0: 20 20 20 20 20 20 30 0a 20 20 20 20 7d 29 0a 7d        0.    }).}
37f0: 0a 0a 2f 2f 2f 20 47 65 74 20 74 68 65 20 6e 74  ../// Get the nt
3800: 68 20 66 69 6c 74 65 72 20 6b 65 79 2e 0a 23 5b  h filter key..#[
3810: 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20 75  no_mangle].pub u
3820: 6e 73 61 66 65 20 65 78 74 65 72 6e 20 22 43 22  nsafe extern "C"
3830: 20 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64   fn appendable_d
3840: 61 74 61 5f 6e 74 68 5f 66 69 6c 74 65 72 5f 6b  ata_nth_filter_k
3850: 65 79 28 61 64 5f 68 3a 20 41 70 70 65 6e 64 61  ey(ad_h: Appenda
3860: 62 6c 65 44 61 74 61 48 61 6e 64 6c 65 2c 0a 20  bleDataHandle,. 
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 20 20 20 6e 3a 20 75 73 69 7a 65 2c         n: usize,
38b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 20 20 20 20 20 20 6f 5f 68 61 6e 64 6c           o_handl
38f0: 65 3a 20 2a 6d 75 74 20 53 69 67 6e 4b 65 79 48  e: *mut SignKeyH
3900: 61 6e 64 6c 65 29 0a 20 20 20 20 20 20 20 20 20  andle).         
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
3940: 3e 20 69 33 32 20 7b 0a 20 20 20 20 68 65 6c 70  > i32 {.    help
3950: 65 72 3a 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64  er::catch_unwind
3960: 5f 69 33 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20  _i32(|| {.      
3970: 20 20 6c 65 74 20 66 69 6c 74 65 72 5f 6b 65 79    let filter_key
3980: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
3990: 20 6c 65 74 20 6d 75 74 20 6f 62 6a 65 63 74 5f   let mut object_
39a0: 63 61 63 68 65 20 3d 20 75 6e 77 72 61 70 21 28  cache = unwrap!(
39b0: 6f 62 6a 65 63 74 5f 63 61 63 68 65 28 29 29 3b  object_cache());
39c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
39d0: 20 61 64 20 3d 20 66 66 69 5f 74 72 79 21 28 6f   ad = ffi_try!(o
39e0: 62 6a 65 63 74 5f 63 61 63 68 65 2e 67 65 74 5f  bject_cache.get_
39f0: 61 64 28 61 64 5f 68 29 29 3b 0a 0a 20 20 20 20  ad(ad_h));..    
3a00: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a 61          match *a
3a10: 64 2e 66 69 6c 74 65 72 5f 6d 75 74 28 29 20 7b  d.filter_mut() {
3a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a30: 20 46 69 6c 74 65 72 3a 3a 57 68 69 74 65 4c 69   Filter::WhiteLi
3a40: 73 74 28 72 65 66 20 6d 75 74 20 6c 69 73 74 29  st(ref mut list)
3a50: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
3a60: 20 20 20 46 69 6c 74 65 72 3a 3a 42 6c 61 63 6b     Filter::Black
3a70: 4c 69 73 74 28 72 65 66 20 6d 75 74 20 6c 69 73  List(ref mut lis
3a80: 74 29 20 3d 3e 20 2a 66 66 69 5f 74 72 79 21 28  t) => *ffi_try!(
3a90: 6e 74 68 28 6c 69 73 74 2c 20 6e 29 29 2c 0a 20  nth(list, n)),. 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3ab0: 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
3ac0: 20 2a 6f 5f 68 61 6e 64 6c 65 20 3d 20 75 6e 77   *o_handle = unw
3ad0: 72 61 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68  rap!(object_cach
3ae0: 65 28 29 29 2e 69 6e 73 65 72 74 5f 73 69 67 6e  e()).insert_sign
3af0: 5f 6b 65 79 28 66 69 6c 74 65 72 5f 6b 65 79 29  _key(filter_key)
3b00: 3b 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20 20  ;.        0.    
3b10: 7d 29 0a 7d 0a 0a 2f 2f 2f 20 47 65 74 20 74 68  }).}../// Get th
3b20: 65 20 6f 77 6e 65 72 27 73 20 65 6e 63 72 79 70  e owner's encryp
3b30: 74 20 6b 65 79 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c  t key.#[no_mangl
3b40: 65 5d 0a 70 75 62 20 75 6e 73 61 66 65 20 65 78  e].pub unsafe ex
3b50: 74 65 72 6e 20 22 43 22 20 66 6e 20 61 70 70 65  tern "C" fn appe
3b60: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 65 6e 63 72  ndable_data_encr
3b70: 79 70 74 5f 6b 65 79 28 61 64 5f 68 3a 20 41 70  ypt_key(ad_h: Ap
3b80: 70 65 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64  pendableDataHand
3b90: 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 20 20 20 20 20 20 20 20 6f 5f 68 61 6e 64 6c           o_handl
3bd0: 65 3a 20 2a 6d 75 74 20 45 6e 63 72 79 70 74 4b  e: *mut EncryptK
3be0: 65 79 48 61 6e 64 6c 65 29 0a 20 20 20 20 20 20  eyHandle).      
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
3c20: 3e 20 69 33 32 20 7b 0a 20 20 20 20 68 65 6c 70  > i32 {.    help
3c30: 65 72 3a 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64  er::catch_unwind
3c40: 5f 69 33 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20  _i32(|| {.      
3c50: 20 20 6c 65 74 20 6d 75 74 20 6f 62 6a 65 63 74    let mut object
3c60: 5f 63 61 63 68 65 20 3d 20 75 6e 77 72 61 70 21  _cache = unwrap!
3c70: 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 28 29 29  (object_cache())
3c80: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 70 6b  ;.        let pk
3c90: 20 3d 20 6d 61 74 63 68 20 2a 66 66 69 5f 74 72   = match *ffi_tr
3ca0: 79 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e  y!(object_cache.
3cb0: 67 65 74 5f 61 64 28 61 64 5f 68 29 29 20 7b 0a  get_ad(ad_h)) {.
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70 65              Appe
3cd0: 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 72 69 76  ndableData::Priv
3ce0: 28 72 65 66 20 65 6c 74 29 20 3d 3e 20 65 6c 74  (ref elt) => elt
3cf0: 2e 65 6e 63 72 79 70 74 5f 6b 65 79 2c 0a 20 20  .encrypt_key,.  
3d00: 20 20 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 66            _ => f
3d10: 66 69 5f 74 72 79 21 28 45 72 72 28 46 66 69 45  fi_try!(Err(FfiE
3d20: 72 72 6f 72 3a 3a 55 6e 73 75 70 70 6f 72 74 65  rror::Unsupporte
3d30: 64 4f 70 65 72 61 74 69 6f 6e 29 29 2c 0a 20 20  dOperation)),.  
3d40: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20        };.       
3d50: 20 6c 65 74 20 68 61 6e 64 6c 65 20 3d 20 6f 62   let handle = ob
3d60: 6a 65 63 74 5f 63 61 63 68 65 2e 69 6e 73 65 72  ject_cache.inser
3d70: 74 5f 65 6e 63 72 79 70 74 5f 6b 65 79 28 70 6b  t_encrypt_key(pk
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 3a 3a  );.        ptr::
3d90: 77 72 69 74 65 28 6f 5f 68 61 6e 64 6c 65 2c 20  write(o_handle, 
3da0: 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20 20 20 20  handle);.       
3db0: 20 30 0a 20 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f   0.    }).}..///
3dc0: 20 47 65 74 20 6e 75 6d 62 65 72 20 6f 66 20 61   Get number of a
3dd0: 70 70 65 6e 64 65 64 20 64 61 74 61 20 69 74 65  ppended data ite
3de0: 6d 73 2e 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d  ms..#[no_mangle]
3df0: 0a 70 75 62 20 75 6e 73 61 66 65 20 65 78 74 65  .pub unsafe exte
3e00: 72 6e 20 22 43 22 20 66 6e 20 61 70 70 65 6e 64  rn "C" fn append
3e10: 61 62 6c 65 5f 64 61 74 61 5f 6e 75 6d 5f 6f 66  able_data_num_of
3e20: 5f 64 61 74 61 28 61 64 5f 68 3a 20 41 70 70 65  _data(ad_h: Appe
3e30: 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65  ndableDataHandle
3e40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e70: 20 20 20 20 20 20 20 6f 5f 6e 75 6d 3a 20 2a 6d         o_num: *m
3e80: 75 74 20 75 73 69 7a 65 29 0a 20 20 20 20 20 20  ut usize).      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
3ec0: 3e 20 69 33 32 20 7b 0a 20 20 20 20 68 65 6c 70  > i32 {.    help
3ed0: 65 72 3a 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64  er::catch_unwind
3ee0: 5f 69 33 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20  _i32(|| {.      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 20 20 20 20 20 20 66 66 69 5f 74             ffi_t
3f10: 72 79 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  ry!(appendable_d
3f20: 61 74 61 5f 6e 75 6d 5f 6f 66 5f 64 61 74 61 5f  ata_num_of_data_
3f30: 69 6d 70 6c 28 61 64 5f 68 2c 20 66 61 6c 73 65  impl(ad_h, false
3f40: 2c 20 6f 5f 6e 75 6d 29 29 3b 0a 20 20 20 20 20  , o_num));.     
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 20 20              0.  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 20 20 20 20 20 20 20 20 20 7d 29 0a 7d 0a             }).}.
3f90: 0a 2f 2f 2f 20 47 65 74 20 6e 75 6d 62 65 72 20  ./// Get number 
3fa0: 6f 66 20 61 70 70 65 6e 64 65 64 20 64 65 6c 65  of appended dele
3fb0: 74 65 64 20 64 61 74 61 20 69 74 65 6d 73 2e 0a  ted data items..
3fc0: 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62  #[no_mangle].pub
3fd0: 20 75 6e 73 61 66 65 20 65 78 74 65 72 6e 20 22   unsafe extern "
3fe0: 43 22 20 66 6e 20 61 70 70 65 6e 64 61 62 6c 65  C" fn appendable
3ff0: 5f 64 61 74 61 5f 6e 75 6d 5f 6f 66 5f 64 65 6c  _data_num_of_del
4000: 65 74 65 64 5f 64 61 74 61 28 61 64 5f 68 3a 20  eted_data(ad_h: 
4010: 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 48 61  AppendableDataHa
4020: 6e 64 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ndle,.          
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 20 6f 5f 6e 75 6d 3a 20 2a 6d 75 74 20 75     o_num: *mut u
4070: 73 69 7a 65 29 0a 20 20 20 20 20 20 20 20 20 20  size).          
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 20 20 2d 3e 20 69 33 32 20 7b 0a 20 20 20 20     -> i32 {.    
40c0: 68 65 6c 70 65 72 3a 3a 63 61 74 63 68 5f 75 6e  helper::catch_un
40d0: 77 69 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a 20 20  wind_i32(|| {.  
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
4100: 66 69 5f 74 72 79 21 28 61 70 70 65 6e 64 61 62  fi_try!(appendab
4110: 6c 65 5f 64 61 74 61 5f 6e 75 6d 5f 6f 66 5f 64  le_data_num_of_d
4120: 61 74 61 5f 69 6d 70 6c 28 61 64 5f 68 2c 20 74  ata_impl(ad_h, t
4130: 72 75 65 2c 20 6f 5f 6e 75 6d 29 29 3b 0a 20 20  rue, o_num));.  
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 29                })
4180: 0a 7d 0a 0a 75 6e 73 61 66 65 20 66 6e 20 61 70  .}..unsafe fn ap
4190: 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 6e 75  pendable_data_nu
41a0: 6d 5f 6f 66 5f 64 61 74 61 5f 69 6d 70 6c 28 61  m_of_data_impl(a
41b0: 64 5f 68 3a 20 41 70 70 65 6e 64 61 62 6c 65 44  d_h: AppendableD
41c0: 61 74 61 48 61 6e 64 6c 65 2c 0a 20 20 20 20 20  ataHandle,.     
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 20 69 73 5f 64 65 6c 65 74 65 64        is_deleted
4200: 5f 64 61 74 61 3a 20 62 6f 6f 6c 2c 0a 20 20 20  _data: bool,.   
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4230: 20 20 20 20 20 20 20 20 6f 5f 6e 75 6d 3a 20 2a          o_num: *
4240: 6d 75 74 20 75 73 69 7a 65 29 0a 20 20 20 20 20  mut usize).     
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4270: 20 20 20 20 20 20 2d 3e 20 52 65 73 75 6c 74 3c        -> Result<
4280: 28 29 2c 20 46 66 69 45 72 72 6f 72 3e 20 7b 0a  (), FfiError> {.
4290: 20 20 20 20 6c 65 74 20 6d 75 74 20 6f 62 6a 65      let mut obje
42a0: 63 74 5f 63 61 63 68 65 20 3d 20 75 6e 77 72 61  ct_cache = unwra
42b0: 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 28  p!(object_cache(
42c0: 29 29 3b 0a 20 20 20 20 6c 65 74 20 61 64 20 3d  ));.    let ad =
42d0: 20 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e 67 65   object_cache.ge
42e0: 74 5f 61 64 28 61 64 5f 68 29 3f 3b 0a 20 20 20  t_ad(ad_h)?;.   
42f0: 20 6c 65 74 20 6e 75 6d 20 3d 20 6d 61 74 63 68   let num = match
4300: 20 2a 61 64 20 7b 0a 20 20 20 20 20 20 20 20 41   *ad {.        A
4310: 70 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50  ppendableData::P
4320: 75 62 28 72 65 66 20 65 6c 74 29 20 3d 3e 20 7b  ub(ref elt) => {
4330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
4340: 69 73 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 20  is_deleted_data 
4350: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4360: 20 20 65 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61    elt.deleted_da
4370: 74 61 2e 6c 65 6e 28 29 0a 20 20 20 20 20 20 20  ta.len().       
4380: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
43a0: 74 2e 64 61 74 61 2e 6c 65 6e 28 29 0a 20 20 20  t.data.len().   
43b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
43c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
43d0: 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 72 69  endableData::Pri
43e0: 76 28 72 65 66 20 65 6c 74 29 20 3d 3e 20 7b 0a  v(ref elt) => {.
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69              if i
4400: 73 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 20 7b  s_deleted_data {
4410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4420: 20 65 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61 74   elt.deleted_dat
4430: 61 2e 6c 65 6e 28 29 0a 20 20 20 20 20 20 20 20  a.len().        
4440: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 74               elt
4460: 2e 64 61 74 61 2e 6c 65 6e 28 29 0a 20 20 20 20  .data.len().    
4470: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4480: 20 20 7d 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20    }.    };..    
4490: 70 74 72 3a 3a 77 72 69 74 65 28 6f 5f 6e 75 6d  ptr::write(o_num
44a0: 2c 20 6e 75 6d 29 3b 0a 20 20 20 20 4f 6b 28 28  , num);.    Ok((
44b0: 29 29 0a 7d 0a 0a 2f 2f 2f 20 47 65 74 20 6e 74  )).}../// Get nt
44c0: 68 20 61 70 70 65 6e 64 65 64 20 60 44 61 74 61  h appended `Data
44d0: 49 64 65 6e 74 69 66 69 65 72 60 20 66 72 6f 6d  Identifier` from
44e0: 20 64 61 74 61 2e 0a 23 5b 6e 6f 5f 6d 61 6e 67   data..#[no_mang
44f0: 6c 65 5d 0a 70 75 62 20 75 6e 73 61 66 65 20 65  le].pub unsafe e
4500: 78 74 65 72 6e 20 22 43 22 20 66 6e 20 61 70 70  xtern "C" fn app
4510: 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 6e 74 68  endable_data_nth
4520: 5f 64 61 74 61 5f 69 64 28 61 70 70 3a 20 2a 63  _data_id(app: *c
4530: 6f 6e 73 74 20 41 70 70 2c 0a 20 20 20 20 20 20  onst App,.      
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
4570: 64 5f 68 3a 20 41 70 70 65 6e 64 61 62 6c 65 44  d_h: AppendableD
4580: 61 74 61 48 61 6e 64 6c 65 2c 0a 20 20 20 20 20  ataHandle,.     
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 6e 3a 20 75 73 69 7a 65 2c 0a 20 20 20 20 20 20  n: usize,.      
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
4600: 5f 68 61 6e 64 6c 65 3a 20 2a 6d 75 74 20 44 61  _handle: *mut Da
4610: 74 61 49 64 48 61 6e 64 6c 65 29 0a 20 20 20 20  taIdHandle).    
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 2d 3e 20 69 33 32 20 7b 0a 20 20 20 20 68 65   -> i32 {.    he
4660: 6c 70 65 72 3a 3a 63 61 74 63 68 5f 75 6e 77 69  lper::catch_unwi
4670: 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a 20 20 20 20  nd_i32(|| {.    
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 66 69               ffi
46a0: 5f 74 72 79 21 28 61 70 70 65 6e 64 61 62 6c 65  _try!(appendable
46b0: 5f 64 61 74 61 5f 6e 74 68 5f 64 61 74 61 5f 69  _data_nth_data_i
46c0: 64 5f 69 6d 70 6c 28 61 70 70 2c 0a 20 20 20 20  d_impl(app,.    
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 20 20 20 20 61 64 5f 68 2c 0a 20 20 20         ad_h,.   
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 20 20 20 20 20 20 20 20 6e 2c 0a 20 20 20 20 20          n,.     
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 20 20 20 20 20 66 61 6c 73 65 2c 0a 20 20 20        false,.   
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 20 20 20 20 20 20 20 6f 5f 68 61 6e 64 6c 65          o_handle
4810: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 20 20 20 20 20 30 0a 20 20 20 20 20 20 20 20 20       0.         
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20 47 65      }).}../// Ge
4860: 74 20 6e 74 68 20 61 70 70 65 6e 64 65 64 20 60  t nth appended `
4870: 44 61 74 61 49 64 65 6e 74 69 66 69 65 72 60 20  DataIdentifier` 
4880: 66 72 6f 6d 20 64 65 6c 65 74 65 64 20 64 61 74  from deleted dat
4890: 61 2e 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a  a..#[no_mangle].
48a0: 70 75 62 20 75 6e 73 61 66 65 20 65 78 74 65 72  pub unsafe exter
48b0: 6e 20 22 43 22 20 66 6e 20 61 70 70 65 6e 64 61  n "C" fn appenda
48c0: 62 6c 65 5f 64 61 74 61 5f 6e 74 68 5f 64 65 6c  ble_data_nth_del
48d0: 65 74 65 64 5f 64 61 74 61 5f 69 64 28 61 70 70  eted_data_id(app
48e0: 3a 20 2a 63 6f 6e 73 74 20 41 70 70 2c 0a 20 20  : *const App,.  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 20 20 20 20 20 20 20 20 20 20 20 61 64 5f 68 3a             ad_h:
4930: 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 48   AppendableDataH
4940: 61 6e 64 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  andle,.         
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 20 20 6e 3a 20 75 73 69 7a 65 2c 0a 20 20      n: usize,.  
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49c0: 20 20 20 20 20 20 20 20 20 20 20 6f 5f 68 61 6e             o_han
49d0: 64 6c 65 3a 20 2a 6d 75 74 20 44 61 74 61 49 64  dle: *mut DataId
49e0: 48 61 6e 64 6c 65 29 0a 20 20 20 20 20 20 20 20  Handle).        
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 20 2d 3e 20 69 33 32 20 7b 0a 20 20       -> i32 {.  
4a30: 20 20 68 65 6c 70 65 72 3a 3a 63 61 74 63 68 5f    helper::catch_
4a40: 75 6e 77 69 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a  unwind_i32(|| {.
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 66 66 69 5f 74 72 79 21 28 61 70 70 65 6e 64   ffi_try!(append
4a80: 61 62 6c 65 5f 64 61 74 61 5f 6e 74 68 5f 64 61  able_data_nth_da
4a90: 74 61 5f 69 64 5f 69 6d 70 6c 28 61 70 70 2c 0a  ta_id_impl(app,.
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 61 64 5f 68 2c             ad_h,
4af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 6e 2c 0a 20              n,. 
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 20 20 20 20 20 20 74 72 75 65 2c 0a            true,.
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 6f 5f 68 61 6e             o_han
4be0: 64 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  dle));.         
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 20 20          0.      
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 20 20 20 20 20 20 20 7d 29 0a 7d 0a 0a 75 6e 73         }).}..uns
4c30: 61 66 65 20 66 6e 20 61 70 70 65 6e 64 61 62 6c  afe fn appendabl
4c40: 65 5f 64 61 74 61 5f 6e 74 68 5f 64 61 74 61 5f  e_data_nth_data_
4c50: 69 64 5f 69 6d 70 6c 28 61 70 70 3a 20 2a 63 6f  id_impl(app: *co
4c60: 6e 73 74 20 41 70 70 2c 0a 20 20 20 20 20 20 20  nst App,.       
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 61 64 5f 68 3a 20 41 70 70 65 6e 64      ad_h: Append
4ca0: 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65 2c 0a  ableDataHandle,.
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 6e 3a 20 75 73             n: us
4ce0: 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 69 73 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 3a  is_deleted_data:
4d20: 20 62 6f 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20   bool,.         
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 20 6f 5f 68 61 6e 64 6c 65 3a 20 2a 6d 75 74    o_handle: *mut
4d60: 20 44 61 74 61 49 64 48 61 6e 64 6c 65 29 0a 20   DataIdHandle). 
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 65 73            -> Res
4da0: 75 6c 74 3c 28 29 2c 20 46 66 69 45 72 72 6f 72  ult<(), FfiError
4db0: 3e 20 7b 0a 20 20 20 20 6c 65 74 20 61 70 70 20  > {.    let app 
4dc0: 3d 20 26 2a 61 70 70 3b 0a 0a 20 20 20 20 6c 65  = &*app;..    le
4dd0: 74 20 6d 75 74 20 6f 62 6a 65 63 74 5f 63 61 63  t mut object_cac
4de0: 68 65 20 3d 20 75 6e 77 72 61 70 21 28 6f 62 6a  he = unwrap!(obj
4df0: 65 63 74 5f 63 61 63 68 65 28 29 29 3b 0a 0a 20  ect_cache());.. 
4e00: 20 20 20 6c 65 74 20 64 61 74 61 5f 69 64 20 3d     let data_id =
4e10: 20 6d 61 74 63 68 20 2a 6f 62 6a 65 63 74 5f 63   match *object_c
4e20: 61 63 68 65 2e 67 65 74 5f 61 64 28 61 64 5f 68  ache.get_ad(ad_h
4e30: 29 3f 20 7b 0a 20 20 20 20 20 20 20 20 41 70 70  )? {.        App
4e40: 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 72 69  endableData::Pri
4e50: 76 28 72 65 66 20 65 6c 74 29 20 3d 3e 20 7b 0a  v(ref elt) => {.
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
4e70: 70 72 69 76 5f 64 61 74 61 20 3d 20 69 66 20 69  priv_data = if i
4e80: 73 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 20 7b  s_deleted_data {
4e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4ea0: 20 6e 74 68 28 26 65 6c 74 2e 64 65 6c 65 74 65   nth(&elt.delete
4eb0: 64 5f 64 61 74 61 2c 20 6e 29 3f 0a 20 20 20 20  d_data, n)?.    
4ec0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4ee0: 20 6e 74 68 28 26 65 6c 74 2e 64 61 74 61 2c 20   nth(&elt.data, 
4ef0: 6e 29 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)?.            
4f00: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  };.            l
4f10: 65 74 20 26 28 72 65 66 20 70 6b 2c 20 72 65 66  et &(ref pk, ref
4f20: 20 73 6b 29 20 3d 20 61 70 70 2e 61 73 79 6d 5f   sk) = app.asym_
4f30: 6b 65 79 73 28 29 3f 3b 0a 20 20 20 20 20 20 20  keys()?;.       
4f40: 20 20 20 20 20 70 72 69 76 5f 64 61 74 61 0a 20       priv_data. 
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e                 .
4f60: 6f 70 65 6e 28 70 6b 2c 20 73 6b 29 0a 20 20 20  open(pk, sk).   
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 6d 61               .ma
4f80: 70 5f 65 72 72 28 43 6f 72 65 45 72 72 6f 72 3a  p_err(CoreError:
4f90: 3a 66 72 6f 6d 29 3f 0a 20 20 20 20 20 20 20 20  :from)?.        
4fa0: 20 20 20 20 20 20 20 20 2e 70 6f 69 6e 74 65 72          .pointer
4fb0: 0a 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ..        }.    
4fc0: 20 20 20 20 41 70 70 65 6e 64 61 62 6c 65 44 61      AppendableDa
4fd0: 74 61 3a 3a 50 75 62 28 72 65 66 20 65 6c 74 29  ta::Pub(ref elt)
4fe0: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
4ff0: 20 20 69 66 20 69 73 5f 64 65 6c 65 74 65 64 5f    if is_deleted_
5000: 64 61 74 61 20 7b 0a 20 20 20 20 20 20 20 20 20  data {.         
5010: 20 20 20 20 20 20 20 6e 74 68 28 26 65 6c 74 2e         nth(&elt.
5020: 64 65 6c 65 74 65 64 5f 64 61 74 61 2c 20 6e 29  deleted_data, n)
5030: 3f 2e 70 6f 69 6e 74 65 72 0a 20 20 20 20 20 20  ?.pointer.      
5040: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
5060: 74 68 28 26 65 6c 74 2e 64 61 74 61 2c 20 6e 29  th(&elt.data, n)
5070: 3f 2e 70 6f 69 6e 74 65 72 0a 20 20 20 20 20 20  ?.pointer.      
5080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5090: 7d 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 6c 65  }.    };..    le
50a0: 74 20 68 61 6e 64 6c 65 20 3d 20 6f 62 6a 65 63  t handle = objec
50b0: 74 5f 63 61 63 68 65 2e 69 6e 73 65 72 74 5f 64  t_cache.insert_d
50c0: 61 74 61 5f 69 64 28 64 61 74 61 5f 69 64 29 3b  ata_id(data_id);
50d0: 0a 0a 20 20 20 20 70 74 72 3a 3a 77 72 69 74 65  ..    ptr::write
50e0: 28 6f 5f 68 61 6e 64 6c 65 2c 20 68 61 6e 64 6c  (o_handle, handl
50f0: 65 29 3b 0a 20 20 20 20 4f 6b 28 28 29 29 0a 7d  e);.    Ok(()).}
5100: 0a 0a 2f 2f 2f 20 47 65 74 20 6e 74 68 20 73 69  ../// Get nth si
5110: 67 6e 20 6b 65 79 20 66 72 6f 6d 20 64 61 74 61  gn key from data
5120: 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75  .#[no_mangle].pu
5130: 62 20 75 6e 73 61 66 65 20 65 78 74 65 72 6e 20  b unsafe extern 
5140: 22 43 22 20 66 6e 20 61 70 70 65 6e 64 61 62 6c  "C" fn appendabl
5150: 65 5f 64 61 74 61 5f 6e 74 68 5f 64 61 74 61 5f  e_data_nth_data_
5160: 73 69 67 6e 5f 6b 65 79 28 61 70 70 3a 20 2a 63  sign_key(app: *c
5170: 6f 6e 73 74 20 41 70 70 2c 0a 20 20 20 20 20 20  onst App,.      
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 20 20 20 61 64 5f 68 3a 20 41 70 70 65 6e       ad_h: Appen
51c0: 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65 2c  dableDataHandle,
51d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 6e 3a 20 75              n: u
5210: 73 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  size,.          
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 6f 5f 68 61 6e 64 6c 65 3a 20 2a 6d 75 74 20   o_handle: *mut 
5260: 53 69 67 6e 4b 65 79 48 61 6e 64 6c 65 29 0a 20  SignKeyHandle). 
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 69 33 32            -> i32
52b0: 20 7b 0a 20 20 20 20 68 65 6c 70 65 72 3a 3a 63   {.    helper::c
52c0: 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69 33 32 28  atch_unwind_i32(
52d0: 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  || {.           
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 20 20 20 20 66 66 69 5f 74 72 79 21 28 61        ffi_try!(a
5300: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 6e  ppendable_data_n
5310: 74 68 5f 73 69 67 6e 5f 6b 65 79 5f 69 6d 70 6c  th_sign_key_impl
5320: 28 61 70 70 2c 0a 20 20 20 20 20 20 20 20 20 20  (app,.          
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 61 64 5f 68 2c 0a 20 20 20 20 20 20 20 20    ad_h,.        
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 20 20 20 6e 2c 0a 20 20 20 20 20 20 20 20 20      n,.         
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 20 20 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20     false,.      
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 6f 5f 68 61 6e 64 6c 65 29 29        o_handle))
5470: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 20 30 0a 20 20 20 20 20 20 20 20 20 20 20     0.           
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20 47 65 74 20    }).}../// Get 
54c0: 6e 74 68 20 73 69 67 6e 20 6b 65 79 20 66 72 6f  nth sign key fro
54d0: 6d 20 64 65 6c 65 74 65 64 20 64 61 74 61 0a 23  m deleted data.#
54e0: 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20  [no_mangle].pub 
54f0: 75 6e 73 61 66 65 20 65 78 74 65 72 6e 20 22 43  unsafe extern "C
5500: 22 20 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f  " fn appendable_
5510: 64 61 74 61 5f 6e 74 68 5f 64 65 6c 65 74 65 64  data_nth_deleted
5520: 5f 64 61 74 61 5f 73 69 67 6e 5f 6b 65 79 28 61  _data_sign_key(a
5530: 70 70 3a 20 2a 63 6f 6e 73 74 20 41 70 70 2c 0a  pp: *const App,.
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 61 64 5f 68 3a 20 41 70 70 65 6e 64 61     ad_h: Appenda
5590: 62 6c 65 44 61 74 61 48 61 6e 64 6c 65 2c 0a 20  bleDataHandle,. 
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 6e 3a 20 75 73 69 7a 65 2c 0a 20 20 20 20    n: usize,.    
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
5630: 5f 68 61 6e 64 6c 65 3a 20 2a 6d 75 74 20 53 69  _handle: *mut Si
5640: 67 6e 4b 65 79 48 61 6e 64 6c 65 29 0a 20 20 20  gnKeyHandle).   
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 2d 3e 20 69 33 32 20 7b 0a 20 20 20 20 68 65 6c  -> i32 {.    hel
56a0: 70 65 72 3a 3a 63 61 74 63 68 5f 75 6e 77 69 6e  per::catch_unwin
56b0: 64 5f 69 33 32 28 7c 7c 20 7b 0a 20 20 20 20 20  d_i32(|| {.     
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 66 69 5f              ffi_
56e0: 74 72 79 21 28 61 70 70 65 6e 64 61 62 6c 65 5f  try!(appendable_
56f0: 64 61 74 61 5f 6e 74 68 5f 73 69 67 6e 5f 6b 65  data_nth_sign_ke
5700: 79 5f 69 6d 70 6c 28 61 70 70 2c 0a 20 20 20 20  y_impl(app,.    
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 20 20 20 20 20 20 20 61 64 5f 68 2c 0a 20 20          ad_h,.  
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 20 20 20 20 20 6e 2c 0a 20 20 20            n,.   
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 20 20 20 20 20 20 20 74 72 75 65 2c 0a 20           true,. 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 20 20 20 20 20 20 20 6f 5f 68 61 6e             o_han
5850: 64 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  dle));.         
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 20 20          0.      
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 20 20 20 20 20 7d 29 0a 7d 0a 0a 75 6e 73         }).}..uns
58a0: 61 66 65 20 66 6e 20 61 70 70 65 6e 64 61 62 6c  afe fn appendabl
58b0: 65 5f 64 61 74 61 5f 6e 74 68 5f 73 69 67 6e 5f  e_data_nth_sign_
58c0: 6b 65 79 5f 69 6d 70 6c 28 61 70 70 3a 20 2a 63  key_impl(app: *c
58d0: 6f 6e 73 74 20 41 70 70 2c 0a 20 20 20 20 20 20  onst App,.      
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 61 64 5f 68 3a 20 41 70 70 65        ad_h: Appe
5910: 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65  ndableDataHandle
5920: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 3a                n:
5950: 20 75 73 69 7a 65 2c 0a 20 20 20 20 20 20 20 20   usize,.        
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 20 20 69 73 5f 64 65 6c 65 74 65 64 5f 64      is_deleted_d
5990: 61 74 61 3a 20 62 6f 6f 6c 2c 0a 20 20 20 20 20  ata: bool,.     
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59c0: 20 20 20 20 20 20 20 6f 5f 68 61 6e 64 6c 65 3a         o_handle:
59d0: 20 2a 6d 75 74 20 53 69 67 6e 4b 65 79 48 61 6e   *mut SignKeyHan
59e0: 64 6c 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  dle).           
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 2d 3e 20 52 65 73 75 6c 74 3c 28 29 2c 20 46   -> Result<(), F
5a20: 66 69 45 72 72 6f 72 3e 20 7b 0a 20 20 20 20 6c  fiError> {.    l
5a30: 65 74 20 61 70 70 20 3d 20 26 2a 61 70 70 3b 0a  et app = &*app;.
5a40: 0a 20 20 20 20 6c 65 74 20 6d 75 74 20 6f 62 6a  .    let mut obj
5a50: 65 63 74 5f 63 61 63 68 65 20 3d 20 75 6e 77 72  ect_cache = unwr
5a60: 61 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65  ap!(object_cache
5a70: 28 29 29 3b 0a 0a 20 20 20 20 6c 65 74 20 73 69  ());..    let si
5a80: 67 6e 5f 6b 65 79 20 3d 20 6d 61 74 63 68 20 2a  gn_key = match *
5a90: 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e 67 65 74  object_cache.get
5aa0: 5f 61 64 28 61 64 5f 68 29 3f 20 7b 0a 20 20 20  _ad(ad_h)? {.   
5ab0: 20 20 20 20 20 41 70 70 65 6e 64 61 62 6c 65 44       AppendableD
5ac0: 61 74 61 3a 3a 50 72 69 76 28 72 65 66 20 65 6c  ata::Priv(ref el
5ad0: 74 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  t) => {.        
5ae0: 20 20 20 20 6c 65 74 20 70 72 69 76 5f 64 61 74      let priv_dat
5af0: 61 20 3d 20 69 66 20 69 73 5f 64 65 6c 65 74 65  a = if is_delete
5b00: 64 5f 64 61 74 61 20 7b 0a 20 20 20 20 20 20 20  d_data {.       
5b10: 20 20 20 20 20 20 20 20 20 6e 74 68 28 26 65 6c           nth(&el
5b20: 74 2e 64 65 6c 65 74 65 64 5f 64 61 74 61 2c 20  t.deleted_data, 
5b30: 6e 29 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)?.            
5b40: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
5b50: 20 20 20 20 20 20 20 20 20 6e 74 68 28 26 65 6c           nth(&el
5b60: 74 2e 64 61 74 61 2c 20 6e 29 3f 0a 20 20 20 20  t.data, n)?.    
5b70: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
5b80: 20 20 20 20 20 20 20 6c 65 74 20 26 28 72 65 66         let &(ref
5b90: 20 70 6b 2c 20 72 65 66 20 73 6b 29 20 3d 20 61   pk, ref sk) = a
5ba0: 70 70 2e 61 73 79 6d 5f 6b 65 79 73 28 29 3f 3b  pp.asym_keys()?;
5bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
5bc0: 76 5f 64 61 74 61 0a 20 20 20 20 20 20 20 20 20  v_data.         
5bd0: 20 20 20 20 20 20 20 2e 6f 70 65 6e 28 70 6b 2c         .open(pk,
5be0: 20 73 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20   sk).           
5bf0: 20 20 20 20 20 2e 6d 61 70 5f 65 72 72 28 43 6f       .map_err(Co
5c00: 72 65 45 72 72 6f 72 3a 3a 66 72 6f 6d 29 3f 0a  reError::from)?.
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 2e 73 69 67 6e 5f 6b 65 79 0a 0a 20 20 20 20 20  .sign_key..     
5c30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70     }.        App
5c40: 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 75 62  endableData::Pub
5c50: 28 72 65 66 20 65 6c 74 29 20 3d 3e 20 7b 0a 20  (ref elt) => {. 
5c60: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69 73             if is
5c70: 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 20 7b 0a  _deleted_data {.
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 6e 74 68 28 26 65 6c 74 2e 64 65 6c 65 74 65 64  nth(&elt.deleted
5ca0: 5f 64 61 74 61 2c 20 6e 29 3f 2e 73 69 67 6e 5f  _data, n)?.sign_
5cb0: 6b 65 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  key.            
5cc0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
5cd0: 20 20 20 20 20 20 20 20 20 6e 74 68 28 26 65 6c           nth(&el
5ce0: 74 2e 64 61 74 61 2c 20 6e 29 3f 2e 73 69 67 6e  t.data, n)?.sign
5cf0: 5f 6b 65 79 0a 20 20 20 20 20 20 20 20 20 20 20  _key.           
5d00: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
5d10: 20 7d 3b 0a 0a 20 20 20 20 6c 65 74 20 68 61 6e   };..    let han
5d20: 64 6c 65 20 3d 20 6f 62 6a 65 63 74 5f 63 61 63  dle = object_cac
5d30: 68 65 2e 69 6e 73 65 72 74 5f 73 69 67 6e 5f 6b  he.insert_sign_k
5d40: 65 79 28 73 69 67 6e 5f 6b 65 79 29 3b 0a 0a 20  ey(sign_key);.. 
5d50: 20 20 20 70 74 72 3a 3a 77 72 69 74 65 28 6f 5f     ptr::write(o_
5d60: 68 61 6e 64 6c 65 2c 20 68 61 6e 64 6c 65 29 3b  handle, handle);
5d70: 0a 20 20 20 20 4f 6b 28 28 29 29 0a 7d 0a 0a 2f  .    Ok(()).}../
5d80: 2f 2f 20 52 65 6d 6f 76 65 20 74 68 65 20 6e 2d  // Remove the n-
5d90: 74 68 20 64 61 74 61 20 69 74 65 6d 20 66 72 6f  th data item fro
5da0: 6d 20 74 68 65 20 61 70 70 65 6e 64 61 62 6c 65  m the appendable
5db0: 20 64 61 74 61 2e 20 54 68 65 20 64 61 74 61 20   data. The data 
5dc0: 68 61 73 20 74 6f 20 62 65 20 50 4f 53 54 27 64  has to be POST'd
5dd0: 20 61 66 74 65 72 77 61 72 64 73 20 66 6f 72 20   afterwards for 
5de0: 74 68 65 0a 2f 2f 2f 20 63 68 61 6e 67 65 20 74  the./// change t
5df0: 6f 20 62 65 20 72 65 67 69 73 74 65 72 65 64 20  o be registered 
5e00: 62 79 20 74 68 65 20 6e 65 74 77 6f 72 6b 2e 20  by the network. 
5e10: 54 68 65 20 64 61 74 61 20 69 73 20 6d 6f 76 65  The data is move
5e20: 64 20 74 6f 20 64 65 6c 65 74 65 64 20 64 61 74  d to deleted dat
5e30: 61 2e 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a  a..#[no_mangle].
5e40: 70 75 62 20 65 78 74 65 72 6e 20 22 43 22 20 66  pub extern "C" f
5e50: 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  n appendable_dat
5e60: 61 5f 72 65 6d 6f 76 65 5f 6e 74 68 5f 64 61 74  a_remove_nth_dat
5e70: 61 28 61 64 5f 68 3a 20 41 70 70 65 6e 64 61 62  a(ad_h: Appendab
5e80: 6c 65 44 61 74 61 48 61 6e 64 6c 65 2c 20 6e 3a  leDataHandle, n:
5e90: 20 75 73 69 7a 65 29 20 2d 3e 20 69 33 32 20 7b   usize) -> i32 {
5ea0: 0a 20 20 20 20 68 65 6c 70 65 72 3a 3a 63 61 74  .    helper::cat
5eb0: 63 68 5f 75 6e 77 69 6e 64 5f 69 33 32 28 7c 7c  ch_unwind_i32(||
5ec0: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d   {.        let m
5ed0: 75 74 20 6f 62 6a 65 63 74 5f 63 61 63 68 65 20  ut object_cache 
5ee0: 3d 20 75 6e 77 72 61 70 21 28 6f 62 6a 65 63 74  = unwrap!(object
5ef0: 5f 63 61 63 68 65 28 29 29 3b 0a 20 20 20 20 20  _cache());.     
5f00: 20 20 20 6d 61 74 63 68 20 2a 66 66 69 5f 74 72     match *ffi_tr
5f10: 79 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e  y!(object_cache.
5f20: 67 65 74 5f 61 64 28 61 64 5f 68 29 29 20 7b 0a  get_ad(ad_h)) {.
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70 65              Appe
5f40: 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 75 62 28  ndableData::Pub(
5f50: 72 65 66 20 6d 75 74 20 65 6c 74 29 20 3d 3e 20  ref mut elt) => 
5f60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5f70: 20 20 2f 2f 20 54 4f 44 4f 20 49 73 6e 27 74 20    // TODO Isn't 
5f80: 74 68 65 72 65 20 45 6e 74 72 79 3a 3a 4f 63 63  there Entry::Occ
5f90: 75 70 69 65 64 3a 3a 72 65 6d 6f 76 65 28 29 20  upied::remove() 
5fa0: 6c 69 6b 65 20 48 61 73 68 4d 61 70 20 65 74 63  like HashMap etc
5fb0: 20 74 6f 20 70 72 65 76 65 6e 74 20 63 6c 6f 6e   to prevent clon
5fc0: 65 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ?.            
5fd0: 20 20 20 20 2f 2f 20 20 20 20 20 20 49 66 20 74      //      If t
5fe0: 68 65 72 65 20 69 73 20 72 65 66 61 63 74 6f 72  here is refactor
5ff0: 20 69 6e 20 6f 74 68 65 72 20 70 6c 61 63 65 73   in other places
6000: 20 74 6f 6f 20 68 65 72 65 2e 0a 20 20 20 20 20   too here..     
6010: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 69             let i
6020: 74 65 6d 20 3d 20 66 66 69 5f 74 72 79 21 28 6e  tem = ffi_try!(n
6030: 74 68 28 26 65 6c 74 2e 64 61 74 61 2c 20 6e 29  th(&elt.data, n)
6040: 29 2e 63 6c 6f 6e 65 28 29 3b 0a 20 20 20 20 20  ).clone();.     
6050: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6c             if el
6060: 74 2e 64 61 74 61 2e 72 65 6d 6f 76 65 28 26 69  t.data.remove(&i
6070: 74 65 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 20  tem) {.         
6080: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 5f             let _
6090: 20 3d 20 65 6c 74 2e 64 65 6c 65 74 65 64 5f 64   = elt.deleted_d
60a0: 61 74 61 2e 69 6e 73 65 72 74 28 69 74 65 6d 29  ata.insert(item)
60b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
60c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
60d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 70  }.            Ap
60e0: 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 72  pendableData::Pr
60f0: 69 76 28 72 65 66 20 6d 75 74 20 65 6c 74 29 20  iv(ref mut elt) 
6100: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
6110: 20 20 20 20 20 6c 65 74 20 69 74 65 6d 20 3d 20       let item = 
6120: 66 66 69 5f 74 72 79 21 28 6e 74 68 28 26 65 6c  ffi_try!(nth(&el
6130: 74 2e 64 61 74 61 2c 20 6e 29 29 2e 63 6c 6f 6e  t.data, n)).clon
6140: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e();.           
6150: 20 20 20 20 20 69 66 20 65 6c 74 2e 64 61 74 61       if elt.data
6160: 2e 72 65 6d 6f 76 65 28 26 69 74 65 6d 29 20 7b  .remove(&item) {
6170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6180: 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 65 6c 74       let _ = elt
6190: 2e 64 65 6c 65 74 65 64 5f 64 61 74 61 2e 69 6e  .deleted_data.in
61a0: 73 65 72 74 28 69 74 65 6d 29 3b 0a 20 20 20 20  sert(item);.    
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
61c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
61d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 30      }..        0
61e0: 0a 20 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20 52  .    }).}../// R
61f0: 65 73 74 6f 72 65 20 74 68 65 20 6e 2d 74 68 20  estore the n-th 
6200: 64 65 6c 65 74 65 20 64 61 74 61 20 69 74 65 6d  delete data item
6210: 20 74 6f 20 64 61 74 61 20 66 69 65 6c 64 20 62   to data field b
6220: 61 63 6b 2e 20 54 68 65 20 64 61 74 61 20 68 61  ack. The data ha
6230: 73 20 74 6f 20 62 65 20 50 4f 53 54 27 64 20 61  s to be POST'd a
6240: 66 74 65 72 77 61 72 64 73 20 66 6f 72 0a 2f 2f  fterwards for.//
6250: 2f 20 74 68 65 20 63 68 61 6e 67 65 20 74 6f 20  / the change to 
6260: 62 65 20 72 65 67 69 73 74 65 72 65 64 20 62 79  be registered by
6270: 20 74 68 65 20 6e 65 74 77 6f 72 6b 2e 0a 23 5b   the network..#[
6280: 6e 6f 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20 65  no_mangle].pub e
6290: 78 74 65 72 6e 20 22 43 22 20 66 6e 20 61 70 70  xtern "C" fn app
62a0: 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 72 65 73  endable_data_res
62b0: 74 6f 72 65 5f 6e 74 68 5f 64 65 6c 65 74 65 64  tore_nth_deleted
62c0: 5f 64 61 74 61 28 61 64 5f 68 3a 20 41 70 70 65  _data(ad_h: Appe
62d0: 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65  ndableDataHandle
62e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 3a 20               n: 
6320: 75 73 69 7a 65 29 0a 20 20 20 20 20 20 20 20 20  usize).         
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6360: 20 20 2d 3e 20 69 33 32 20 7b 0a 20 20 20 20 68    -> i32 {.    h
6370: 65 6c 70 65 72 3a 3a 63 61 74 63 68 5f 75 6e 77  elper::catch_unw
6380: 69 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a 20 20 20  ind_i32(|| {.   
6390: 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6f 62 6a       let mut obj
63a0: 65 63 74 5f 63 61 63 68 65 20 3d 20 75 6e 77 72  ect_cache = unwr
63b0: 61 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65  ap!(object_cache
63c0: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 74  ());.        mat
63d0: 63 68 20 2a 66 66 69 5f 74 72 79 21 28 6f 62 6a  ch *ffi_try!(obj
63e0: 65 63 74 5f 63 61 63 68 65 2e 67 65 74 5f 61 64  ect_cache.get_ad
63f0: 28 61 64 5f 68 29 29 20 7b 0a 20 20 20 20 20 20  (ad_h)) {.      
6400: 20 20 20 20 20 20 41 70 70 65 6e 64 61 62 6c 65        Appendable
6410: 44 61 74 61 3a 3a 50 75 62 28 72 65 66 20 6d 75  Data::Pub(ref mu
6420: 74 20 65 6c 74 29 20 3d 3e 20 7b 0a 20 20 20 20  t elt) => {.    
6430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54              // T
6440: 4f 44 4f 20 49 73 6e 27 74 20 74 68 65 72 65 20  ODO Isn't there 
6450: 45 6e 74 72 79 3a 3a 4f 63 63 75 70 69 65 64 3a  Entry::Occupied:
6460: 3a 72 65 6d 6f 76 65 28 29 20 6c 69 6b 65 20 48  :remove() like H
6470: 61 73 68 4d 61 70 20 65 74 63 20 74 6f 20 70 72  ashMap etc to pr
6480: 65 76 65 6e 74 20 63 6c 6f 6e 65 20 3f 0a 20 20  event clone ?.  
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
64a0: 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 69        If there i
64b0: 73 20 72 65 66 61 63 74 6f 72 20 69 6e 20 6f 74  s refactor in ot
64c0: 68 65 72 20 70 6c 61 63 65 73 20 74 6f 6f 20 68  her places too h
64d0: 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ere..           
64e0: 20 20 20 20 20 6c 65 74 20 69 74 65 6d 20 3d 20       let item = 
64f0: 66 66 69 5f 74 72 79 21 28 6e 74 68 28 26 65 6c  ffi_try!(nth(&el
6500: 74 2e 64 65 6c 65 74 65 64 5f 64 61 74 61 2c 20  t.deleted_data, 
6510: 6e 29 29 2e 63 6c 6f 6e 65 28 29 3b 0a 20 20 20  n)).clone();.   
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
6530: 65 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61 74 61  elt.deleted_data
6540: 2e 72 65 6d 6f 76 65 28 26 69 74 65 6d 29 20 7b  .remove(&item) {
6550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6560: 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 65 6c 74       let _ = elt
6570: 2e 64 61 74 61 2e 69 6e 73 65 72 74 28 69 74 65  .data.insert(ite
6580: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
6590: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
65a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
65b0: 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a  AppendableData::
65c0: 50 72 69 76 28 72 65 66 20 6d 75 74 20 65 6c 74  Priv(ref mut elt
65d0: 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
65e0: 20 20 20 20 20 20 20 6c 65 74 20 69 74 65 6d 20         let item 
65f0: 3d 20 66 66 69 5f 74 72 79 21 28 6e 74 68 28 26  = ffi_try!(nth(&
6600: 65 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61 74 61  elt.deleted_data
6610: 2c 20 6e 29 29 2e 63 6c 6f 6e 65 28 29 3b 0a 20  , n)).clone();. 
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6630: 66 20 65 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61  f elt.deleted_da
6640: 74 61 2e 72 65 6d 6f 76 65 28 26 69 74 65 6d 29  ta.remove(&item)
6650: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6660: 20 20 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 65         let _ = e
6670: 6c 74 2e 64 61 74 61 2e 69 6e 73 65 72 74 28 69  lt.data.insert(i
6680: 74 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tem);.          
6690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
66a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
66b0: 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 7d  .        0.    }
66c0: 29 0a 7d 0a 0a 2f 2f 2f 20 43 6c 65 61 72 20 61  ).}../// Clear a
66d0: 6c 6c 20 64 61 74 61 20 2d 20 6d 6f 76 65 73 20  ll data - moves 
66e0: 69 74 20 74 6f 20 64 65 6c 65 74 65 64 20 64 61  it to deleted da
66f0: 74 61 2e 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d  ta..#[no_mangle]
6700: 0a 70 75 62 20 65 78 74 65 72 6e 20 22 43 22 20  .pub extern "C" 
6710: 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  fn appendable_da
6720: 74 61 5f 63 6c 65 61 72 5f 64 61 74 61 28 61 64  ta_clear_data(ad
6730: 5f 68 3a 20 41 70 70 65 6e 64 61 62 6c 65 44 61  _h: AppendableDa
6740: 74 61 48 61 6e 64 6c 65 29 20 2d 3e 20 69 33 32  taHandle) -> i32
6750: 20 7b 0a 20 20 20 20 68 65 6c 70 65 72 3a 3a 63   {.    helper::c
6760: 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69 33 32 28  atch_unwind_i32(
6770: 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  || {.        let
6780: 20 6d 75 74 20 6f 62 6a 65 63 74 5f 63 61 63 68   mut object_cach
6790: 65 20 3d 20 75 6e 77 72 61 70 21 28 6f 62 6a 65  e = unwrap!(obje
67a0: 63 74 5f 63 61 63 68 65 28 29 29 3b 0a 20 20 20  ct_cache());.   
67b0: 20 20 20 20 20 6d 61 74 63 68 20 2a 66 66 69 5f       match *ffi_
67c0: 74 72 79 21 28 6f 62 6a 65 63 74 5f 63 61 63 68  try!(object_cach
67d0: 65 2e 67 65 74 5f 61 64 28 61 64 5f 68 29 29 20  e.get_ad(ad_h)) 
67e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 70  {.            Ap
67f0: 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 75  pendableData::Pu
6800: 62 28 72 65 66 20 6d 75 74 20 65 6c 74 29 20 3d  b(ref mut elt) =
6810: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
6820: 20 20 20 20 6c 65 74 20 74 6d 70 20 3d 20 6d 65      let tmp = me
6830: 6d 3a 3a 72 65 70 6c 61 63 65 28 26 6d 75 74 20  m::replace(&mut 
6840: 65 6c 74 2e 64 61 74 61 2c 20 44 65 66 61 75 6c  elt.data, Defaul
6850: 74 3a 3a 64 65 66 61 75 6c 74 28 29 29 3b 0a 20  t::default());. 
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
6870: 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61 74 61 2e  lt.deleted_data.
6880: 65 78 74 65 6e 64 28 74 6d 70 29 3b 0a 20 20 20  extend(tmp);.   
6890: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
68a0: 20 20 20 20 20 20 20 41 70 70 65 6e 64 61 62 6c         Appendabl
68b0: 65 44 61 74 61 3a 3a 50 72 69 76 28 72 65 66 20  eData::Priv(ref 
68c0: 6d 75 74 20 65 6c 74 29 20 3d 3e 20 7b 0a 20 20  mut elt) => {.  
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
68e0: 74 20 74 6d 70 20 3d 20 6d 65 6d 3a 3a 72 65 70  t tmp = mem::rep
68f0: 6c 61 63 65 28 26 6d 75 74 20 65 6c 74 2e 64 61  lace(&mut elt.da
6900: 74 61 2c 20 44 65 66 61 75 6c 74 3a 3a 64 65 66  ta, Default::def
6910: 61 75 6c 74 28 29 29 3b 0a 20 20 20 20 20 20 20  ault());.       
6920: 20 20 20 20 20 20 20 20 20 65 6c 74 2e 64 65 6c           elt.del
6930: 65 74 65 64 5f 64 61 74 61 2e 65 78 74 65 6e 64  eted_data.extend
6940: 28 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  (tmp);.         
6950: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 3b 0a     }.        };.
6960: 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 7d  .        0.    }
6970: 29 0a 7d 0a 0a 2f 2f 2f 20 52 65 6d 6f 76 65 20  ).}../// Remove 
6980: 74 68 65 20 6e 2d 74 68 20 64 61 74 61 20 69 74  the n-th data it
6990: 65 6d 20 66 72 6f 6d 20 74 68 65 20 64 65 6c 65  em from the dele
69a0: 74 65 64 20 64 61 74 61 2e 20 54 68 65 20 64 61  ted data. The da
69b0: 74 61 20 68 61 73 20 74 6f 20 62 65 20 50 4f 53  ta has to be POS
69c0: 54 27 64 20 61 66 74 65 72 77 61 72 64 73 20 66  T'd afterwards f
69d0: 6f 72 20 74 68 65 0a 2f 2f 2f 20 63 68 61 6e 67  or the./// chang
69e0: 65 20 74 6f 20 62 65 20 72 65 67 69 73 74 65 72  e to be register
69f0: 65 64 20 62 79 20 74 68 65 20 6e 65 74 77 6f 72  ed by the networ
6a00: 6b 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 72  k. The data is r
6a10: 65 6d 6f 76 65 64 20 70 65 72 6d 61 6e 65 6e 74  emoved permanent
6a20: 6c 79 2e 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c 65 5d  ly..#[no_mangle]
6a30: 0a 70 75 62 20 65 78 74 65 72 6e 20 22 43 22 20  .pub extern "C" 
6a40: 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  fn appendable_da
6a50: 74 61 5f 72 65 6d 6f 76 65 5f 6e 74 68 5f 64 65  ta_remove_nth_de
6a60: 6c 65 74 65 64 5f 64 61 74 61 28 61 64 5f 68 3a  leted_data(ad_h:
6a70: 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 48   AppendableDataH
6a80: 61 6e 64 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  andle,.         
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ac0: 20 6e 3a 20 75 73 69 7a 65 29 0a 20 20 20 20 20   n: usize).     
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 20 20 20 20 2d 3e 20 69 33 32 20 7b 0a 20 20       -> i32 {.  
6b10: 20 20 68 65 6c 70 65 72 3a 3a 63 61 74 63 68 5f    helper::catch_
6b20: 75 6e 77 69 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a  unwind_i32(|| {.
6b30: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20          let mut 
6b40: 6f 62 6a 65 63 74 5f 63 61 63 68 65 20 3d 20 75  object_cache = u
6b50: 6e 77 72 61 70 21 28 6f 62 6a 65 63 74 5f 63 61  nwrap!(object_ca
6b60: 63 68 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20  che());.        
6b70: 6d 61 74 63 68 20 2a 66 66 69 5f 74 72 79 21 28  match *ffi_try!(
6b80: 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e 67 65 74  object_cache.get
6b90: 5f 61 64 28 61 64 5f 68 29 29 20 7b 0a 20 20 20  _ad(ad_h)) {.   
6ba0: 20 20 20 20 20 20 20 20 20 41 70 70 65 6e 64 61           Appenda
6bb0: 62 6c 65 44 61 74 61 3a 3a 50 75 62 28 72 65 66  bleData::Pub(ref
6bc0: 20 6d 75 74 20 65 6c 74 29 20 3d 3e 20 7b 0a 20   mut elt) => {. 
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
6be0: 65 74 20 69 74 65 6d 20 3d 20 66 66 69 5f 74 72  et item = ffi_tr
6bf0: 79 21 28 6e 74 68 28 26 65 6c 74 2e 64 65 6c 65  y!(nth(&elt.dele
6c00: 74 65 64 5f 64 61 74 61 2c 20 6e 29 29 2e 63 6c  ted_data, n)).cl
6c10: 6f 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  one();.         
6c20: 20 20 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 65         let _ = e
6c30: 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61 74 61 2e  lt.deleted_data.
6c40: 72 65 6d 6f 76 65 28 26 69 74 65 6d 29 3b 0a 20  remove(&item);. 
6c50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6c60: 20 20 20 20 20 20 20 20 20 41 70 70 65 6e 64 61           Appenda
6c70: 62 6c 65 44 61 74 61 3a 3a 50 72 69 76 28 72 65  bleData::Priv(re
6c80: 66 20 6d 75 74 20 65 6c 74 29 20 3d 3e 20 7b 0a  f mut elt) => {.
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 6c 65 74 20 69 74 65 6d 20 3d 20 66 66 69 5f 74  let item = ffi_t
6cb0: 72 79 21 28 6e 74 68 28 26 65 6c 74 2e 64 65 6c  ry!(nth(&elt.del
6cc0: 65 74 65 64 5f 64 61 74 61 2c 20 6e 29 29 2e 63  eted_data, n)).c
6cd0: 6c 6f 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20  lone();.        
6ce0: 20 20 20 20 20 20 20 20 6c 65 74 20 5f 20 3d 20          let _ = 
6cf0: 65 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61 74 61  elt.deleted_data
6d00: 2e 72 65 6d 6f 76 65 28 26 69 74 65 6d 29 3b 0a  .remove(&item);.
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6d20: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
6d30: 20 30 0a 20 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f   0.    }).}..///
6d40: 20 43 6c 65 61 72 20 61 6c 6c 20 64 65 6c 65 74   Clear all delet
6d50: 65 64 20 64 61 74 61 20 2d 20 64 61 74 61 20 77  ed data - data w
6d60: 69 6c 6c 20 62 65 20 61 63 74 75 61 6c 6c 79 20  ill be actually 
6d70: 62 65 20 72 65 6d 6f 76 65 64 2e 0a 23 5b 6e 6f  be removed..#[no
6d80: 5f 6d 61 6e 67 6c 65 5d 0a 70 75 62 20 65 78 74  _mangle].pub ext
6d90: 65 72 6e 20 22 43 22 20 66 6e 20 61 70 70 65 6e  ern "C" fn appen
6da0: 64 61 62 6c 65 5f 64 61 74 61 5f 63 6c 65 61 72  dable_data_clear
6db0: 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 28 61 64  _deleted_data(ad
6dc0: 5f 68 3a 20 41 70 70 65 6e 64 61 62 6c 65 44 61  _h: AppendableDa
6dd0: 74 61 48 61 6e 64 6c 65 29 20 2d 3e 20 69 33 32  taHandle) -> i32
6de0: 20 7b 0a 20 20 20 20 68 65 6c 70 65 72 3a 3a 63   {.    helper::c
6df0: 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69 33 32 28  atch_unwind_i32(
6e00: 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  || {.        let
6e10: 20 6d 75 74 20 6f 62 6a 65 63 74 5f 63 61 63 68   mut object_cach
6e20: 65 20 3d 20 75 6e 77 72 61 70 21 28 6f 62 6a 65  e = unwrap!(obje
6e30: 63 74 5f 63 61 63 68 65 28 29 29 3b 0a 20 20 20  ct_cache());.   
6e40: 20 20 20 20 20 6d 61 74 63 68 20 2a 66 66 69 5f       match *ffi_
6e50: 74 72 79 21 28 6f 62 6a 65 63 74 5f 63 61 63 68  try!(object_cach
6e60: 65 2e 67 65 74 5f 61 64 28 61 64 5f 68 29 29 20  e.get_ad(ad_h)) 
6e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 70  {.            Ap
6e80: 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 75  pendableData::Pu
6e90: 62 28 72 65 66 20 6d 75 74 20 65 6c 74 29 20 3d  b(ref mut elt) =
6ea0: 3e 20 65 6c 74 2e 64 65 6c 65 74 65 64 5f 64 61  > elt.deleted_da
6eb0: 74 61 2e 63 6c 65 61 72 28 29 2c 0a 20 20 20 20  ta.clear(),.    
6ec0: 20 20 20 20 20 20 20 20 41 70 70 65 6e 64 61 62          Appendab
6ed0: 6c 65 44 61 74 61 3a 3a 50 72 69 76 28 72 65 66  leData::Priv(ref
6ee0: 20 6d 75 74 20 65 6c 74 29 20 3d 3e 20 65 6c 74   mut elt) => elt
6ef0: 2e 64 65 6c 65 74 65 64 5f 64 61 74 61 2e 63 6c  .deleted_data.cl
6f00: 65 61 72 28 29 2c 0a 20 20 20 20 20 20 20 20 7d  ear(),.        }
6f10: 3b 0a 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20  ;..        0.   
6f20: 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20 41 70 70 65 6e   }).}../// Appen
6f30: 64 20 64 61 74 61 2e 0a 23 5b 6e 6f 5f 6d 61 6e  d data..#[no_man
6f40: 67 6c 65 5d 0a 70 75 62 20 75 6e 73 61 66 65 20  gle].pub unsafe 
6f50: 65 78 74 65 72 6e 20 22 43 22 20 66 6e 20 61 70  extern "C" fn ap
6f60: 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 61 70  pendable_data_ap
6f70: 70 65 6e 64 28 61 70 70 3a 20 2a 63 6f 6e 73 74  pend(app: *const
6f80: 20 41 70 70 2c 0a 20 20 20 20 20 20 20 20 20 20   App,.          
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fb0: 20 20 20 20 20 20 61 64 5f 68 3a 20 41 70 70 65        ad_h: Appe
6fc0: 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65  ndableDataHandle
6fd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 64 61 74 61 5f 69 64 5f 68 3a 20 44 61 74    data_id_h: Dat
7010: 61 49 64 48 61 6e 64 6c 65 29 0a 20 20 20 20 20  aIdHandle).     
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20 69 33             -> i3
7050: 32 20 7b 0a 20 20 20 20 68 65 6c 70 65 72 3a 3a  2 {.    helper::
7060: 63 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69 33 32  catch_unwind_i32
7070: 28 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 6c 65  (|| {.        le
7080: 74 20 63 6c 69 65 6e 74 20 3d 20 28 2a 61 70 70  t client = (*app
7090: 29 2e 67 65 74 5f 63 6c 69 65 6e 74 28 29 3b 0a  ).get_client();.
70a0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 70 70  .        let app
70b0: 65 6e 64 5f 77 72 61 70 70 65 72 20 3d 20 7b 0a  end_wrapper = {.
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
70d0: 6d 75 74 20 6f 62 6a 65 63 74 5f 63 61 63 68 65  mut object_cache
70e0: 20 3d 20 75 6e 77 72 61 70 21 28 6f 62 6a 65 63   = unwrap!(objec
70f0: 74 5f 63 61 63 68 65 28 29 29 3b 0a 20 20 20 20  t_cache());.    
7100: 20 20 20 20 20 20 20 20 6c 65 74 20 64 61 74 61          let data
7110: 5f 69 64 20 3d 20 2a 66 66 69 5f 74 72 79 21 28  _id = *ffi_try!(
7120: 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e 67 65 74  object_cache.get
7130: 5f 64 61 74 61 5f 69 64 28 64 61 74 61 5f 69 64  _data_id(data_id
7140: 5f 68 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  _h));..         
7150: 20 20 20 6c 65 74 20 63 6c 69 65 6e 74 20 3d 20     let client = 
7160: 75 6e 77 72 61 70 21 28 63 6c 69 65 6e 74 2e 6c  unwrap!(client.l
7170: 6f 63 6b 28 29 29 3b 0a 20 20 20 20 20 20 20 20  ock());.        
7180: 20 20 20 20 6c 65 74 20 73 69 67 6e 5f 70 6b 20      let sign_pk 
7190: 3d 20 66 66 69 5f 74 72 79 21 28 63 6c 69 65 6e  = ffi_try!(clien
71a0: 74 2e 67 65 74 5f 70 75 62 6c 69 63 5f 73 69 67  t.get_public_sig
71b0: 6e 69 6e 67 5f 6b 65 79 28 29 29 3b 0a 20 20 20  ning_key());.   
71c0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 69 67           let sig
71d0: 6e 5f 73 6b 20 3d 20 66 66 69 5f 74 72 79 21 28  n_sk = ffi_try!(
71e0: 63 6c 69 65 6e 74 2e 67 65 74 5f 73 65 63 72 65  client.get_secre
71f0: 74 5f 73 69 67 6e 69 6e 67 5f 6b 65 79 28 29 29  t_signing_key())
7200: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ;..            l
7210: 65 74 20 61 70 70 65 6e 64 65 64 5f 64 61 74 61  et appended_data
7220: 20 3d 20 66 66 69 5f 74 72 79 21 28 41 70 70 65   = ffi_try!(Appe
7230: 6e 64 65 64 44 61 74 61 3a 3a 6e 65 77 28 64 61  ndedData::new(da
7240: 74 61 5f 69 64 2c 20 2a 73 69 67 6e 5f 70 6b 2c  ta_id, *sign_pk,
7250: 20 73 69 67 6e 5f 73 6b 29 0a 20 20 20 20 20 20   sign_sk).      
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 20 20 2e 6d 61 70 5f 65 72 72 28         .map_err(
7290: 43 6f 72 65 45 72 72 6f 72 3a 3a 66 72 6f 6d 29  CoreError::from)
72a0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
72b0: 6d 61 74 63 68 20 2a 66 66 69 5f 74 72 79 21 28  match *ffi_try!(
72c0: 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e 67 65 74  object_cache.get
72d0: 5f 61 64 28 61 64 5f 68 29 29 20 7b 0a 20 20 20  _ad(ad_h)) {.   
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
72f0: 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 72 69  endableData::Pri
7300: 76 28 72 65 66 20 65 6c 74 29 20 3d 3e 20 7b 0a  v(ref elt) => {.
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 20 20 20 20 6c 65 74 20 70 72 69 76 5f 61 70 70      let priv_app
7330: 65 6e 64 65 64 5f 64 61 74 61 20 3d 20 66 66 69  ended_data = ffi
7340: 5f 74 72 79 21 28 50 72 69 76 41 70 70 65 6e 64  _try!(PrivAppend
7350: 65 64 44 61 74 61 3a 3a 6e 65 77 28 26 61 70 70  edData::new(&app
7360: 65 6e 64 65 64 5f 64 61 74 61 2c 0a 20 20 20 20  ended_data,.    
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 20 20 20 26 65 6c 74 2e 65 6e 63          &elt.enc
73c0: 72 79 70 74 5f 6b 65 79 29 0a 20 20 20 20 20 20  rypt_key).      
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7400: 20 20 20 20 20 20 20 20 2e 6d 61 70 5f 65 72 72          .map_err
7410: 28 43 6f 72 65 45 72 72 6f 72 3a 3a 66 72 6f 6d  (CoreError::from
7420: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
7430: 20 20 20 20 20 20 20 20 66 66 69 5f 74 72 79 21          ffi_try!
7440: 28 41 70 70 65 6e 64 57 72 61 70 70 65 72 3a 3a  (AppendWrapper::
7450: 6e 65 77 5f 70 72 69 76 28 65 6c 74 2e 6e 61 6d  new_priv(elt.nam
7460: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 20 20 70 72 69 76 5f 61 70 70          priv_app
74a0: 65 6e 64 65 64 5f 64 61 74 61 2c 0a 20 20 20 20  ended_data,.    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 20 28 73 69 67 6e 5f 70 6b 2c 20 73 69 67 6e 5f   (sign_pk, sign_
74f0: 73 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sk),.           
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 20 20 20 20 20 20 20 20 65 6c 74 2e 76 65            elt.ve
7530: 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 20  rsion).         
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 20 20 20 20 20 20 20 20 20 20 20 20 2e 6d 61 70              .map
7560: 5f 65 72 72 28 43 6f 72 65 45 72 72 6f 72 3a 3a  _err(CoreError::
7570: 66 72 6f 6d 29 29 0a 20 20 20 20 20 20 20 20 20  from)).         
7580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7590: 20 20 20 20 20 20 20 20 20 41 70 70 65 6e 64 61           Appenda
75a0: 62 6c 65 44 61 74 61 3a 3a 50 75 62 28 72 65 66  bleData::Pub(ref
75b0: 20 65 6c 74 29 20 3d 3e 20 7b 0a 20 20 20 20 20   elt) => {.     
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
75d0: 70 70 65 6e 64 57 72 61 70 70 65 72 3a 3a 6e 65  ppendWrapper::ne
75e0: 77 5f 70 75 62 28 65 6c 74 2e 6e 61 6d 65 2c 20  w_pub(elt.name, 
75f0: 61 70 70 65 6e 64 65 64 5f 64 61 74 61 2c 20 65  appended_data, e
7600: 6c 74 2e 76 65 72 73 69 6f 6e 29 0a 20 20 20 20  lt.version).    
7610: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7620: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7630: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
7640: 6c 65 74 20 72 65 73 70 5f 67 65 74 74 65 72 20  let resp_getter 
7650: 3d 20 66 66 69 5f 74 72 79 21 28 75 6e 77 72 61  = ffi_try!(unwra
7660: 70 21 28 63 6c 69 65 6e 74 2e 6c 6f 63 6b 28 29  p!(client.lock()
7670: 29 2e 61 70 70 65 6e 64 28 61 70 70 65 6e 64 5f  ).append(append_
7680: 77 72 61 70 70 65 72 2c 20 4e 6f 6e 65 29 29 3b  wrapper, None));
7690: 0a 20 20 20 20 20 20 20 20 66 66 69 5f 74 72 79  .        ffi_try
76a0: 21 28 72 65 73 70 5f 67 65 74 74 65 72 2e 67 65  !(resp_getter.ge
76b0: 74 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 30  t());..        0
76c0: 0a 20 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20 47  .    }).}../// G
76d0: 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  et the current v
76e0: 65 72 73 69 6f 6e 20 6f 66 20 60 41 70 70 65 6e  ersion of `Appen
76f0: 64 61 62 6c 65 44 61 74 61 60 20 62 79 20 69 74  dableData` by it
7700: 73 20 68 61 6e 64 6c 65 0a 23 5b 6e 6f 5f 6d 61  s handle.#[no_ma
7710: 6e 67 6c 65 5d 0a 70 75 62 20 75 6e 73 61 66 65  ngle].pub unsafe
7720: 20 65 78 74 65 72 6e 20 22 43 22 20 66 6e 20 61   extern "C" fn a
7730: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 76  ppendable_data_v
7740: 65 72 73 69 6f 6e 28 68 61 6e 64 6c 65 3a 20 41  ersion(handle: A
7750: 70 70 65 6e 64 61 62 6c 65 44 61 74 61 48 61 6e  ppendableDataHan
7760: 64 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dle,.           
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 20 20 6f 5f 76 65 72 73 69 6f 6e 3a        o_version:
77a0: 20 2a 6d 75 74 20 75 36 34 29 0a 20 20 20 20 20   *mut u64).     
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20 69              -> i
77e0: 33 32 20 7b 0a 20 20 20 20 68 65 6c 70 65 72 3a  32 {.    helper:
77f0: 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69 33  :catch_unwind_i3
7800: 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 2a  2(|| {.        *
7810: 6f 5f 76 65 72 73 69 6f 6e 20 3d 20 6d 61 74 63  o_version = matc
7820: 68 20 2a 66 66 69 5f 74 72 79 21 28 75 6e 77 72  h *ffi_try!(unwr
7830: 61 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65  ap!(object_cache
7840: 28 29 29 2e 67 65 74 5f 61 64 28 68 61 6e 64 6c  ()).get_ad(handl
7850: 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e)) {.          
7860: 20 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61    AppendableData
7870: 3a 3a 50 75 62 28 72 65 66 20 6d 75 74 20 65 6c  ::Pub(ref mut el
7880: 74 29 20 3d 3e 20 65 6c 74 2e 67 65 74 5f 76 65  t) => elt.get_ve
7890: 72 73 69 6f 6e 28 29 2c 0a 20 20 20 20 20 20 20  rsion(),.       
78a0: 20 20 20 20 20 41 70 70 65 6e 64 61 62 6c 65 44       AppendableD
78b0: 61 74 61 3a 3a 50 72 69 76 28 72 65 66 20 6d 75  ata::Priv(ref mu
78c0: 74 20 65 6c 74 29 20 3d 3e 20 65 6c 74 2e 67 65  t elt) => elt.ge
78d0: 74 5f 76 65 72 73 69 6f 6e 28 29 2c 0a 20 20 20  t_version(),.   
78e0: 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
78f0: 20 30 0a 20 20 20 20 7d 29 0a 7d 0a 0a 2f 2f 2f   0.    }).}..///
7900: 20 53 65 65 20 69 66 20 60 41 70 70 65 6e 64 61   See if `Appenda
7910: 62 6c 65 44 61 74 61 60 20 73 69 7a 65 20 69 73  bleData` size is
7920: 20 76 61 6c 69 64 2e 0a 23 5b 6e 6f 5f 6d 61 6e   valid..#[no_man
7930: 67 6c 65 5d 0a 70 75 62 20 75 6e 73 61 66 65 20  gle].pub unsafe 
7940: 65 78 74 65 72 6e 20 22 43 22 20 66 6e 20 61 70  extern "C" fn ap
7950: 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 76 61  pendable_data_va
7960: 6c 69 64 61 74 65 5f 73 69 7a 65 28 68 61 6e 64  lidate_size(hand
7970: 6c 65 3a 20 41 70 70 65 6e 64 61 62 6c 65 44 61  le: AppendableDa
7980: 74 61 48 61 6e 64 6c 65 2c 0a 20 20 20 20 20 20  taHandle,.      
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 6f 5f 76 61 6c 69 64 3a 20 2a 6d 75 74 20 62   o_valid: *mut b
79d0: 6f 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20  ool).           
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20 69              -> i
7a10: 33 32 20 7b 0a 20 20 20 20 68 65 6c 70 65 72 3a  32 {.    helper:
7a20: 3a 63 61 74 63 68 5f 75 6e 77 69 6e 64 5f 69 33  :catch_unwind_i3
7a30: 32 28 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 2a  2(|| {.        *
7a40: 6f 5f 76 61 6c 69 64 20 3d 20 6d 61 74 63 68 20  o_valid = match 
7a50: 2a 66 66 69 5f 74 72 79 21 28 75 6e 77 72 61 70  *ffi_try!(unwrap
7a60: 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 28 29  !(object_cache()
7a70: 29 2e 67 65 74 5f 61 64 28 68 61 6e 64 6c 65 29  ).get_ad(handle)
7a80: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
7a90: 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 3a 3a  AppendableData::
7aa0: 50 75 62 28 72 65 66 20 65 6c 74 29 20 3d 3e 20  Pub(ref elt) => 
7ab0: 65 6c 74 2e 76 61 6c 69 64 61 74 65 5f 73 69 7a  elt.validate_siz
7ac0: 65 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e(),.           
7ad0: 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 3a   AppendableData:
7ae0: 3a 50 72 69 76 28 72 65 66 20 65 6c 74 29 20 3d  :Priv(ref elt) =
7af0: 3e 20 65 6c 74 2e 76 61 6c 69 64 61 74 65 5f 73  > elt.validate_s
7b00: 69 7a 65 28 29 2c 0a 20 20 20 20 20 20 20 20 7d  ize(),.        }
7b10: 3b 0a 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20  ;..        0.   
7b20: 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20 52 65 74 75 72   }).}../// Retur
7b30: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 61  ns true if the a
7b40: 70 70 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  pp is one of the
7b50: 20 6f 77 6e 65 72 73 20 6f 66 20 74 68 65 20 70   owners of the p
7b60: 72 6f 76 69 64 65 64 20 60 41 70 70 65 6e 64 61  rovided `Appenda
7b70: 62 6c 65 44 61 74 61 60 2e 0a 23 5b 6e 6f 5f 6d  bleData`..#[no_m
7b80: 61 6e 67 6c 65 5d 0a 70 75 62 20 75 6e 73 61 66  angle].pub unsaf
7b90: 65 20 65 78 74 65 72 6e 20 22 43 22 20 66 6e 20  e extern "C" fn 
7ba0: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
7bb0: 69 73 5f 6f 77 6e 65 64 28 61 70 70 3a 20 2a 63  is_owned(app: *c
7bc0: 6f 6e 73 74 20 41 70 70 2c 0a 20 20 20 20 20 20  onst App,.      
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6e 64              hand
7c00: 6c 65 3a 20 41 70 70 65 6e 64 61 62 6c 65 44 61  le: AppendableDa
7c10: 74 61 48 61 6e 64 6c 65 2c 0a 20 20 20 20 20 20  taHandle,.      
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 6f 5f 69 73              o_is
7c50: 5f 6f 77 6e 65 64 3a 20 2a 6d 75 74 20 62 6f 6f  _owned: *mut boo
7c60: 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l).             
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 2d 3e 20 69 33 32 20 7b 0a 20 20       -> i32 {.  
7ca0: 20 20 68 65 6c 70 65 72 3a 3a 63 61 74 63 68 5f    helper::catch_
7cb0: 75 6e 77 69 6e 64 5f 69 33 32 28 7c 7c 20 7b 0a  unwind_i32(|| {.
7cc0: 20 20 20 20 20 20 20 20 6c 65 74 20 63 6c 69 65          let clie
7cd0: 6e 74 20 3d 20 28 2a 61 70 70 29 2e 67 65 74 5f  nt = (*app).get_
7ce0: 63 6c 69 65 6e 74 28 29 3b 0a 20 20 20 20 20 20  client();.      
7cf0: 20 20 6c 65 74 20 6d 79 5f 6b 65 79 20 3d 20 2a    let my_key = *
7d00: 66 66 69 5f 74 72 79 21 28 75 6e 77 72 61 70 21  ffi_try!(unwrap!
7d10: 28 63 6c 69 65 6e 74 2e 6c 6f 63 6b 28 29 29 2e  (client.lock()).
7d20: 67 65 74 5f 70 75 62 6c 69 63 5f 73 69 67 6e 69  get_public_signi
7d30: 6e 67 5f 6b 65 79 28 29 29 3b 0a 0a 20 20 20 20  ng_key());..    
7d40: 20 20 20 20 2a 6f 5f 69 73 5f 6f 77 6e 65 64 20      *o_is_owned 
7d50: 3d 20 6d 61 74 63 68 20 2a 66 66 69 5f 74 72 79  = match *ffi_try
7d60: 21 28 75 6e 77 72 61 70 21 28 6f 62 6a 65 63 74  !(unwrap!(object
7d70: 5f 63 61 63 68 65 28 29 29 2e 67 65 74 5f 61 64  _cache()).get_ad
7d80: 28 68 61 6e 64 6c 65 29 29 20 7b 0a 20 20 20 20  (handle)) {.    
7d90: 20 20 20 20 20 20 20 20 41 70 70 65 6e 64 61 62          Appendab
7da0: 6c 65 44 61 74 61 3a 3a 50 75 62 28 72 65 66 20  leData::Pub(ref 
7db0: 6d 75 74 20 65 6c 74 29 20 3d 3e 20 65 6c 74 2e  mut elt) => elt.
7dc0: 67 65 74 5f 6f 77 6e 65 72 73 28 29 2e 63 6f 6e  get_owners().con
7dd0: 74 61 69 6e 73 28 26 6d 79 5f 6b 65 79 29 2c 0a  tains(&my_key),.
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70 65              Appe
7df0: 6e 64 61 62 6c 65 44 61 74 61 3a 3a 50 72 69 76  ndableData::Priv
7e00: 28 72 65 66 20 6d 75 74 20 65 6c 74 29 20 3d 3e  (ref mut elt) =>
7e10: 20 65 6c 74 2e 67 65 74 5f 6f 77 6e 65 72 73 28   elt.get_owners(
7e20: 29 2e 63 6f 6e 74 61 69 6e 73 28 26 6d 79 5f 6b  ).contains(&my_k
7e30: 65 79 29 2c 0a 20 20 20 20 20 20 20 20 7d 3b 0a  ey),.        };.
7e40: 0a 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 7d  .        0.    }
7e50: 29 0a 7d 0a 0a 2f 2f 2f 20 46 72 65 65 20 60 41  ).}../// Free `A
7e60: 70 70 65 6e 64 61 62 6c 65 44 61 74 61 60 20 68  ppendableData` h
7e70: 61 6e 64 6c 65 0a 23 5b 6e 6f 5f 6d 61 6e 67 6c  andle.#[no_mangl
7e80: 65 5d 0a 70 75 62 20 65 78 74 65 72 6e 20 22 43  e].pub extern "C
7e90: 22 20 66 6e 20 61 70 70 65 6e 64 61 62 6c 65 5f  " fn appendable_
7ea0: 64 61 74 61 5f 66 72 65 65 28 68 61 6e 64 6c 65  data_free(handle
7eb0: 3a 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61  : AppendableData
7ec0: 48 61 6e 64 6c 65 29 20 2d 3e 20 69 33 32 20 7b  Handle) -> i32 {
7ed0: 0a 20 20 20 20 68 65 6c 70 65 72 3a 3a 63 61 74  .    helper::cat
7ee0: 63 68 5f 75 6e 77 69 6e 64 5f 69 33 32 28 7c 7c  ch_unwind_i32(||
7ef0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 6c 65 74 20 5f 20 3d 20 66 66 69 5f      let _ = ffi_
7f20: 74 72 79 21 28 75 6e 77 72 61 70 21 28 6f 62 6a  try!(unwrap!(obj
7f30: 65 63 74 5f 63 61 63 68 65 28 29 29 2e 72 65 6d  ect_cache()).rem
7f40: 6f 76 65 5f 61 64 28 68 61 6e 64 6c 65 29 29 3b  ove_ad(handle));
7f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20    0.            
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 7d 29 0a 7d 0a 0a 2f 2f 20 43 6f 6e 76 65 6e   }).}..// Conven
7fa0: 69 65 6e 63 65 20 66 75 6e 63 74 69 6f 6e 20 74  ience function t
7fb0: 6f 20 61 63 63 65 73 73 20 6e 2d 74 68 20 69 74  o access n-th it
7fc0: 65 6d 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  em from the give
7fd0: 6e 20 73 65 74 2c 20 72 65 74 75 72 6e 69 6e 67  n set, returning
7fe0: 20 46 66 69 45 72 72 6f 72 3a 3a 49 6e 76 61 6c   FfiError::Inval
7ff0: 69 64 49 6e 64 65 78 0a 2f 2f 20 69 66 20 6e 6f  idIndex.// if no
8000: 74 20 66 6f 75 6e 64 2e 0a 66 6e 20 6e 74 68 3c  t found..fn nth<
8010: 54 3e 28 69 74 65 6d 73 3a 20 26 42 54 72 65 65  T>(items: &BTree
8020: 53 65 74 3c 54 3e 2c 20 6e 3a 20 75 73 69 7a 65  Set<T>, n: usize
8030: 29 20 2d 3e 20 52 65 73 75 6c 74 3c 26 54 2c 20  ) -> Result<&T, 
8040: 46 66 69 45 72 72 6f 72 3e 20 7b 0a 20 20 20 20  FfiError> {.    
8050: 69 74 65 6d 73 2e 69 74 65 72 28 29 2e 6e 74 68  items.iter().nth
8060: 28 6e 29 2e 6f 6b 5f 6f 72 28 46 66 69 45 72 72  (n).ok_or(FfiErr
8070: 6f 72 3a 3a 49 6e 76 61 6c 69 64 49 6e 64 65 78  or::InvalidIndex
8080: 29 0a 7d 0a 0a 23 5b 63 66 67 28 74 65 73 74 29  ).}..#[cfg(test)
8090: 5d 0a 6d 6f 64 20 74 65 73 74 73 20 7b 0a 20 20  ].mod tests {.  
80a0: 20 20 75 73 65 20 73 75 70 65 72 3a 3a 2a 3b 0a    use super::*;.
80b0: 20 20 20 20 75 73 65 20 66 66 69 3a 3a 61 70 70      use ffi::app
80c0: 3a 3a 41 70 70 3b 0a 20 20 20 20 75 73 65 20 66  ::App;.    use f
80d0: 66 69 3a 3a 65 72 72 6f 72 73 3a 3a 46 66 69 45  fi::errors::FfiE
80e0: 72 72 6f 72 3b 0a 20 20 20 20 75 73 65 20 66 66  rror;.    use ff
80f0: 69 3a 3a 6c 6f 77 5f 6c 65 76 65 6c 5f 61 70 69  i::low_level_api
8100: 3a 3a 7b 41 70 70 65 6e 64 61 62 6c 65 44 61 74  ::{AppendableDat
8110: 61 48 61 6e 64 6c 65 2c 20 44 61 74 61 49 64 48  aHandle, DataIdH
8120: 61 6e 64 6c 65 7d 3b 0a 20 20 20 20 75 73 65 20  andle};.    use 
8130: 66 66 69 3a 3a 6c 6f 77 5f 6c 65 76 65 6c 5f 61  ffi::low_level_a
8140: 70 69 3a 3a 6d 69 73 63 3a 3a 2a 3b 0a 20 20 20  pi::misc::*;.   
8150: 20 75 73 65 20 66 66 69 3a 3a 6c 6f 77 5f 6c 65   use ffi::low_le
8160: 76 65 6c 5f 61 70 69 3a 3a 6f 62 6a 65 63 74 5f  vel_api::object_
8170: 63 61 63 68 65 3a 3a 6f 62 6a 65 63 74 5f 63 61  cache::object_ca
8180: 63 68 65 3b 0a 20 20 20 20 75 73 65 20 66 66 69  che;.    use ffi
8190: 3a 3a 74 65 73 74 5f 75 74 69 6c 73 3b 0a 20 20  ::test_utils;.  
81a0: 20 20 75 73 65 20 72 61 6e 64 3b 0a 20 20 20 20    use rand;.    
81b0: 75 73 65 20 72 6f 75 74 69 6e 67 3a 3a 44 61 74  use routing::Dat
81c0: 61 49 64 65 6e 74 69 66 69 65 72 3b 0a 20 20 20  aIdentifier;.   
81d0: 20 75 73 65 20 72 75 73 74 5f 73 6f 64 69 75 6d   use rust_sodium
81e0: 3a 3a 63 72 79 70 74 6f 3a 3a 73 69 67 6e 3b 0a  ::crypto::sign;.
81f0: 20 20 20 20 75 73 65 20 73 74 64 3a 3a 63 6f 6c      use std::col
8200: 6c 65 63 74 69 6f 6e 73 3a 3a 48 61 73 68 53 65  lections::HashSe
8210: 74 3b 0a 0a 20 20 20 20 6d 61 63 72 6f 5f 72 75  t;..    macro_ru
8220: 6c 65 73 21 20 61 73 73 65 72 74 5f 6e 75 6d 5f  les! assert_num_
8230: 6f 66 5f 64 61 74 61 20 7b 0a 20 20 20 20 20 20  of_data {.      
8240: 20 20 28 24 61 64 5f 68 3a 69 64 65 6e 74 2c 20    ($ad_h:ident, 
8250: 24 65 78 70 65 63 74 65 64 3a 65 78 70 72 29 20  $expected:expr) 
8260: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
8270: 20 6c 65 74 20 6d 75 74 20 6e 75 6d 3a 20 75 73   let mut num: us
8280: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
8290: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
82a0: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
82b0: 6e 75 6d 5f 6f 66 5f 64 61 74 61 28 24 61 64 5f  num_of_data($ad_
82c0: 68 2c 20 26 6d 75 74 20 6e 75 6d 29 2c 20 30 29  h, &mut num), 0)
82d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
82e0: 73 65 72 74 5f 65 71 21 28 6e 75 6d 2c 20 24 65  sert_eq!(num, $e
82f0: 78 70 65 63 74 65 64 29 3b 0a 20 20 20 20 20 20  xpected);.      
8300: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d    }.    }..    m
8310: 61 63 72 6f 5f 72 75 6c 65 73 21 20 61 73 73 65  acro_rules! asse
8320: 72 74 5f 6e 75 6d 5f 6f 66 5f 64 65 6c 65 74 65  rt_num_of_delete
8330: 64 5f 64 61 74 61 20 7b 0a 20 20 20 20 20 20 20  d_data {.       
8340: 20 28 24 61 64 5f 68 3a 69 64 65 6e 74 2c 20 24   ($ad_h:ident, $
8350: 65 78 70 65 63 74 65 64 3a 65 78 70 72 29 20 3d  expected:expr) =
8360: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
8370: 6c 65 74 20 6d 75 74 20 6e 75 6d 3a 20 75 73 69  let mut num: usi
8380: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
8390: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61      assert_eq!(a
83a0: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 6e  ppendable_data_n
83b0: 75 6d 5f 6f 66 5f 64 65 6c 65 74 65 64 5f 64 61  um_of_deleted_da
83c0: 74 61 28 24 61 64 5f 68 2c 20 26 6d 75 74 20 6e  ta($ad_h, &mut n
83d0: 75 6d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  um), 0);.       
83e0: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
83f0: 6e 75 6d 2c 20 24 65 78 70 65 63 74 65 64 29 3b  num, $expected);
8400: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
8410: 0a 0a 20 20 20 20 23 5b 74 65 73 74 5d 0a 20 20  ..    #[test].  
8420: 20 20 66 6e 20 70 75 74 5f 61 70 70 65 6e 64 5f    fn put_append_
8430: 61 6e 64 5f 67 65 74 28 29 20 7b 0a 20 20 20 20  and_get() {.    
8440: 20 20 20 20 6c 65 74 20 61 70 70 20 3d 20 74 65      let app = te
8450: 73 74 5f 75 74 69 6c 73 3a 3a 63 72 65 61 74 65  st_utils::create
8460: 5f 61 70 70 28 66 61 6c 73 65 29 3b 0a 0a 20 20  _app(false);..  
8470: 20 20 20 20 20 20 6c 65 74 20 61 64 5f 6e 61 6d        let ad_nam
8480: 65 20 3d 20 72 61 6e 64 3a 3a 72 61 6e 64 6f 6d  e = rand::random
8490: 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ();.        let 
84a0: 6d 75 74 20 61 64 5f 68 3a 20 41 70 70 65 6e 64  mut ad_h: Append
84b0: 61 62 6c 65 44 61 74 61 48 61 6e 64 6c 65 20 3d  ableDataHandle =
84c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20   0;.        let 
84d0: 6d 75 74 20 61 64 5f 69 64 5f 68 3a 20 44 61 74  mut ad_id_h: Dat
84e0: 61 49 64 48 61 6e 64 6c 65 20 3d 20 30 3b 0a 0a  aIdHandle = 0;..
84f0: 20 20 20 20 20 20 20 20 2f 2f 20 44 61 74 61 20          // Data 
8500: 74 6f 20 61 70 70 65 6e 64 0a 20 20 20 20 20 20  to append.      
8510: 20 20 6c 65 74 20 28 5f 2c 20 69 6d 6d 75 74 5f    let (_, immut_
8520: 69 64 5f 30 5f 68 29 20 3d 20 67 65 6e 65 72 61  id_0_h) = genera
8530: 74 65 5f 72 61 6e 64 6f 6d 5f 69 6d 6d 75 74 61  te_random_immuta
8540: 62 6c 65 5f 64 61 74 61 5f 69 64 28 29 3b 0a 20  ble_data_id();. 
8550: 20 20 20 20 20 20 20 6c 65 74 20 28 5f 2c 20 69         let (_, i
8560: 6d 6d 75 74 5f 69 64 5f 31 5f 68 29 20 3d 20 67  mmut_id_1_h) = g
8570: 65 6e 65 72 61 74 65 5f 72 61 6e 64 6f 6d 5f 69  enerate_random_i
8580: 6d 6d 75 74 61 62 6c 65 5f 64 61 74 61 5f 69 64  mmutable_data_id
8590: 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74  ();..        let
85a0: 20 6d 75 74 20 67 6f 74 5f 69 6d 6d 75 74 5f 69   mut got_immut_i
85b0: 64 5f 30 5f 68 3a 20 44 61 74 61 49 64 48 61 6e  d_0_h: DataIdHan
85c0: 64 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dle = 0;.       
85d0: 20 6c 65 74 20 6d 75 74 20 67 6f 74 5f 69 6d 6d   let mut got_imm
85e0: 75 74 5f 69 64 5f 31 5f 68 3a 20 44 61 74 61 49  ut_id_1_h: DataI
85f0: 64 48 61 6e 64 6c 65 20 3d 20 30 3b 0a 0a 20 20  dHandle = 0;..  
8600: 20 20 20 20 20 20 75 6e 73 61 66 65 20 7b 0a 20        unsafe {. 
8610: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43 72             // Cr
8620: 65 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 20  eate.           
8630: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
8640: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 6e 65 77 5f  ndable_data_new_
8650: 70 75 62 28 26 61 70 70 2c 20 26 61 64 5f 6e 61  pub(&app, &ad_na
8660: 6d 65 2c 20 26 6d 75 74 20 61 64 5f 68 29 2c 20  me, &mut ad_h), 
8670: 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
8680: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
8690: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 65 78 74 72  ndable_data_extr
86a0: 61 63 74 5f 64 61 74 61 5f 69 64 28 61 64 5f 68  act_data_id(ad_h
86b0: 2c 20 26 6d 75 74 20 61 64 5f 69 64 5f 68 29 2c  , &mut ad_id_h),
86c0: 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   0);..          
86d0: 20 20 2f 2f 20 50 55 54 20 74 6f 20 74 68 65 20    // PUT to the 
86e0: 6e 65 74 77 6f 72 6b 0a 20 20 20 20 20 20 20 20  network.        
86f0: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61      assert_eq!(a
8700: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 70  ppendable_data_p
8710: 75 74 28 26 61 70 70 2c 20 61 64 5f 68 29 2c 20  ut(&app, ad_h), 
8720: 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
8730: 20 2f 2f 20 41 50 50 45 4e 44 0a 20 20 20 20 20   // APPEND.     
8740: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
8750: 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  !(appendable_dat
8760: 61 5f 61 70 70 65 6e 64 28 26 61 70 70 2c 20 61  a_append(&app, a
8770: 64 5f 68 2c 20 69 6d 6d 75 74 5f 69 64 5f 30 5f  d_h, immut_id_0_
8780: 68 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  h), 0);.        
8790: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61      assert_eq!(a
87a0: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 61  ppendable_data_a
87b0: 70 70 65 6e 64 28 26 61 70 70 2c 20 61 64 5f 68  ppend(&app, ad_h
87c0: 2c 20 69 6d 6d 75 74 5f 69 64 5f 31 5f 68 29 2c  , immut_id_1_h),
87d0: 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   0);..          
87e0: 20 20 2f 2f 20 47 45 54 20 62 61 63 6b 0a 20 20    // GET back.  
87f0: 20 20 20 20 20 20 20 20 20 20 72 65 6c 6f 61 64            reload
8800: 5f 61 64 28 26 61 70 70 2c 20 61 64 5f 69 64 5f  _ad(&app, ad_id_
8810: 68 2c 20 26 6d 75 74 20 61 64 5f 68 29 3b 0a 20  h, &mut ad_h);. 
8820: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
8830: 74 5f 6e 75 6d 5f 6f 66 5f 64 61 74 61 21 28 61  t_num_of_data!(a
8840: 64 5f 68 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20  d_h, 2);..      
8850: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
8860: 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61  (appendable_data
8870: 5f 6e 74 68 5f 64 61 74 61 5f 69 64 28 26 61 70  _nth_data_id(&ap
8880: 70 2c 20 61 64 5f 68 2c 20 30 2c 20 26 6d 75 74  p, ad_h, 0, &mut
8890: 20 67 6f 74 5f 69 6d 6d 75 74 5f 69 64 5f 30 5f   got_immut_id_0_
88a0: 68 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  h),.            
88b0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
88c0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
88d0: 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65  t_eq!(appendable
88e0: 5f 64 61 74 61 5f 6e 74 68 5f 64 61 74 61 5f 69  _data_nth_data_i
88f0: 64 28 26 61 70 70 2c 20 61 64 5f 68 2c 20 31 2c  d(&app, ad_h, 1,
8900: 20 26 6d 75 74 20 67 6f 74 5f 69 6d 6d 75 74 5f   &mut got_immut_
8910: 69 64 5f 31 5f 68 29 2c 0a 20 20 20 20 20 20 20  id_1_h),.       
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
8940: 20 6c 65 74 20 6d 75 74 20 69 73 5f 6f 77 6e 65   let mut is_owne
8950: 72 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20 20  r = false;..    
8960: 20 20 20 20 20 20 20 20 2f 2f 20 43 68 65 63 6b          // Check
8970: 20 6f 77 6e 65 72 73 0a 20 20 20 20 20 20 20 20   owners.        
8980: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61      assert_eq!(a
8990: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 69  ppendable_data_i
89a0: 73 5f 6f 77 6e 65 64 28 26 61 70 70 2c 20 61 64  s_owned(&app, ad
89b0: 5f 68 2c 20 26 6d 75 74 20 69 73 5f 6f 77 6e 65  _h, &mut is_owne
89c0: 72 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r), 0);.        
89d0: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 69      assert_eq!(i
89e0: 73 5f 6f 77 6e 65 72 2c 20 74 72 75 65 29 3b 0a  s_owner, true);.
89f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
8a00: 20 61 70 70 5f 66 61 6b 65 20 3d 20 74 65 73 74   app_fake = test
8a10: 5f 75 74 69 6c 73 3a 3a 63 72 65 61 74 65 5f 61  _utils::create_a
8a20: 70 70 28 66 61 6c 73 65 29 3b 0a 20 20 20 20 20  pp(false);.     
8a30: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
8a40: 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  !(appendable_dat
8a50: 61 5f 69 73 5f 6f 77 6e 65 64 28 26 61 70 70 5f  a_is_owned(&app_
8a60: 66 61 6b 65 2c 20 61 64 5f 68 2c 20 26 6d 75 74  fake, ad_h, &mut
8a70: 20 69 73 5f 6f 77 6e 65 72 29 2c 20 30 29 3b 0a   is_owner), 0);.
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
8a90: 72 74 5f 65 71 21 28 69 73 5f 6f 77 6e 65 72 2c  rt_eq!(is_owner,
8aa0: 20 66 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20   false);..      
8ab0: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
8ac0: 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61  (appendable_data
8ad0: 5f 66 72 65 65 28 61 64 5f 68 29 2c 20 30 29 3b  _free(ad_h), 0);
8ae0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
8af0: 20 20 20 20 2f 2f 20 56 65 72 69 66 79 20 74 68      // Verify th
8b00: 65 20 64 61 74 61 20 69 74 65 6d 73 20 77 65 20  e data items we 
8b10: 67 6f 74 20 62 61 63 6b 20 61 72 65 20 74 68 65  got back are the
8b20: 20 73 61 6d 65 20 77 65 20 70 75 74 20 69 6e 2e   same we put in.
8b30: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
8b40: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6f         let mut o
8b50: 62 6a 65 63 74 5f 63 61 63 68 65 20 3d 20 75 6e  bject_cache = un
8b60: 77 72 61 70 21 28 6f 62 6a 65 63 74 5f 63 61 63  wrap!(object_cac
8b70: 68 65 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  he());..        
8b80: 20 20 20 20 6c 65 74 20 6d 75 74 20 6f 72 69 67      let mut orig
8b90: 20 3d 20 48 61 73 68 53 65 74 3a 3a 77 69 74 68   = HashSet::with
8ba0: 5f 63 61 70 61 63 69 74 79 28 32 29 3b 0a 20 20  _capacity(2);.  
8bb0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 5f 20            let _ 
8bc0: 3d 20 6f 72 69 67 2e 69 6e 73 65 72 74 28 2a 75  = orig.insert(*u
8bd0: 6e 77 72 61 70 21 28 6f 62 6a 65 63 74 5f 63 61  nwrap!(object_ca
8be0: 63 68 65 2e 67 65 74 5f 64 61 74 61 5f 69 64 28  che.get_data_id(
8bf0: 69 6d 6d 75 74 5f 69 64 5f 30 5f 68 29 29 29 3b  immut_id_0_h)));
8c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
8c10: 20 5f 20 3d 20 6f 72 69 67 2e 69 6e 73 65 72 74   _ = orig.insert
8c20: 28 2a 75 6e 77 72 61 70 21 28 6f 62 6a 65 63 74  (*unwrap!(object
8c30: 5f 63 61 63 68 65 2e 67 65 74 5f 64 61 74 61 5f  _cache.get_data_
8c40: 69 64 28 69 6d 6d 75 74 5f 69 64 5f 31 5f 68 29  id(immut_id_1_h)
8c50: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  ));..           
8c60: 20 6c 65 74 20 6d 75 74 20 67 6f 74 20 3d 20 48   let mut got = H
8c70: 61 73 68 53 65 74 3a 3a 77 69 74 68 5f 63 61 70  ashSet::with_cap
8c80: 61 63 69 74 79 28 32 29 3b 0a 20 20 20 20 20 20  acity(2);.      
8c90: 20 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 67 6f        let _ = go
8ca0: 74 2e 69 6e 73 65 72 74 28 2a 75 6e 77 72 61 70  t.insert(*unwrap
8cb0: 21 28 6f 62 6a 65 63 74 5f 63 61 63 68 65 2e 67  !(object_cache.g
8cc0: 65 74 5f 64 61 74 61 5f 69 64 28 67 6f 74 5f 69  et_data_id(got_i
8cd0: 6d 6d 75 74 5f 69 64 5f 30 5f 68 29 29 29 3b 0a  mmut_id_0_h)));.
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
8cf0: 5f 20 3d 20 67 6f 74 2e 69 6e 73 65 72 74 28 2a  _ = got.insert(*
8d00: 75 6e 77 72 61 70 21 28 6f 62 6a 65 63 74 5f 63  unwrap!(object_c
8d10: 61 63 68 65 2e 67 65 74 5f 64 61 74 61 5f 69 64  ache.get_data_id
8d20: 28 67 6f 74 5f 69 6d 6d 75 74 5f 69 64 5f 31 5f  (got_immut_id_1_
8d30: 68 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  h)));..         
8d40: 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 6f 72     assert_eq!(or
8d50: 69 67 2c 20 67 6f 74 29 3b 0a 20 20 20 20 20 20  ig, got);.      
8d60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23    }.    }..    #
8d70: 5b 74 65 73 74 5d 0a 20 20 20 20 66 6e 20 66 69  [test].    fn fi
8d80: 6c 74 65 72 28 29 20 7b 0a 20 20 20 20 20 20 20  lter() {.       
8d90: 20 6c 65 74 20 61 70 70 30 20 3d 20 74 65 73 74   let app0 = test
8da0: 5f 75 74 69 6c 73 3a 3a 63 72 65 61 74 65 5f 61  _utils::create_a
8db0: 70 70 28 66 61 6c 73 65 29 3b 0a 20 20 20 20 20  pp(false);.     
8dc0: 20 20 20 6c 65 74 20 61 70 70 31 20 3d 20 74 65     let app1 = te
8dd0: 73 74 5f 75 74 69 6c 73 3a 3a 63 72 65 61 74 65  st_utils::create
8de0: 5f 61 70 70 28 66 61 6c 73 65 29 3b 0a 20 20 20  _app(false);.   
8df0: 20 20 20 20 20 6c 65 74 20 61 70 70 32 20 3d 20       let app2 = 
8e00: 74 65 73 74 5f 75 74 69 6c 73 3a 3a 63 72 65 61  test_utils::crea
8e10: 74 65 5f 61 70 70 28 66 61 6c 73 65 29 3b 0a 0a  te_app(false);..
8e20: 20 20 20 20 20 20 20 20 6c 65 74 20 28 73 69 67          let (sig
8e30: 6e 5f 6b 65 79 31 5f 68 2c 20 5f 73 69 67 6e 5f  n_key1_h, _sign_
8e40: 6b 65 79 32 5f 68 29 20 3d 20 7b 0a 20 20 20 20  key2_h) = {.    
8e50: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20          let mut 
8e60: 6f 62 6a 65 63 74 5f 63 61 63 68 65 20 3d 20 75  object_cache = u
8e70: 6e 77 72 61 70 21 28 6f 62 6a 65 63 74 5f 63 61  nwrap!(object_ca
8e80: 63 68 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20  che());.        
8e90: 20 20 20 20 28 6f 62 6a 65 63 74 5f 63 61 63 68      (object_cach
8ea0: 65 2e 69 6e 73 65 72 74 5f 73 69 67 6e 5f 6b 65  e.insert_sign_ke
8eb0: 79 28 67 65 74 5f 73 69 67 6e 5f 70 6b 28 26 61  y(get_sign_pk(&a
8ec0: 70 70 31 29 29 2c 0a 20 20 20 20 20 20 20 20 20  pp1)),.         
8ed0: 20 20 20 20 6f 62 6a 65 63 74 5f 63 61 63 68 65      object_cache
8ee0: 2e 69 6e 73 65 72 74 5f 73 69 67 6e 5f 6b 65 79  .insert_sign_key
8ef0: 28 67 65 74 5f 73 69 67 6e 5f 70 6b 28 26 61 70  (get_sign_pk(&ap
8f00: 70 32 29 29 29 0a 20 20 20 20 20 20 20 20 7d 3b  p2))).        };
8f10: 0a 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 64  ..        let ad
8f20: 5f 6e 61 6d 65 20 3d 20 72 61 6e 64 3a 3a 72 61  _name = rand::ra
8f30: 6e 64 6f 6d 28 29 3b 0a 20 20 20 20 20 20 20 20  ndom();.        
8f40: 6c 65 74 20 6d 75 74 20 61 64 5f 68 3a 20 41 70  let mut ad_h: Ap
8f50: 70 65 6e 64 61 62 6c 65 44 61 74 61 48 61 6e 64  pendableDataHand
8f60: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
8f70: 6c 65 74 20 6d 75 74 20 61 64 5f 69 64 5f 68 3a  let mut ad_id_h:
8f80: 20 44 61 74 61 49 64 48 61 6e 64 6c 65 20 3d 20   DataIdHandle = 
8f90: 30 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d  0;.        let m
8fa0: 75 74 20 66 69 6c 74 65 72 5f 74 79 70 65 20 3d  ut filter_type =
8fb0: 20 46 69 6c 74 65 72 54 79 70 65 3a 3a 42 6c 61   FilterType::Bla
8fc0: 63 6b 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  ckList;..       
8fd0: 20 6c 65 74 20 28 5f 2c 20 69 6d 6d 75 74 5f 69   let (_, immut_i
8fe0: 64 5f 31 5f 68 29 20 3d 20 67 65 6e 65 72 61 74  d_1_h) = generat
8ff0: 65 5f 72 61 6e 64 6f 6d 5f 69 6d 6d 75 74 61 62  e_random_immutab
9000: 6c 65 5f 64 61 74 61 5f 69 64 28 29 3b 0a 20 20  le_data_id();.  
9010: 20 20 20 20 20 20 6c 65 74 20 28 5f 2c 20 69 6d        let (_, im
9020: 6d 75 74 5f 69 64 5f 32 5f 68 29 20 3d 20 67 65  mut_id_2_h) = ge
9030: 6e 65 72 61 74 65 5f 72 61 6e 64 6f 6d 5f 69 6d  nerate_random_im
9040: 6d 75 74 61 62 6c 65 5f 64 61 74 61 5f 69 64 28  mutable_data_id(
9050: 29 3b 0a 0a 20 20 20 20 20 20 20 20 75 6e 73 61  );..        unsa
9060: 66 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  fe {.           
9070: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
9080: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 6e 65 77 5f  ndable_data_new_
9090: 70 75 62 28 26 61 70 70 30 2c 20 26 61 64 5f 6e  pub(&app0, &ad_n
90a0: 61 6d 65 2c 20 26 6d 75 74 20 61 64 5f 68 29 2c  ame, &mut ad_h),
90b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
90c0: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
90d0: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 65 78 74 72  ndable_data_extr
90e0: 61 63 74 5f 64 61 74 61 5f 69 64 28 61 64 5f 68  act_data_id(ad_h
90f0: 2c 20 26 6d 75 74 20 61 64 5f 69 64 5f 68 29 2c  , &mut ad_id_h),
9100: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
9110: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
9120: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 70 75 74 28  ndable_data_put(
9130: 26 61 70 70 30 2c 20 61 64 5f 68 29 2c 20 30 29  &app0, ad_h), 0)
9140: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
9150: 2f 20 41 6e 79 6f 6e 65 20 63 61 6e 20 61 70 70  / Anyone can app
9160: 65 6e 64 20 62 79 20 64 65 66 61 75 6c 74 0a 20  end by default. 
9170: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
9180: 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65  t_eq!(appendable
9190: 5f 64 61 74 61 5f 61 70 70 65 6e 64 28 26 61 70  _data_append(&ap
91a0: 70 31 2c 20 61 64 5f 68 2c 20 69 6d 6d 75 74 5f  p1, ad_h, immut_
91b0: 69 64 5f 31 5f 68 29 2c 20 30 29 3b 0a 20 20 20  id_1_h), 0);.   
91c0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
91d0: 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  eq!(appendable_d
91e0: 61 74 61 5f 61 70 70 65 6e 64 28 26 61 70 70 32  ata_append(&app2
91f0: 2c 20 61 64 5f 68 2c 20 69 6d 6d 75 74 5f 69 64  , ad_h, immut_id
9200: 5f 32 5f 68 29 2c 20 30 29 3b 0a 20 20 20 20 20  _2_h), 0);.     
9210: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f     }..        //
9220: 20 53 65 74 20 62 6c 61 63 6b 6c 69 73 74 0a 20   Set blacklist. 
9230: 20 20 20 20 20 20 20 6c 65 74 20 28 5f 2c 20 69         let (_, i
9240: 6d 6d 75 74 5f 69 64 5f 31 5f 68 29 20 3d 20 67  mmut_id_1_h) = g
9250: 65 6e 65 72 61 74 65 5f 72 61 6e 64 6f 6d 5f 69  enerate_random_i
9260: 6d 6d 75 74 61 62 6c 65 5f 64 61 74 61 5f 69 64  mmutable_data_id
9270: 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ();.        let 
9280: 28 5f 2c 20 69 6d 6d 75 74 5f 69 64 5f 32 5f 68  (_, immut_id_2_h
9290: 29 20 3d 20 67 65 6e 65 72 61 74 65 5f 72 61 6e  ) = generate_ran
92a0: 64 6f 6d 5f 69 6d 6d 75 74 61 62 6c 65 5f 64 61  dom_immutable_da
92b0: 74 61 5f 69 64 28 29 3b 0a 0a 0a 20 20 20 20 20  ta_id();...     
92c0: 20 20 20 75 6e 73 61 66 65 20 7b 0a 20 20 20 20     unsafe {.    
92d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
92e0: 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  q!(appendable_da
92f0: 74 61 5f 66 69 6c 74 65 72 5f 74 79 70 65 28 61  ta_filter_type(a
9300: 64 5f 68 2c 20 26 6d 75 74 20 66 69 6c 74 65 72  d_h, &mut filter
9310: 5f 74 79 70 65 29 2c 20 30 29 3b 0a 20 20 20 20  _type), 0);.    
9320: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
9330: 71 21 28 66 69 6c 74 65 72 5f 74 79 70 65 2c 20  q!(filter_type, 
9340: 46 69 6c 74 65 72 54 79 70 65 3a 3a 42 6c 61 63  FilterType::Blac
9350: 6b 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 20  kList);..       
9360: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
9370: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
9380: 69 6e 73 65 72 74 5f 74 6f 5f 66 69 6c 74 65 72  insert_to_filter
9390: 28 61 64 5f 68 2c 20 73 69 67 6e 5f 6b 65 79 31  (ad_h, sign_key1
93a0: 5f 68 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  _h), 0);.       
93b0: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
93c0: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
93d0: 70 6f 73 74 28 26 61 70 70 30 2c 20 61 64 5f 68  post(&app0, ad_h
93e0: 2c 20 66 61 6c 73 65 29 2c 20 30 29 3b 0a 0a 20  , false), 0);.. 
93f0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
9400: 74 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  t!(appendable_da
9410: 74 61 5f 61 70 70 65 6e 64 28 26 61 70 70 31 2c  ta_append(&app1,
9420: 20 61 64 5f 68 2c 20 69 6d 6d 75 74 5f 69 64 5f   ad_h, immut_id_
9430: 31 5f 68 29 20 21 3d 20 30 29 3b 0a 20 20 20 20  1_h) != 0);.    
9440: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
9450: 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  q!(appendable_da
9460: 74 61 5f 61 70 70 65 6e 64 28 26 61 70 70 32 2c  ta_append(&app2,
9470: 20 61 64 5f 68 2c 20 69 6d 6d 75 74 5f 69 64 5f   ad_h, immut_id_
9480: 32 5f 68 29 2c 20 30 29 3b 0a 0a 20 20 20 20 20  2_h), 0);..     
9490: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
94a0: 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  !(appendable_dat
94b0: 61 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 66 69  a_remove_from_fi
94c0: 6c 74 65 72 28 61 64 5f 68 2c 20 73 69 67 6e 5f  lter(ad_h, sign_
94d0: 6b 65 79 31 5f 68 29 2c 20 30 29 3b 0a 20 20 20  key1_h), 0);.   
94e0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
94f0: 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  eq!(appendable_d
9500: 61 74 61 5f 70 6f 73 74 28 26 61 70 70 30 2c 20  ata_post(&app0, 
9510: 61 64 5f 68 2c 20 66 61 6c 73 65 29 2c 20 30 29  ad_h, false), 0)
9520: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
9530: 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61  sert_eq!(appenda
9540: 62 6c 65 5f 64 61 74 61 5f 61 70 70 65 6e 64 28  ble_data_append(
9550: 26 61 70 70 31 2c 20 61 64 5f 68 2c 20 69 6d 6d  &app1, ad_h, imm
9560: 75 74 5f 69 64 5f 31 5f 68 29 2c 20 30 29 3b 0a  ut_id_1_h), 0);.
9570: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
9580: 20 20 20 2f 2f 20 53 65 74 20 77 68 69 74 65 6c     // Set whitel
9590: 69 73 74 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ist.        let 
95a0: 28 5f 2c 20 69 6d 6d 75 74 5f 69 64 5f 31 5f 68  (_, immut_id_1_h
95b0: 29 20 3d 20 67 65 6e 65 72 61 74 65 5f 72 61 6e  ) = generate_ran
95c0: 64 6f 6d 5f 69 6d 6d 75 74 61 62 6c 65 5f 64 61  dom_immutable_da
95d0: 74 61 5f 69 64 28 29 3b 0a 20 20 20 20 20 20 20  ta_id();.       
95e0: 20 6c 65 74 20 28 5f 2c 20 69 6d 6d 75 74 5f 69   let (_, immut_i
95f0: 64 5f 32 5f 68 29 20 3d 20 67 65 6e 65 72 61 74  d_2_h) = generat
9600: 65 5f 72 61 6e 64 6f 6d 5f 69 6d 6d 75 74 61 62  e_random_immutab
9610: 6c 65 5f 64 61 74 61 5f 69 64 28 29 3b 0a 0a 20  le_data_id();.. 
9620: 20 20 20 20 20 20 20 75 6e 73 61 66 65 20 7b 0a         unsafe {.
9630: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
9640: 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c  rt_eq!(appendabl
9650: 65 5f 64 61 74 61 5f 74 6f 67 67 6c 65 5f 66 69  e_data_toggle_fi
9660: 6c 74 65 72 28 61 64 5f 68 29 2c 20 30 29 3b 0a  lter(ad_h), 0);.
9670: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
9680: 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c  rt_eq!(appendabl
9690: 65 5f 64 61 74 61 5f 66 69 6c 74 65 72 5f 74 79  e_data_filter_ty
96a0: 70 65 28 61 64 5f 68 2c 20 26 6d 75 74 20 66 69  pe(ad_h, &mut fi
96b0: 6c 74 65 72 5f 74 79 70 65 29 2c 20 30 29 3b 0a  lter_type), 0);.
96c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
96d0: 65 72 74 5f 65 71 21 28 66 69 6c 74 65 72 5f 74  ert_eq!(filter_t
96e0: 79 70 65 2c 20 46 69 6c 74 65 72 54 79 70 65 3a  ype, FilterType:
96f0: 3a 57 68 69 74 65 4c 69 73 74 29 3b 0a 20 20 20  :WhiteList);.   
9700: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
9710: 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  eq!(appendable_d
9720: 61 74 61 5f 69 6e 73 65 72 74 5f 74 6f 5f 66 69  ata_insert_to_fi
9730: 6c 74 65 72 28 61 64 5f 68 2c 20 73 69 67 6e 5f  lter(ad_h, sign_
9740: 6b 65 79 31 5f 68 29 2c 20 30 29 3b 0a 20 20 20  key1_h), 0);.   
9750: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
9760: 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  eq!(appendable_d
9770: 61 74 61 5f 70 6f 73 74 28 26 61 70 70 30 2c 20  ata_post(&app0, 
9780: 61 64 5f 68 2c 20 66 61 6c 73 65 29 2c 20 30 29  ad_h, false), 0)
9790: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ;..            a
97a0: 73 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64  ssert_eq!(append
97b0: 61 62 6c 65 5f 64 61 74 61 5f 61 70 70 65 6e 64  able_data_append
97c0: 28 26 61 70 70 31 2c 20 61 64 5f 68 2c 20 69 6d  (&app1, ad_h, im
97d0: 6d 75 74 5f 69 64 5f 31 5f 68 29 2c 20 30 29 3b  mut_id_1_h), 0);
97e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
97f0: 65 72 74 21 28 61 70 70 65 6e 64 61 62 6c 65 5f  ert!(appendable_
9800: 64 61 74 61 5f 61 70 70 65 6e 64 28 26 61 70 70  data_append(&app
9810: 32 2c 20 61 64 5f 68 2c 20 69 6d 6d 75 74 5f 69  2, ad_h, immut_i
9820: 64 5f 32 5f 68 29 20 21 3d 20 30 29 3b 0a 0a 20  d_2_h) != 0);.. 
9830: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
9840: 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65  t_eq!(appendable
9850: 5f 64 61 74 61 5f 72 65 6d 6f 76 65 5f 66 72 6f  _data_remove_fro
9860: 6d 5f 66 69 6c 74 65 72 28 61 64 5f 68 2c 20 73  m_filter(ad_h, s
9870: 69 67 6e 5f 6b 65 79 31 5f 68 29 2c 20 30 29 3b  ign_key1_h), 0);
9880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
9890: 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62  ert_eq!(appendab
98a0: 6c 65 5f 64 61 74 61 5f 70 6f 73 74 28 26 61 70  le_data_post(&ap
98b0: 70 30 2c 20 61 64 5f 68 2c 20 66 61 6c 73 65 29  p0, ad_h, false)
98c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
98d0: 20 20 61 73 73 65 72 74 21 28 61 70 70 65 6e 64    assert!(append
98e0: 61 62 6c 65 5f 64 61 74 61 5f 61 70 70 65 6e 64  able_data_append
98f0: 28 26 61 70 70 31 2c 20 61 64 5f 68 2c 20 69 6d  (&app1, ad_h, im
9900: 6d 75 74 5f 69 64 5f 31 5f 68 29 20 21 3d 20 30  mut_id_1_h) != 0
9910: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
9920: 2f 2f 20 54 6f 67 67 6c 65 20 66 69 6c 74 65 72  // Toggle filter
9930: 20 61 6e 64 20 65 6e 73 75 72 65 20 69 74 27 73   and ensure it's
9940: 20 62 6c 61 63 6b 6c 69 73 74 20 61 67 61 69 6e   blacklist again
9950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
9960: 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62  ert_eq!(appendab
9970: 6c 65 5f 64 61 74 61 5f 74 6f 67 67 6c 65 5f 66  le_data_toggle_f
9980: 69 6c 74 65 72 28 61 64 5f 68 29 2c 20 30 29 3b  ilter(ad_h), 0);
9990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
99a0: 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62  ert_eq!(appendab
99b0: 6c 65 5f 64 61 74 61 5f 66 69 6c 74 65 72 5f 74  le_data_filter_t
99c0: 79 70 65 28 61 64 5f 68 2c 20 26 6d 75 74 20 66  ype(ad_h, &mut f
99d0: 69 6c 74 65 72 5f 74 79 70 65 29 2c 20 30 29 3b  ilter_type), 0);
99e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
99f0: 65 72 74 5f 65 71 21 28 66 69 6c 74 65 72 5f 74  ert_eq!(filter_t
9a00: 79 70 65 2c 20 46 69 6c 74 65 72 54 79 70 65 3a  ype, FilterType:
9a10: 3a 42 6c 61 63 6b 4c 69 73 74 29 3b 0a 20 20 20  :BlackList);.   
9a20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9a30: 20 20 23 5b 74 65 73 74 5d 0a 20 20 20 20 66 6e    #[test].    fn
9a40: 20 70 72 69 76 5f 61 70 70 65 6e 64 61 62 6c 65   priv_appendable
9a50: 5f 64 61 74 61 28 29 20 7b 0a 20 20 20 20 20 20  _data() {.      
9a60: 20 20 6c 65 74 20 61 70 70 30 20 3d 20 74 65 73    let app0 = tes
9a70: 74 5f 75 74 69 6c 73 3a 3a 63 72 65 61 74 65 5f  t_utils::create_
9a80: 61 70 70 28 66 61 6c 73 65 29 3b 0a 20 20 20 20  app(false);.    
9a90: 20 20 20 20 6c 65 74 20 61 70 70 31 20 3d 20 74      let app1 = t
9aa0: 65 73 74 5f 75 74 69 6c 73 3a 3a 63 72 65 61 74  est_utils::creat
9ab0: 65 5f 61 70 70 28 66 61 6c 73 65 29 3b 0a 20 20  e_app(false);.  
9ac0: 20 20 20 20 20 20 6c 65 74 20 61 70 70 32 20 3d        let app2 =
9ad0: 20 74 65 73 74 5f 75 74 69 6c 73 3a 3a 63 72 65   test_utils::cre
9ae0: 61 74 65 5f 61 70 70 28 66 61 6c 73 65 29 3b 0a  ate_app(false);.
9af0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 64 5f  .        let ad_
9b00: 6e 61 6d 65 20 3d 20 72 61 6e 64 3a 3a 72 61 6e  name = rand::ran
9b10: 64 6f 6d 28 29 3b 0a 20 20 20 20 20 20 20 20 6c  dom();.        l
9b20: 65 74 20 6d 75 74 20 61 64 5f 70 72 69 76 5f 68  et mut ad_priv_h
9b30: 3a 20 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61  : AppendableData
9b40: 48 61 6e 64 6c 65 20 3d 20 30 3b 0a 20 20 20 20  Handle = 0;.    
9b50: 20 20 20 20 6c 65 74 20 6d 75 74 20 61 64 5f 69      let mut ad_i
9b60: 64 5f 68 3a 20 44 61 74 61 49 64 48 61 6e 64 6c  d_h: DataIdHandl
9b70: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  e = 0;..        
9b80: 2f 2f 20 44 61 74 61 20 74 6f 20 61 70 70 65 6e  // Data to appen
9b90: 64 0a 20 20 20 20 20 20 20 20 6c 65 74 20 28 5f  d.        let (_
9ba0: 2c 20 69 6d 6d 75 74 5f 69 64 5f 30 5f 68 29 20  , immut_id_0_h) 
9bb0: 3d 20 67 65 6e 65 72 61 74 65 5f 72 61 6e 64 6f  = generate_rando
9bc0: 6d 5f 69 6d 6d 75 74 61 62 6c 65 5f 64 61 74 61  m_immutable_data
9bd0: 5f 69 64 28 29 3b 0a 20 20 20 20 20 20 20 20 6c  _id();.        l
9be0: 65 74 20 28 5f 2c 20 69 6d 6d 75 74 5f 69 64 5f  et (_, immut_id_
9bf0: 31 5f 68 29 20 3d 20 67 65 6e 65 72 61 74 65 5f  1_h) = generate_
9c00: 72 61 6e 64 6f 6d 5f 69 6d 6d 75 74 61 62 6c 65  random_immutable
9c10: 5f 64 61 74 61 5f 69 64 28 29 3b 0a 0a 20 20 20  _data_id();..   
9c20: 20 20 20 20 20 2f 2f 20 47 65 6e 65 72 61 74 65       // Generate
9c30: 20 6b 65 79 73 20 66 6f 72 20 65 78 74 72 61 20   keys for extra 
9c40: 74 65 73 74 20 61 70 70 73 0a 20 20 20 20 20 20  test apps.      
9c50: 20 20 6c 65 74 20 28 73 69 67 6e 5f 6b 65 79 31    let (sign_key1
9c60: 5f 68 2c 20 73 69 67 6e 5f 6b 65 79 32 5f 68 29  _h, sign_key2_h)
9c70: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
9c80: 20 6c 65 74 20 6d 75 74 20 6f 62 6a 65 63 74 5f   let mut object_
9c90: 63 61 63 68 65 20 3d 20 75 6e 77 72 61 70 21 28  cache = unwrap!(
9ca0: 6f 62 6a 65 63 74 5f 63 61 63 68 65 28 29 29 3b  object_cache());
9cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 62  .            (ob
9cc0: 6a 65 63 74 5f 63 61 63 68 65 2e 69 6e 73 65 72  ject_cache.inser
9cd0: 74 5f 73 69 67 6e 5f 6b 65 79 28 67 65 74 5f 73  t_sign_key(get_s
9ce0: 69 67 6e 5f 70 6b 28 26 61 70 70 31 29 29 2c 0a  ign_pk(&app1)),.
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
9d00: 65 63 74 5f 63 61 63 68 65 2e 69 6e 73 65 72 74  ect_cache.insert
9d10: 5f 73 69 67 6e 5f 6b 65 79 28 67 65 74 5f 73 69  _sign_key(get_si
9d20: 67 6e 5f 70 6b 28 26 61 70 70 32 29 29 29 0a 20  gn_pk(&app2))). 
9d30: 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
9d40: 20 20 20 6c 65 74 20 6d 75 74 20 67 6f 74 5f 69     let mut got_i
9d50: 6d 6d 75 74 5f 69 64 5f 30 5f 68 3a 20 44 61 74  mmut_id_0_h: Dat
9d60: 61 49 64 48 61 6e 64 6c 65 20 3d 20 30 3b 0a 20  aIdHandle = 0;. 
9d70: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 67         let mut g
9d80: 6f 74 5f 69 6d 6d 75 74 5f 69 64 5f 31 5f 68 3a  ot_immut_id_1_h:
9d90: 20 44 61 74 61 49 64 48 61 6e 64 6c 65 20 3d 20   DataIdHandle = 
9da0: 30 3b 0a 0a 20 20 20 20 20 20 20 20 75 6e 73 61  0;..        unsa
9db0: 66 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  fe {.           
9dc0: 20 2f 2f 20 43 72 65 61 74 65 0a 20 20 20 20 20   // Create.     
9dd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
9de0: 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  !(appendable_dat
9df0: 61 5f 6e 65 77 5f 70 72 69 76 28 26 61 70 70 30  a_new_priv(&app0
9e00: 2c 20 26 61 64 5f 6e 61 6d 65 2c 20 26 6d 75 74  , &ad_name, &mut
9e10: 20 61 64 5f 70 72 69 76 5f 68 29 2c 20 30 29 3b   ad_priv_h), 0);
9e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
9e30: 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62  ert_eq!(appendab
9e40: 6c 65 5f 64 61 74 61 5f 65 78 74 72 61 63 74 5f  le_data_extract_
9e50: 64 61 74 61 5f 69 64 28 61 64 5f 70 72 69 76 5f  data_id(ad_priv_
9e60: 68 2c 20 26 6d 75 74 20 61 64 5f 69 64 5f 68 29  h, &mut ad_id_h)
9e70: 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  , 0);..         
9e80: 20 20 20 2f 2f 20 54 65 73 74 20 50 55 54 20 72     // Test PUT r
9e90: 65 71 75 65 73 74 73 20 66 6f 72 20 70 72 69 76  equests for priv
9ea0: 61 74 65 20 64 61 74 61 0a 20 20 20 20 20 20 20  ate data.       
9eb0: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
9ec0: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
9ed0: 70 75 74 28 26 61 70 70 30 2c 20 61 64 5f 70 72  put(&app0, ad_pr
9ee0: 69 76 5f 68 29 2c 20 30 29 3b 0a 20 20 20 20 20  iv_h), 0);.     
9ef0: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
9f00: 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  !(appendable_dat
9f10: 61 5f 61 70 70 65 6e 64 28 26 61 70 70 30 2c 20  a_append(&app0, 
9f20: 61 64 5f 70 72 69 76 5f 68 2c 20 69 6d 6d 75 74  ad_priv_h, immut
9f30: 5f 69 64 5f 30 5f 68 29 2c 20 30 29 3b 0a 20 20  _id_0_h), 0);.  
9f40: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
9f50: 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f  _eq!(appendable_
9f60: 64 61 74 61 5f 61 70 70 65 6e 64 28 26 61 70 70  data_append(&app
9f70: 30 2c 20 61 64 5f 70 72 69 76 5f 68 2c 20 69 6d  0, ad_priv_h, im
9f80: 6d 75 74 5f 69 64 5f 31 5f 68 29 2c 20 30 29 3b  mut_id_1_h), 0);
9f90: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
9fa0: 6c 6f 61 64 5f 61 64 28 26 61 70 70 30 2c 20 61  load_ad(&app0, a
9fb0: 64 5f 69 64 5f 68 2c 20 26 6d 75 74 20 61 64 5f  d_id_h, &mut ad_
9fc0: 70 72 69 76 5f 68 29 3b 0a 20 20 20 20 20 20 20  priv_h);.       
9fd0: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 75 6d 5f       assert_num_
9fe0: 6f 66 5f 64 61 74 61 21 28 61 64 5f 70 72 69 76  of_data!(ad_priv
9ff0: 5f 68 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20  _h, 2);..       
a000: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
a010: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
a020: 6e 74 68 5f 64 61 74 61 5f 69 64 28 26 61 70 70  nth_data_id(&app
a030: 30 2c 20 61 64 5f 70 72 69 76 5f 68 2c 20 30 2c  0, ad_priv_h, 0,
a040: 20 26 6d 75 74 20 67 6f 74 5f 69 6d 6d 75 74 5f   &mut got_immut_
a050: 69 64 5f 30 5f 68 29 2c 0a 20 20 20 20 20 20 20  id_0_h),.       
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a070: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
a080: 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e  assert_eq!(appen
a090: 64 61 62 6c 65 5f 64 61 74 61 5f 6e 74 68 5f 64  dable_data_nth_d
a0a0: 61 74 61 5f 69 64 28 26 61 70 70 30 2c 20 61 64  ata_id(&app0, ad
a0b0: 5f 70 72 69 76 5f 68 2c 20 31 2c 20 26 6d 75 74  _priv_h, 1, &mut
a0c0: 20 67 6f 74 5f 69 6d 6d 75 74 5f 69 64 5f 31 5f   got_immut_id_1_
a0d0: 68 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  h),.            
a0e0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 0a             0);..
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43              // C
a100: 68 65 63 6b 20 6f 77 6e 65 72 73 20 6f 66 20 61  heck owners of a
a110: 70 70 65 6e 64 61 62 6c 65 20 64 61 74 61 0a 20  ppendable data. 
a120: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d             let m
a130: 75 74 20 69 73 5f 6f 77 6e 65 72 20 3d 20 66 61  ut is_owner = fa
a140: 6c 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
a150: 20 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70    assert_eq!(app
a160: 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 69 73 5f  endable_data_is_
a170: 6f 77 6e 65 64 28 26 61 70 70 30 2c 20 61 64 5f  owned(&app0, ad_
a180: 70 72 69 76 5f 68 2c 20 26 6d 75 74 20 69 73 5f  priv_h, &mut is_
a190: 6f 77 6e 65 72 29 2c 20 30 29 3b 0a 20 20 20 20  owner), 0);.    
a1a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
a1b0: 71 21 28 69 73 5f 6f 77 6e 65 72 2c 20 74 72 75  q!(is_owner, tru
a1c0: 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
a1d0: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
a1e0: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 69 73 5f 6f  ndable_data_is_o
a1f0: 77 6e 65 64 28 26 61 70 70 31 2c 20 61 64 5f 70  wned(&app1, ad_p
a200: 72 69 76 5f 68 2c 20 26 6d 75 74 20 69 73 5f 6f  riv_h, &mut is_o
a210: 77 6e 65 72 29 2c 20 30 29 3b 0a 20 20 20 20 20  wner), 0);.     
a220: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
a230: 21 28 69 73 5f 6f 77 6e 65 72 2c 20 66 61 6c 73  !(is_owner, fals
a240: 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
a250: 20 2f 2f 20 44 65 6c 65 74 65 20 61 6e 64 20 72   // Delete and r
a260: 65 73 74 6f 72 65 20 70 72 69 76 61 74 65 20 61  estore private a
a270: 70 70 65 6e 64 61 62 6c 65 20 64 61 74 61 0a 20  ppendable data. 
a280: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
a290: 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65  t_eq!(appendable
a2a0: 5f 64 61 74 61 5f 72 65 6d 6f 76 65 5f 6e 74 68  _data_remove_nth
a2b0: 5f 64 61 74 61 28 61 64 5f 70 72 69 76 5f 68 2c  _data(ad_priv_h,
a2c0: 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   0), 0);.       
a2d0: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
a2e0: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
a2f0: 70 6f 73 74 28 26 61 70 70 30 2c 20 61 64 5f 70  post(&app0, ad_p
a300: 72 69 76 5f 68 2c 20 74 72 75 65 29 2c 20 30 29  riv_h, true), 0)
a310: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
a320: 65 6c 6f 61 64 5f 61 64 28 26 61 70 70 30 2c 20  eload_ad(&app0, 
a330: 61 64 5f 69 64 5f 68 2c 20 26 6d 75 74 20 61 64  ad_id_h, &mut ad
a340: 5f 70 72 69 76 5f 68 29 3b 0a 20 20 20 20 20 20  _priv_h);.      
a350: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 75 6d        assert_num
a360: 5f 6f 66 5f 64 61 74 61 21 28 61 64 5f 70 72 69  _of_data!(ad_pri
a370: 76 5f 68 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  v_h, 1);.       
a380: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 75 6d 5f       assert_num_
a390: 6f 66 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 21  of_deleted_data!
a3a0: 28 61 64 5f 70 72 69 76 5f 68 2c 20 31 29 3b 0a  (ad_priv_h, 1);.
a3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
a3c0: 20 6d 75 74 20 64 65 6c 65 74 65 64 5f 64 61 74   mut deleted_dat
a3d0: 61 5f 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  a_h = 0;.       
a3e0: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
a3f0: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
a400: 6e 74 68 5f 64 65 6c 65 74 65 64 5f 64 61 74 61  nth_deleted_data
a410: 5f 69 64 28 26 61 70 70 30 2c 0a 20 20 20 20 20  _id(&app0,.     
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 20 20 20 20 20 61 64 5f 70 72 69 76 5f 68 2c        ad_priv_h,
a460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 20 20 20 20 20 20 20 20 20 26 6d 75 74 20 64            &mut d
a4e0: 65 6c 65 74 65 64 5f 64 61 74 61 5f 68 29 2c 0a  eleted_data_h),.
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 20 20 20 20 20 30 29 3b 0a 0a 20 20 20 20         0);..    
a510: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
a520: 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  q!(appendable_da
a530: 74 61 5f 72 65 73 74 6f 72 65 5f 6e 74 68 5f 64  ta_restore_nth_d
a540: 65 6c 65 74 65 64 5f 64 61 74 61 28 61 64 5f 70  eleted_data(ad_p
a550: 72 69 76 5f 68 2c 20 30 29 2c 20 30 29 3b 0a 20  riv_h, 0), 0);. 
a560: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
a570: 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65  t_eq!(appendable
a580: 5f 64 61 74 61 5f 70 6f 73 74 28 26 61 70 70 30  _data_post(&app0
a590: 2c 20 61 64 5f 70 72 69 76 5f 68 2c 20 74 72 75  , ad_priv_h, tru
a5a0: 65 29 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 20  e), 0);..       
a5b0: 20 20 20 20 20 72 65 6c 6f 61 64 5f 61 64 28 26       reload_ad(&
a5c0: 61 70 70 30 2c 20 61 64 5f 69 64 5f 68 2c 20 26  app0, ad_id_h, &
a5d0: 6d 75 74 20 61 64 5f 70 72 69 76 5f 68 29 3b 0a  mut ad_priv_h);.
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
a5f0: 72 74 5f 6e 75 6d 5f 6f 66 5f 64 61 74 61 21 28  rt_num_of_data!(
a600: 61 64 5f 70 72 69 76 5f 68 2c 20 32 29 3b 0a 20  ad_priv_h, 2);. 
a610: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
a620: 74 5f 6e 75 6d 5f 6f 66 5f 64 65 6c 65 74 65 64  t_num_of_deleted
a630: 5f 64 61 74 61 21 28 61 64 5f 70 72 69 76 5f 68  _data!(ad_priv_h
a640: 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  , 0);..         
a650: 20 20 20 2f 2f 20 4f 74 68 65 72 20 61 70 70 73     // Other apps
a660: 20 63 61 6e 20 61 70 70 65 6e 64 20 6e 65 77 20   can append new 
a670: 64 61 74 61 0a 20 20 20 20 20 20 20 20 20 20 20  data.           
a680: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
a690: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 61 70 70 65  ndable_data_appe
a6a0: 6e 64 28 26 61 70 70 31 2c 20 61 64 5f 70 72 69  nd(&app1, ad_pri
a6b0: 76 5f 68 2c 20 69 6d 6d 75 74 5f 69 64 5f 30 5f  v_h, immut_id_0_
a6c0: 68 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  h), 0);.        
a6d0: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61      assert_eq!(a
a6e0: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 61  ppendable_data_a
a6f0: 70 70 65 6e 64 28 26 61 70 70 32 2c 20 61 64 5f  ppend(&app2, ad_
a700: 70 72 69 76 5f 68 2c 20 69 6d 6d 75 74 5f 69 64  priv_h, immut_id
a710: 5f 31 5f 68 29 2c 20 30 29 3b 0a 0a 20 20 20 20  _1_h), 0);..    
a720: 20 20 20 20 20 20 20 20 2f 2f 20 43 68 65 63 6b          // Check
a730: 20 62 6c 61 63 6b 6c 69 73 74 20 66 69 6c 74 65   blacklist filte
a740: 72 20 66 6f 72 20 70 72 69 76 61 74 65 20 61 70  r for private ap
a750: 70 65 6e 64 61 62 6c 65 20 64 61 74 61 0a 20 20  pendable data.  
a760: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75            let mu
a770: 74 20 66 69 6c 74 65 72 5f 74 79 70 65 20 3d 20  t filter_type = 
a780: 46 69 6c 74 65 72 54 79 70 65 3a 3a 42 6c 61 63  FilterType::Blac
a790: 6b 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  kList;..        
a7a0: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61      assert_eq!(a
a7b0: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 66  ppendable_data_f
a7c0: 69 6c 74 65 72 5f 74 79 70 65 28 61 64 5f 70 72  ilter_type(ad_pr
a7d0: 69 76 5f 68 2c 20 26 6d 75 74 20 66 69 6c 74 65  iv_h, &mut filte
a7e0: 72 5f 74 79 70 65 29 2c 20 30 29 3b 0a 20 20 20  r_type), 0);.   
a7f0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
a800: 65 71 21 28 66 69 6c 74 65 72 5f 74 79 70 65 2c  eq!(filter_type,
a810: 20 46 69 6c 74 65 72 54 79 70 65 3a 3a 42 6c 61   FilterType::Bla
a820: 63 6b 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20  ckList);..      
a830: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
a840: 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61  (appendable_data
a850: 5f 69 6e 73 65 72 74 5f 74 6f 5f 66 69 6c 74 65  _insert_to_filte
a860: 72 28 61 64 5f 70 72 69 76 5f 68 2c 20 73 69 67  r(ad_priv_h, sig
a870: 6e 5f 6b 65 79 31 5f 68 29 2c 20 30 29 3b 0a 20  n_key1_h), 0);. 
a880: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
a890: 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65  t_eq!(appendable
a8a0: 5f 64 61 74 61 5f 69 6e 73 65 72 74 5f 74 6f 5f  _data_insert_to_
a8b0: 66 69 6c 74 65 72 28 61 64 5f 70 72 69 76 5f 68  filter(ad_priv_h
a8c0: 2c 20 73 69 67 6e 5f 6b 65 79 32 5f 68 29 2c 20  , sign_key2_h), 
a8d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
a8e0: 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e  assert_eq!(appen
a8f0: 64 61 62 6c 65 5f 64 61 74 61 5f 70 6f 73 74 28  dable_data_post(
a900: 26 61 70 70 30 2c 20 61 64 5f 70 72 69 76 5f 68  &app0, ad_priv_h
a910: 2c 20 66 61 6c 73 65 29 2c 20 30 29 3b 0a 0a 20  , false), 0);.. 
a920: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
a930: 74 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  t!(appendable_da
a940: 74 61 5f 61 70 70 65 6e 64 28 26 61 70 70 31 2c  ta_append(&app1,
a950: 20 61 64 5f 70 72 69 76 5f 68 2c 20 69 6d 6d 75   ad_priv_h, immu
a960: 74 5f 69 64 5f 30 5f 68 29 20 21 3d 20 30 29 3b  t_id_0_h) != 0);
a970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
a980: 65 72 74 21 28 61 70 70 65 6e 64 61 62 6c 65 5f  ert!(appendable_
a990: 64 61 74 61 5f 61 70 70 65 6e 64 28 26 61 70 70  data_append(&app
a9a0: 32 2c 20 61 64 5f 70 72 69 76 5f 68 2c 20 69 6d  2, ad_priv_h, im
a9b0: 6d 75 74 5f 69 64 5f 31 5f 68 29 20 21 3d 20 30  mut_id_1_h) != 0
a9c0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
a9d0: 2f 2f 20 43 68 65 63 6b 20 77 68 69 74 65 6c 69  // Check whiteli
a9e0: 73 74 20 66 69 6c 74 65 72 20 66 6f 72 20 70 72  st filter for pr
a9f0: 69 76 61 74 65 20 64 61 74 61 0a 20 20 20 20 20  ivate data.     
aa00: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
aa10: 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  !(appendable_dat
aa20: 61 5f 74 6f 67 67 6c 65 5f 66 69 6c 74 65 72 28  a_toggle_filter(
aa30: 61 64 5f 70 72 69 76 5f 68 29 2c 20 30 29 3b 0a  ad_priv_h), 0);.
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
aa50: 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c  rt_eq!(appendabl
aa60: 65 5f 64 61 74 61 5f 66 69 6c 74 65 72 5f 74 79  e_data_filter_ty
aa70: 70 65 28 61 64 5f 70 72 69 76 5f 68 2c 20 26 6d  pe(ad_priv_h, &m
aa80: 75 74 20 66 69 6c 74 65 72 5f 74 79 70 65 29 2c  ut filter_type),
aa90: 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   0);..          
aaa0: 20 20 61 73 73 65 72 74 5f 65 71 21 28 66 69 6c    assert_eq!(fil
aab0: 74 65 72 5f 74 79 70 65 2c 20 46 69 6c 74 65 72  ter_type, Filter
aac0: 54 79 70 65 3a 3a 57 68 69 74 65 4c 69 73 74 29  Type::WhiteList)
aad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
aae0: 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61  sert_eq!(appenda
aaf0: 62 6c 65 5f 64 61 74 61 5f 69 6e 73 65 72 74 5f  ble_data_insert_
ab00: 74 6f 5f 66 69 6c 74 65 72 28 61 64 5f 70 72 69  to_filter(ad_pri
ab10: 76 5f 68 2c 20 73 69 67 6e 5f 6b 65 79 32 5f 68  v_h, sign_key2_h
ab20: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ), 0);.         
ab30: 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61 70     assert_eq!(ap
ab40: 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 70 6f  pendable_data_po
ab50: 73 74 28 26 61 70 70 30 2c 20 61 64 5f 70 72 69  st(&app0, ad_pri
ab60: 76 5f 68 2c 20 66 61 6c 73 65 29 2c 20 30 29 3b  v_h, false), 0);
ab70: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
ab80: 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61  sert_eq!(appenda
ab90: 62 6c 65 5f 64 61 74 61 5f 61 70 70 65 6e 64 28  ble_data_append(
aba0: 26 61 70 70 32 2c 20 61 64 5f 70 72 69 76 5f 68  &app2, ad_priv_h
abb0: 2c 20 69 6d 6d 75 74 5f 69 64 5f 31 5f 68 29 2c  , immut_id_1_h),
abc0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
abd0: 20 61 73 73 65 72 74 21 28 61 70 70 65 6e 64 61   assert!(appenda
abe0: 62 6c 65 5f 64 61 74 61 5f 61 70 70 65 6e 64 28  ble_data_append(
abf0: 26 61 70 70 31 2c 20 61 64 5f 70 72 69 76 5f 68  &app1, ad_priv_h
ac00: 2c 20 69 6d 6d 75 74 5f 69 64 5f 30 5f 68 29 20  , immut_id_0_h) 
ac10: 21 3d 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  != 0);..        
ac20: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61      assert_eq!(a
ac30: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 66  ppendable_data_f
ac40: 72 65 65 28 61 64 5f 70 72 69 76 5f 68 29 2c 20  ree(ad_priv_h), 
ac50: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  0);.        }.. 
ac60: 20 20 20 20 20 20 20 2f 2f 20 56 65 72 69 66 79         // Verify
ac70: 20 74 68 65 20 64 61 74 61 20 69 74 65 6d 73 20   the data items 
ac80: 77 65 20 67 6f 74 20 62 61 63 6b 20 61 72 65 20  we got back are 
ac90: 74 68 65 20 73 61 6d 65 20 77 65 20 70 75 74 20  the same we put 
aca0: 69 6e 2e 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  in..        {.  
acb0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75            let mu
acc0: 74 20 6f 62 6a 65 63 74 5f 63 61 63 68 65 20 3d  t object_cache =
acd0: 20 75 6e 77 72 61 70 21 28 6f 62 6a 65 63 74 5f   unwrap!(object_
ace0: 63 61 63 68 65 28 29 29 3b 0a 0a 20 20 20 20 20  cache());..     
acf0: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6f         let mut o
ad00: 72 69 67 20 3d 20 48 61 73 68 53 65 74 3a 3a 77  rig = HashSet::w
ad10: 69 74 68 5f 63 61 70 61 63 69 74 79 28 32 29 3b  ith_capacity(2);
ad20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
ad30: 20 5f 20 3d 20 6f 72 69 67 2e 69 6e 73 65 72 74   _ = orig.insert
ad40: 28 2a 75 6e 77 72 61 70 21 28 6f 62 6a 65 63 74  (*unwrap!(object
ad50: 5f 63 61 63 68 65 2e 67 65 74 5f 64 61 74 61 5f  _cache.get_data_
ad60: 69 64 28 69 6d 6d 75 74 5f 69 64 5f 30 5f 68 29  id(immut_id_0_h)
ad70: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
ad80: 6c 65 74 20 5f 20 3d 20 6f 72 69 67 2e 69 6e 73  let _ = orig.ins
ad90: 65 72 74 28 2a 75 6e 77 72 61 70 21 28 6f 62 6a  ert(*unwrap!(obj
ada0: 65 63 74 5f 63 61 63 68 65 2e 67 65 74 5f 64 61  ect_cache.get_da
adb0: 74 61 5f 69 64 28 69 6d 6d 75 74 5f 69 64 5f 31  ta_id(immut_id_1
adc0: 5f 68 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  _h)));..        
add0: 20 20 20 20 6c 65 74 20 6d 75 74 20 67 6f 74 20      let mut got 
ade0: 3d 20 48 61 73 68 53 65 74 3a 3a 77 69 74 68 5f  = HashSet::with_
adf0: 63 61 70 61 63 69 74 79 28 32 29 3b 0a 20 20 20  capacity(2);.   
ae00: 20 20 20 20 20 20 20 20 20 6c 65 74 20 5f 20 3d           let _ =
ae10: 20 67 6f 74 2e 69 6e 73 65 72 74 28 2a 75 6e 77   got.insert(*unw
ae20: 72 61 70 21 28 6f 62 6a 65 63 74 5f 63 61 63 68  rap!(object_cach
ae30: 65 2e 67 65 74 5f 64 61 74 61 5f 69 64 28 67 6f  e.get_data_id(go
ae40: 74 5f 69 6d 6d 75 74 5f 69 64 5f 30 5f 68 29 29  t_immut_id_0_h))
ae50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  );.            l
ae60: 65 74 20 5f 20 3d 20 67 6f 74 2e 69 6e 73 65 72  et _ = got.inser
ae70: 74 28 2a 75 6e 77 72 61 70 21 28 6f 62 6a 65 63  t(*unwrap!(objec
ae80: 74 5f 63 61 63 68 65 2e 67 65 74 5f 64 61 74 61  t_cache.get_data
ae90: 5f 69 64 28 67 6f 74 5f 69 6d 6d 75 74 5f 69 64  _id(got_immut_id
aea0: 5f 31 5f 68 29 29 29 3b 0a 0a 20 20 20 20 20 20  _1_h)));..      
aeb0: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
aec0: 28 6f 72 69 67 2c 20 67 6f 74 29 3b 0a 20 20 20  (orig, got);.   
aed0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
aee0: 61 73 73 65 72 74 5f 65 71 21 28 6d 69 73 63 5f  assert_eq!(misc_
aef0: 73 69 67 6e 5f 6b 65 79 5f 66 72 65 65 28 73 69  sign_key_free(si
af00: 67 6e 5f 6b 65 79 31 5f 68 29 2c 20 30 29 3b 0a  gn_key1_h), 0);.
af10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
af20: 71 21 28 6d 69 73 63 5f 73 69 67 6e 5f 6b 65 79  q!(misc_sign_key
af30: 5f 66 72 65 65 28 73 69 67 6e 5f 6b 65 79 32 5f  _free(sign_key2_
af40: 68 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  h), 0);.    }.. 
af50: 20 20 20 23 5b 74 65 73 74 5d 0a 20 20 20 20 66     #[test].    f
af60: 6e 20 64 65 6c 65 74 65 5f 64 61 74 61 28 29 20  n delete_data() 
af70: 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 70  {.        let ap
af80: 70 20 3d 20 74 65 73 74 5f 75 74 69 6c 73 3a 3a  p = test_utils::
af90: 63 72 65 61 74 65 5f 61 70 70 28 66 61 6c 73 65  create_app(false
afa0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74 20  );..        let 
afb0: 61 64 5f 6e 61 6d 65 20 3d 20 72 61 6e 64 3a 3a  ad_name = rand::
afc0: 72 61 6e 64 6f 6d 28 29 3b 0a 20 20 20 20 20 20  random();.      
afd0: 20 20 6c 65 74 20 6d 75 74 20 61 64 5f 68 3a 20    let mut ad_h: 
afe0: 41 70 70 65 6e 64 61 62 6c 65 44 61 74 61 48 61  AppendableDataHa
aff0: 6e 64 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndle = 0;.      
b000: 20 20 6c 65 74 20 6d 75 74 20 61 64 5f 69 64 5f    let mut ad_id_
b010: 68 3a 20 44 61 74 61 49 64 48 61 6e 64 6c 65 20  h: DataIdHandle 
b020: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65  = 0;..        le
b030: 74 20 28 5f 2c 20 69 6d 6d 75 74 5f 69 64 5f 30  t (_, immut_id_0
b040: 5f 68 29 20 3d 20 67 65 6e 65 72 61 74 65 5f 72  _h) = generate_r
b050: 61 6e 64 6f 6d 5f 69 6d 6d 75 74 61 62 6c 65 5f  andom_immutable_
b060: 64 61 74 61 5f 69 64 28 29 3b 0a 20 20 20 20 20  data_id();.     
b070: 20 20 20 6c 65 74 20 28 5f 2c 20 69 6d 6d 75 74     let (_, immut
b080: 5f 69 64 5f 31 5f 68 29 20 3d 20 67 65 6e 65 72  _id_1_h) = gener
b090: 61 74 65 5f 72 61 6e 64 6f 6d 5f 69 6d 6d 75 74  ate_random_immut
b0a0: 61 62 6c 65 5f 64 61 74 61 5f 69 64 28 29 3b 0a  able_data_id();.
b0b0: 0a 20 20 20 20 20 20 20 20 75 6e 73 61 66 65 20  .        unsafe 
b0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
b0d0: 20 43 72 65 61 74 65 20 41 44 20 61 6e 64 20 50   Create AD and P
b0e0: 55 54 20 69 74 20 74 6f 20 74 68 65 20 6e 65 74  UT it to the net
b0f0: 77 6f 72 6b 2e 0a 20 20 20 20 20 20 20 20 20 20  work..          
b100: 20 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70    assert_eq!(app
b110: 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 6e 65 77  endable_data_new
b120: 5f 70 75 62 28 26 61 70 70 2c 20 26 61 64 5f 6e  _pub(&app, &ad_n
b130: 61 6d 65 2c 20 26 6d 75 74 20 61 64 5f 68 29 2c  ame, &mut ad_h),
b140: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b150: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
b160: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 65 78 74 72  ndable_data_extr
b170: 61 63 74 5f 64 61 74 61 5f 69 64 28 61 64 5f 68  act_data_id(ad_h
b180: 2c 20 26 6d 75 74 20 61 64 5f 69 64 5f 68 29 2c  , &mut ad_id_h),
b190: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b1a0: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
b1b0: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 70 75 74 28  ndable_data_put(
b1c0: 26 61 70 70 2c 20 61 64 5f 68 29 2c 20 30 29 3b  &app, ad_h), 0);
b1d0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
b1e0: 20 41 70 70 65 6e 64 20 73 74 75 66 66 20 74 6f   Append stuff to
b1f0: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20   it..           
b200: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
b210: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 61 70 70 65  ndable_data_appe
b220: 6e 64 28 26 61 70 70 2c 20 61 64 5f 68 2c 20 69  nd(&app, ad_h, i
b230: 6d 6d 75 74 5f 69 64 5f 30 5f 68 29 2c 20 30 29  mmut_id_0_h), 0)
b240: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
b250: 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61  sert_eq!(appenda
b260: 62 6c 65 5f 64 61 74 61 5f 61 70 70 65 6e 64 28  ble_data_append(
b270: 26 61 70 70 2c 20 61 64 5f 68 2c 20 69 6d 6d 75  &app, ad_h, immu
b280: 74 5f 69 64 5f 31 5f 68 29 2c 20 30 29 3b 0a 0a  t_id_1_h), 0);..
b290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 47              // G
b2a0: 45 54 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ET it back..    
b2b0: 20 20 20 20 20 20 20 20 72 65 6c 6f 61 64 5f 61          reload_a
b2c0: 64 28 26 61 70 70 2c 20 61 64 5f 69 64 5f 68 2c  d(&app, ad_id_h,
b2d0: 20 26 6d 75 74 20 61 64 5f 68 29 3b 0a 20 20 20   &mut ad_h);.   
b2e0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
b2f0: 6e 75 6d 5f 6f 66 5f 64 61 74 61 21 28 61 64 5f  num_of_data!(ad_
b300: 68 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  h, 2);..        
b310: 20 20 20 20 2f 2f 20 54 72 79 20 74 6f 20 72 65      // Try to re
b320: 6d 6f 76 65 20 6f 6e 65 20 6f 66 20 61 76 61 69  move one of avai
b330: 6c 61 62 6c 65 20 76 65 72 73 69 6f 6e 73 20 66  lable versions f
b340: 69 72 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  irst.           
b350: 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65   assert_eq!(appe
b360: 6e 64 61 62 6c 65 5f 64 61 74 61 5f 72 65 6d 6f  ndable_data_remo
b370: 76 65 5f 6e 74 68 5f 64 61 74 61 28 61 64 5f 68  ve_nth_data(ad_h
b380: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
b390: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
b3a0: 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61  (appendable_data
b3b0: 5f 70 6f 73 74 28 26 61 70 70 2c 20 61 64 5f 68  _post(&app, ad_h
b3c0: 2c 20 74 72 75 65 29 2c 20 30 29 3b 0a 0a 20 20  , true), 0);..  
b3d0: 20 20 20 20 20 20 20 20 20 20 72 65 6c 6f 61 64            reload
b3e0: 5f 61 64 28 26 61 70 70 2c 20 61 64 5f 69 64 5f  _ad(&app, ad_id_
b3f0: 68 2c 20 26 6d 75 74 20 61 64 5f 68 29 3b 0a 20  h, &mut ad_h);. 
b400: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
b410: 74 5f 6e 75 6d 5f 6f 66 5f 64 61 74 61 21 28 61  t_num_of_data!(a
b420: 64 5f 68 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  d_h, 1);.       
b430: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 75 6d 5f       assert_num_
b440: 6f 66 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 21  of_deleted_data!
b450: 28 61 64 5f 68 2c 20 31 29 3b 0a 0a 20 20 20 20  (ad_h, 1);..    
b460: 20 20 20 20 20 20 20 20 2f 2f 20 54 72 79 20 72          // Try r
b470: 65 73 74 6f 72 69 6e 67 20 64 65 6c 65 74 65 64  estoring deleted
b480: 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 20 20   data.          
b490: 20 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70    assert_eq!(app
b4a0: 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 72 65 73  endable_data_res
b4b0: 74 6f 72 65 5f 6e 74 68 5f 64 65 6c 65 74 65 64  tore_nth_deleted
b4c0: 5f 64 61 74 61 28 61 64 5f 68 2c 20 30 29 2c 20  _data(ad_h, 0), 
b4d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b4e0: 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e  assert_eq!(appen
b4f0: 64 61 62 6c 65 5f 64 61 74 61 5f 70 6f 73 74 28  dable_data_post(
b500: 26 61 70 70 2c 20 61 64 5f 68 2c 20 74 72 75 65  &app, ad_h, true
b510: 29 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  ), 0);..        
b520: 20 20 20 20 72 65 6c 6f 61 64 5f 61 64 28 26 61      reload_ad(&a
b530: 70 70 2c 20 61 64 5f 69 64 5f 68 2c 20 26 6d 75  pp, ad_id_h, &mu
b540: 74 20 61 64 5f 68 29 3b 0a 20 20 20 20 20 20 20  t ad_h);.       
b550: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 75 6d 5f       assert_num_
b560: 6f 66 5f 64 61 74 61 21 28 61 64 5f 68 2c 20 32  of_data!(ad_h, 2
b570: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
b580: 2f 2f 20 50 65 72 6d 61 6e 65 6e 74 6c 79 20 64  // Permanently d
b590: 65 6c 65 74 65 20 64 61 74 61 0a 20 20 20 20 20  elete data.     
b5a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
b5b0: 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  !(appendable_dat
b5c0: 61 5f 72 65 6d 6f 76 65 5f 6e 74 68 5f 64 61 74  a_remove_nth_dat
b5d0: 61 28 61 64 5f 68 2c 20 30 29 2c 20 30 29 3b 0a  a(ad_h, 0), 0);.
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
b5f0: 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c  rt_eq!(appendabl
b600: 65 5f 64 61 74 61 5f 72 65 6d 6f 76 65 5f 6e 74  e_data_remove_nt
b610: 68 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 28 61  h_deleted_data(a
b620: 64 5f 68 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  d_h, 0), 0);.   
b630: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
b640: 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  eq!(appendable_d
b650: 61 74 61 5f 70 6f 73 74 28 26 61 70 70 2c 20 61  ata_post(&app, a
b660: 64 5f 68 2c 20 74 72 75 65 29 2c 20 30 29 3b 0a  d_h, true), 0);.
b670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
b680: 6f 61 64 5f 61 64 28 26 61 70 70 2c 20 61 64 5f  oad_ad(&app, ad_
b690: 69 64 5f 68 2c 20 26 6d 75 74 20 61 64 5f 68 29  id_h, &mut ad_h)
b6a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
b6b0: 73 65 72 74 5f 6e 75 6d 5f 6f 66 5f 64 65 6c 65  sert_num_of_dele
b6c0: 74 65 64 5f 64 61 74 61 21 28 61 64 5f 68 2c 20  ted_data!(ad_h, 
b6d0: 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
b6e0: 20 2f 2f 20 63 6c 65 61 72 20 74 68 65 20 64 61   // clear the da
b6f0: 74 61 20 61 6e 64 20 50 4f 53 54 20 69 74 2e 0a  ta and POST it..
b700: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
b710: 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c  rt_eq!(appendabl
b720: 65 5f 64 61 74 61 5f 63 6c 65 61 72 5f 64 61 74  e_data_clear_dat
b730: 61 28 61 64 5f 68 29 2c 20 30 29 3b 0a 20 20 20  a(ad_h), 0);.   
b740: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
b750: 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  eq!(appendable_d
b760: 61 74 61 5f 70 6f 73 74 28 26 61 70 70 2c 20 61  ata_post(&app, a
b770: 64 5f 68 2c 20 66 61 6c 73 65 29 2c 20 30 29 3b  d_h, false), 0);
b780: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
b790: 20 47 45 54 20 69 74 20 62 61 63 6b 2e 0a 20 20   GET it back..  
b7a0: 20 20 20 20 20 20 20 20 20 20 72 65 6c 6f 61 64            reload
b7b0: 5f 61 64 28 26 61 70 70 2c 20 61 64 5f 69 64 5f  _ad(&app, ad_id_
b7c0: 68 2c 20 26 6d 75 74 20 61 64 5f 68 29 3b 0a 20  h, &mut ad_h);. 
b7d0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
b7e0: 74 5f 6e 75 6d 5f 6f 66 5f 64 61 74 61 21 28 61  t_num_of_data!(a
b7f0: 64 5f 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  d_h, 0);.       
b800: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 75 6d 5f       assert_num_
b810: 6f 66 5f 64 65 6c 65 74 65 64 5f 64 61 74 61 21  of_deleted_data!
b820: 28 61 64 5f 68 2c 20 32 29 3b 0a 0a 20 20 20 20  (ad_h, 2);..    
b830: 20 20 20 20 20 20 20 20 2f 2f 20 50 65 72 6d 61          // Perma
b840: 6e 65 6e 74 6c 79 20 63 6c 65 61 72 20 64 65 6c  nently clear del
b850: 65 74 65 64 20 64 61 74 61 0a 20 20 20 20 20 20  eted data.      
b860: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
b870: 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61  (appendable_data
b880: 5f 63 6c 65 61 72 5f 64 65 6c 65 74 65 64 5f 64  _clear_deleted_d
b890: 61 74 61 28 61 64 5f 68 29 2c 20 30 29 3b 0a 20  ata(ad_h), 0);. 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
b8b0: 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65  t_eq!(appendable
b8c0: 5f 64 61 74 61 5f 70 6f 73 74 28 26 61 70 70 2c  _data_post(&app,
b8d0: 20 61 64 5f 68 2c 20 66 61 6c 73 65 29 2c 20 30   ad_h, false), 0
b8e0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
b8f0: 72 65 6c 6f 61 64 5f 61 64 28 26 61 70 70 2c 20  reload_ad(&app, 
b900: 61 64 5f 69 64 5f 68 2c 20 26 6d 75 74 20 61 64  ad_id_h, &mut ad
b910: 5f 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _h);.           
b920: 20 61 73 73 65 72 74 5f 6e 75 6d 5f 6f 66 5f 64   assert_num_of_d
b930: 65 6c 65 74 65 64 5f 64 61 74 61 21 28 61 64 5f  eleted_data!(ad_
b940: 68 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  h, 0);..        
b950: 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 61      assert_eq!(a
b960: 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 66  ppendable_data_f
b970: 72 65 65 28 61 64 5f 68 29 2c 20 30 29 3b 0a 20  ree(ad_h), 0);. 
b980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
b990: 20 20 20 20 23 5b 74 65 73 74 5d 0a 20 20 20 20      #[test].    
b9a0: 66 6e 20 64 61 74 61 5f 65 6e 63 72 79 70 74 5f  fn data_encrypt_
b9b0: 6b 65 79 28 29 20 7b 0a 20 20 20 20 20 20 20 20  key() {.        
b9c0: 6c 65 74 20 61 70 70 20 3d 20 74 65 73 74 5f 75  let app = test_u
b9d0: 74 69 6c 73 3a 3a 63 72 65 61 74 65 5f 61 70 70  tils::create_app
b9e0: 28 66 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20  (false);..      
b9f0: 20 20 6c 65 74 20 6d 75 74 20 65 6e 63 72 79 70    let mut encryp
ba00: 74 5f 6b 65 79 5f 68 20 3d 20 30 3b 0a 0a 20 20  t_key_h = 0;..  
ba10: 20 20 20 20 20 20 75 6e 73 61 66 65 20 7b 0a 20        unsafe {. 
ba20: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 6e             // In
ba30: 69 74 69 61 6c 69 73 65 20 70 75 62 6c 69 63 20  itialise public 
ba40: 61 70 70 65 6e 64 61 62 6c 65 20 64 61 74 61 0a  appendable data.
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
ba60: 6d 75 74 20 61 64 5f 68 20 3d 20 30 3b 0a 20 20  mut ad_h = 0;.  
ba70: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
ba80: 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f  _eq!(appendable_
ba90: 64 61 74 61 5f 6e 65 77 5f 70 75 62 28 26 61 70  data_new_pub(&ap
baa0: 70 2c 20 26 72 61 6e 64 3a 3a 72 61 6e 64 6f 6d  p, &rand::random
bab0: 28 29 2c 20 26 6d 75 74 20 61 64 5f 68 29 2c 20  (), &mut ad_h), 
bac0: 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
bad0: 20 2f 2f 20 50 75 62 6c 69 63 20 61 70 70 65 6e   // Public appen
bae0: 64 61 62 6c 65 20 64 61 74 61 20 64 6f 65 6e 73  dable data doens
baf0: 27 74 20 68 61 76 65 20 61 20 70 72 69 76 61 74  't have a privat
bb00: 65 20 6f 77 6e 65 72 20 6b 65 79 0a 20 20 20 20  e owner key.    
bb10: 20 20 20 20 20 20 20 20 6c 65 74 20 65 72 72 5f          let err_
bb20: 63 6f 64 65 3a 20 69 33 32 20 3d 20 46 66 69 45  code: i32 = FfiE
bb30: 72 72 6f 72 3a 3a 55 6e 73 75 70 70 6f 72 74 65  rror::Unsupporte
bb40: 64 4f 70 65 72 61 74 69 6f 6e 2e 69 6e 74 6f 28  dOperation.into(
bb50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
bb60: 73 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64  ssert_eq!(append
bb70: 61 62 6c 65 5f 64 61 74 61 5f 65 6e 63 72 79 70  able_data_encryp
bb80: 74 5f 6b 65 79 28 61 64 5f 68 2c 20 26 6d 75 74  t_key(ad_h, &mut
bb90: 20 65 6e 63 72 79 70 74 5f 6b 65 79 5f 68 29 2c   encrypt_key_h),
bba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bbb0: 20 20 20 20 20 20 20 20 65 72 72 5f 63 6f 64 65          err_code
bbc0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
bbd0: 61 73 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e  assert_eq!(appen
bbe0: 64 61 62 6c 65 5f 64 61 74 61 5f 66 72 65 65 28  dable_data_free(
bbf0: 61 64 5f 68 29 2c 20 30 29 3b 0a 0a 20 20 20 20  ad_h), 0);..    
bc00: 20 20 20 20 20 20 20 20 2f 2f 20 49 6e 69 74 69          // Initi
bc10: 61 6c 69 73 65 20 70 72 69 76 61 74 65 20 61 70  alise private ap
bc20: 70 65 6e 64 61 62 6c 65 20 64 61 74 61 0a 20 20  pendable data.  
bc30: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75            let mu
bc40: 74 20 61 64 5f 68 20 3d 20 30 3b 0a 20 20 20 20  t ad_h = 0;.    
bc50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
bc60: 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  q!(appendable_da
bc70: 74 61 5f 6e 65 77 5f 70 72 69 76 28 26 61 70 70  ta_new_priv(&app
bc80: 2c 20 26 72 61 6e 64 3a 3a 72 61 6e 64 6f 6d 28  , &rand::random(
bc90: 29 2c 20 26 6d 75 74 20 61 64 5f 68 29 2c 0a 20  ), &mut ad_h),. 
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 20 30 29 3b 0a 0a 20 20 20 20 20        0);..     
bcc0: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71         assert_eq
bcd0: 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74  !(appendable_dat
bce0: 61 5f 65 6e 63 72 79 70 74 5f 6b 65 79 28 61 64  a_encrypt_key(ad
bcf0: 5f 68 2c 20 26 6d 75 74 20 65 6e 63 72 79 70 74  _h, &mut encrypt
bd00: 5f 6b 65 79 5f 68 29 2c 20 30 29 3b 0a 0a 20 20  _key_h), 0);..  
bd10: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
bd20: 5f 65 71 21 28 6d 69 73 63 5f 65 6e 63 72 79 70  _eq!(misc_encryp
bd30: 74 5f 6b 65 79 5f 66 72 65 65 28 65 6e 63 72 79  t_key_free(encry
bd40: 70 74 5f 6b 65 79 5f 68 29 2c 20 30 29 3b 0a 20  pt_key_h), 0);. 
bd50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
bd60: 20 20 20 20 23 5b 74 65 73 74 5d 0a 20 20 20 20      #[test].    
bd70: 66 6e 20 64 61 74 61 5f 73 69 67 6e 5f 6b 65 79  fn data_sign_key
bd80: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  () {.        let
bd90: 20 61 70 70 30 20 3d 20 74 65 73 74 5f 75 74 69   app0 = test_uti
bda0: 6c 73 3a 3a 63 72 65 61 74 65 5f 61 70 70 28 66  ls::create_app(f
bdb0: 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 6c  alse);.        l
bdc0: 65 74 20 61 70 70 31 20 3d 20 74 65 73 74 5f 75  et app1 = test_u
bdd0: 74 69 6c 73 3a 3a 63 72 65 61 74 65 5f 61 70 70  tils::create_app
bde0: 28 66 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20  (false);..      
bdf0: 20 20 6c 65 74 20 73 69 67 6e 5f 6b 65 79 31 20    let sign_key1 
be00: 3d 20 67 65 74 5f 73 69 67 6e 5f 70 6b 28 26 61  = get_sign_pk(&a
be10: 70 70 31 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  pp1);.        le
be20: 74 20 73 69 67 6e 5f 6b 65 79 31 5f 68 20 3d 20  t sign_key1_h = 
be30: 75 6e 77 72 61 70 21 28 6f 62 6a 65 63 74 5f 63  unwrap!(object_c
be40: 61 63 68 65 28 29 29 2e 69 6e 73 65 72 74 5f 73  ache()).insert_s
be50: 69 67 6e 5f 6b 65 79 28 73 69 67 6e 5f 6b 65 79  ign_key(sign_key
be60: 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74  1);..        let
be70: 20 6d 75 74 20 61 64 5f 68 20 3d 20 30 3b 0a 20   mut ad_h = 0;. 
be80: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 61         let mut a
be90: 64 5f 69 64 5f 68 3a 20 44 61 74 61 49 64 48 61  d_id_h: DataIdHa
bea0: 6e 64 6c 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20  ndle = 0;..     
beb0: 20 20 20 2f 2f 20 44 61 74 61 20 74 6f 20 61 70     // Data to ap
bec0: 70 65 6e 64 0a 20 20 20 20 20 20 20 20 6c 65 74  pend.        let
bed0: 20 28 5f 2c 20 69 6d 6d 75 74 5f 69 64 5f 30 5f   (_, immut_id_0_
bee0: 68 29 20 3d 20 67 65 6e 65 72 61 74 65 5f 72 61  h) = generate_ra
bef0: 6e 64 6f 6d 5f 69 6d 6d 75 74 61 62 6c 65 5f 64  ndom_immutable_d
bf00: 61 74 61 5f 69 64 28 29 3b 0a 20 20 20 20 20 20  ata_id();.      
bf10: 20 20 6c 65 74 20 28 5f 2c 20 69 6d 6d 75 74 5f    let (_, immut_
bf20: 69 64 5f 31 5f 68 29 20 3d 20 67 65 6e 65 72 61  id_1_h) = genera
bf30: 74 65 5f 72 61 6e 64 6f 6d 5f 69 6d 6d 75 74 61  te_random_immuta
bf40: 62 6c 65 5f 64 61 74 61 5f 69 64 28 29 3b 0a 0a  ble_data_id();..
bf50: 20 20 20 20 20 20 20 20 75 6e 73 61 66 65 20 7b          unsafe {
bf60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
bf70: 43 72 65 61 74 65 20 74 65 73 74 20 64 61 74 61  Create test data
bf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
bf90: 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62  ert_eq!(appendab
bfa0: 6c 65 5f 64 61 74 61 5f 6e 65 77 5f 70 75 62 28  le_data_new_pub(
bfb0: 26 61 70 70 30 2c 20 26 72 61 6e 64 3a 3a 72 61  &app0, &rand::ra
bfc0: 6e 64 6f 6d 28 29 2c 20 26 6d 75 74 20 61 64 5f  ndom(), &mut ad_
bfd0: 68 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  h),.            
bfe0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
bff0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
c000: 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65  t_eq!(appendable
c010: 5f 64 61 74 61 5f 65 78 74 72 61 63 74 5f 64 61  _data_extract_da
c020: 74 61 5f 69 64 28 61 64 5f 68 2c 20 26 6d 75 74  ta_id(ad_h, &mut
c030: 20 61 64 5f 69 64 5f 68 29 2c 20 30 29 3b 0a 0a   ad_id_h), 0);..
c040: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
c050: 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62 6c  rt_eq!(appendabl
c060: 65 5f 64 61 74 61 5f 70 75 74 28 26 61 70 70 30  e_data_put(&app0
c070: 2c 20 61 64 5f 68 29 2c 20 30 29 3b 0a 20 20 20  , ad_h), 0);.   
c080: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
c090: 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  eq!(appendable_d
c0a0: 61 74 61 5f 61 70 70 65 6e 64 28 26 61 70 70 31  ata_append(&app1
c0b0: 2c 20 61 64 5f 68 2c 20 69 6d 6d 75 74 5f 69 64  , ad_h, immut_id
c0c0: 5f 30 5f 68 29 2c 20 30 29 3b 0a 0a 20 20 20 20  _0_h), 0);..    
c0d0: 20 20 20 20 20 20 20 20 72 65 6c 6f 61 64 5f 61          reload_a
c0e0: 64 28 26 61 70 70 30 2c 20 61 64 5f 69 64 5f 68  d(&app0, ad_id_h
c0f0: 2c 20 26 6d 75 74 20 61 64 5f 68 29 3b 0a 0a 20  , &mut ad_h);.. 
c100: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 47 65             // Ge
c110: 74 20 61 20 64 61 74 61 20 6b 65 79 20 6f 66 20  t a data key of 
c120: 61 70 70 31 0a 20 20 20 20 20 20 20 20 20 20 20  app1.           
c130: 20 6c 65 74 20 6d 75 74 20 73 69 67 6e 5f 6b 65   let mut sign_ke
c140: 79 5f 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  y_h = 0;.       
c150: 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21 28       assert_eq!(
c160: 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f  appendable_data_
c170: 6e 74 68 5f 64 61 74 61 5f 73 69 67 6e 5f 6b 65  nth_data_sign_ke
c180: 79 28 26 61 70 70 30 2c 20 61 64 5f 68 2c 20 30  y(&app0, ad_h, 0
c190: 2c 20 26 6d 75 74 20 73 69 67 6e 5f 6b 65 79 5f  , &mut sign_key_
c1a0: 68 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  h),.            
c1b0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
c1c0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
c1d0: 74 5f 65 71 21 28 2a 75 6e 77 72 61 70 21 28 75  t_eq!(*unwrap!(u
c1e0: 6e 77 72 61 70 21 28 6f 62 6a 65 63 74 5f 63 61  nwrap!(object_ca
c1f0: 63 68 65 28 29 29 2e 67 65 74 5f 73 69 67 6e 5f  che()).get_sign_
c200: 6b 65 79 28 73 69 67 6e 5f 6b 65 79 5f 68 29 29  key(sign_key_h))
c210: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c220: 20 20 20 20 20 20 20 20 20 73 69 67 6e 5f 6b 65           sign_ke
c230: 79 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  y1);..          
c240: 20 20 2f 2f 20 4e 6f 77 20 74 72 79 20 74 6f 20    // Now try to 
c250: 67 65 74 20 61 20 64 61 74 61 20 6b 65 79 20 66  get a data key f
c260: 72 6f 6d 20 64 65 6c 65 74 65 64 20 64 61 74 61  rom deleted data
c270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
c280: 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62  ert_eq!(appendab
c290: 6c 65 5f 64 61 74 61 5f 72 65 6d 6f 76 65 5f 6e  le_data_remove_n
c2a0: 74 68 5f 64 61 74 61 28 61 64 5f 68 2c 20 30 29  th_data(ad_h, 0)
c2b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
c2c0: 20 20 61 73 73 65 72 74 5f 65 71 21 28 61 70 70    assert_eq!(app
c2d0: 65 6e 64 61 62 6c 65 5f 64 61 74 61 5f 70 6f 73  endable_data_pos
c2e0: 74 28 26 61 70 70 30 2c 20 61 64 5f 68 2c 20 74  t(&app0, ad_h, t
c2f0: 72 75 65 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  rue), 0);.      
c300: 20 20 20 20 20 20 72 65 6c 6f 61 64 5f 61 64 28        reload_ad(
c310: 26 61 70 70 30 2c 20 61 64 5f 69 64 5f 68 2c 20  &app0, ad_id_h, 
c320: 26 6d 75 74 20 61 64 5f 68 29 3b 0a 0a 20 20 20  &mut ad_h);..   
c330: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74           let mut
c340: 20 64 65 6c 65 74 65 64 5f 73 6b 5f 68 20 3d 20   deleted_sk_h = 
c350: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  0;.            a
c360: 73 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64  ssert_eq!(append
c370: 61 62 6c 65 5f 64 61 74 61 5f 6e 74 68 5f 64 65  able_data_nth_de
c380: 6c 65 74 65 64 5f 64 61 74 61 5f 73 69 67 6e 5f  leted_data_sign_
c390: 6b 65 79 28 26 61 70 70 30 2c 0a 20 20 20 20 20  key(&app0,.     
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 5f 68              ad_h
c3e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 20 26 6d 75 74 20 64 65 6c 65         &mut dele
c470: 74 65 64 5f 73 6b 5f 68 29 2c 0a 20 20 20 20 20  ted_sk_h),.     
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20    0);.          
c4a0: 20 20 61 73 73 65 72 74 5f 65 71 21 28 2a 75 6e    assert_eq!(*un
c4b0: 77 72 61 70 21 28 75 6e 77 72 61 70 21 28 6f 62  wrap!(unwrap!(ob
c4c0: 6a 65 63 74 5f 63 61 63 68 65 28 29 29 2e 67 65  ject_cache()).ge
c4d0: 74 5f 73 69 67 6e 5f 6b 65 79 28 64 65 6c 65 74  t_sign_key(delet
c4e0: 65 64 5f 73 6b 5f 68 29 29 2c 0a 20 20 20 20 20  ed_sk_h)),.     
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 73 69 67 6e 5f 6b 65 79 31 29 3b 0a 0a 20    sign_key1);.. 
c510: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 69             // Fi
c520: 6c 74 65 72 20 6f 75 74 20 74 68 65 20 6b 65 79  lter out the key
c530: 20 74 68 61 74 20 77 65 27 76 65 20 67 6f 74 20   that we've got 
c540: 66 6f 72 20 61 6e 20 61 70 70 31 0a 20 20 20 20  for an app1.    
c550: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 65          assert_e
c560: 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61  q!(appendable_da
c570: 74 61 5f 69 6e 73 65 72 74 5f 74 6f 5f 66 69 6c  ta_insert_to_fil
c580: 74 65 72 28 61 64 5f 68 2c 20 64 65 6c 65 74 65  ter(ad_h, delete
c590: 64 5f 73 6b 5f 68 29 2c 20 30 29 3b 0a 20 20 20  d_sk_h), 0);.   
c5a0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
c5b0: 65 71 21 28 61 70 70 65 6e 64 61 62 6c 65 5f 64  eq!(appendable_d
c5c0: 61 74 61 5f 70 6f 73 74 28 26 61 70 70 30 2c 20  ata_post(&app0, 
c5d0: 61 64 5f 68 2c 20 66 61 6c 73 65 29 2c 20 30 29  ad_h, false), 0)
c5e0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ;..            a
c5f0: 73 73 65 72 74 21 28 61 70 70 65 6e 64 61 62 6c  ssert!(appendabl
c600: 65 5f 64 61 74 61 5f 61 70 70 65 6e 64 28 26 61  e_data_append(&a
c610: 70 70 31 2c 20 61 64 5f 68 2c 20 69 6d 6d 75 74  pp1, ad_h, immut
c620: 5f 69 64 5f 31 5f 68 29 20 21 3d 20 30 29 3b 0a  _id_1_h) != 0);.
c630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
c640: 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64 61 62  ert_eq!(appendab
c650: 6c 65 5f 64 61 74 61 5f 66 72 65 65 28 61 64 5f  le_data_free(ad_
c660: 68 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  h), 0);.        
c670: 7d 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  }..        asser
c680: 74 5f 65 71 21 28 6d 69 73 63 5f 73 69 67 6e 5f  t_eq!(misc_sign_
c690: 6b 65 79 5f 66 72 65 65 28 73 69 67 6e 5f 6b 65  key_free(sign_ke
c6a0: 79 31 5f 68 29 2c 20 30 29 3b 0a 20 20 20 20 7d  y1_h), 0);.    }
c6b0: 0a 0a 20 20 20 20 66 6e 20 67 65 6e 65 72 61 74  ..    fn generat
c6c0: 65 5f 72 61 6e 64 6f 6d 5f 69 6d 6d 75 74 61 62  e_random_immutab
c6d0: 6c 65 5f 64 61 74 61 5f 69 64 28 29 20 2d 3e 20  le_data_id() -> 
c6e0: 28 44 61 74 61 49 64 65 6e 74 69 66 69 65 72 2c  (DataIdentifier,
c6f0: 20 44 61 74 61 49 64 48 61 6e 64 6c 65 29 20 7b   DataIdHandle) {
c700: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 61 6d  .        let nam
c710: 65 20 3d 20 72 61 6e 64 3a 3a 72 61 6e 64 6f 6d  e = rand::random
c720: 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ();.        let 
c730: 69 64 20 3d 20 44 61 74 61 49 64 65 6e 74 69 66  id = DataIdentif
c740: 69 65 72 3a 3a 49 6d 6d 75 74 61 62 6c 65 28 6e  ier::Immutable(n
c750: 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c  ame);..        l
c760: 65 74 20 6d 75 74 20 6f 62 6a 5f 63 61 63 68 65  et mut obj_cache
c770: 20 3d 20 75 6e 77 72 61 70 21 28 6f 62 6a 65 63   = unwrap!(objec
c780: 74 5f 63 61 63 68 65 28 29 29 3b 0a 20 20 20 20  t_cache());.    
c790: 20 20 20 20 6c 65 74 20 69 64 5f 68 20 3d 20 6f      let id_h = o
c7a0: 62 6a 5f 63 61 63 68 65 2e 69 6e 73 65 72 74 5f  bj_cache.insert_
c7b0: 64 61 74 61 5f 69 64 28 69 64 29 3b 0a 0a 20 20  data_id(id);..  
c7c0: 20 20 20 20 20 20 28 69 64 2c 20 69 64 5f 68 29        (id, id_h)
c7d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 67  .    }..    fn g
c7e0: 65 74 5f 73 69 67 6e 5f 70 6b 28 61 70 70 3a 20  et_sign_pk(app: 
c7f0: 26 41 70 70 29 20 2d 3e 20 73 69 67 6e 3a 3a 50  &App) -> sign::P
c800: 75 62 6c 69 63 4b 65 79 20 7b 0a 20 20 20 20 20  ublicKey {.     
c810: 20 20 20 6c 65 74 20 63 6c 69 65 6e 74 20 3d 20     let client = 
c820: 61 70 70 2e 67 65 74 5f 63 6c 69 65 6e 74 28 29  app.get_client()
c830: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 63 6c  ;.        let cl
c840: 69 65 6e 74 20 3d 20 75 6e 77 72 61 70 21 28 63  ient = unwrap!(c
c850: 6c 69 65 6e 74 2e 6c 6f 63 6b 28 29 29 3b 0a 20  lient.lock());. 
c860: 20 20 20 20 20 20 20 2a 75 6e 77 72 61 70 21 28         *unwrap!(
c870: 63 6c 69 65 6e 74 2e 67 65 74 5f 70 75 62 6c 69  client.get_publi
c880: 63 5f 73 69 67 6e 69 6e 67 5f 6b 65 79 28 29 29  c_signing_key())
c890: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 72  .    }..    fn r
c8a0: 65 6c 6f 61 64 5f 61 64 28 61 70 70 3a 20 26 41  eload_ad(app: &A
c8b0: 70 70 2c 20 61 64 5f 69 64 5f 68 3a 20 44 61 74  pp, ad_id_h: Dat
c8c0: 61 49 64 48 61 6e 64 6c 65 2c 20 61 64 5f 68 3a  aIdHandle, ad_h:
c8d0: 20 26 6d 75 74 20 41 70 70 65 6e 64 61 62 6c 65   &mut Appendable
c8e0: 44 61 74 61 48 61 6e 64 6c 65 29 20 7b 0a 20 20  DataHandle) {.  
c8f0: 20 20 20 20 20 20 61 73 73 65 72 74 5f 65 71 21        assert_eq!
c900: 28 61 70 70 65 6e 64 61 62 6c 65 5f 64 61 74 61  (appendable_data
c910: 5f 66 72 65 65 28 2a 61 64 5f 68 29 2c 20 30 29  _free(*ad_h), 0)
c920: 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 61 66 65  ;.        unsafe
c930: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61   {.            a
c940: 73 73 65 72 74 5f 65 71 21 28 61 70 70 65 6e 64  ssert_eq!(append
c950: 61 62 6c 65 5f 64 61 74 61 5f 67 65 74 28 61 70  able_data_get(ap
c960: 70 2c 20 61 64 5f 69 64 5f 68 2c 20 61 64 5f 68  p, ad_id_h, ad_h
c970: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  ), 0);.        }
c980: 0a 20 20 20 20 7d 0a 7d 0a                       .    }.}.