diff --git a/core/include/fpdfapi/fpdf_parser.h b/core/include/fpdfapi/fpdf_parser.h
index ffc29ef..6620a71 100644
--- a/core/include/fpdfapi/fpdf_parser.h
+++ b/core/include/fpdfapi/fpdf_parser.h
@@ -396,6 +396,14 @@
   FX_DWORD GetFirstPageNo() const { return m_dwFirstPageNo; }
 
  protected:
+  struct ObjectInfo {
+    ObjectInfo() : pos(0), type(0), gennum(0) {}
+
+    FX_FILESIZE pos;
+    uint8_t type;
+    uint16_t gennum;
+  };
+
   void CloseParser();
   CPDF_Object* ParseDirect(CPDF_Object* pObj);
   FX_BOOL LoadAllCrossRefV4(FX_FILESIZE pos);
@@ -412,7 +420,6 @@
   Error LoadLinearizedMainXRefTable();
   CPDF_StreamAcc* GetObjectStream(FX_DWORD number);
   FX_BOOL IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset);
-  bool FindPosInOffsets(FX_FILESIZE pos) const;
   void SetEncryptDictionary(CPDF_Dictionary* pDict);
   void ShrinkObjectMap(FX_DWORD size);
 
@@ -428,17 +435,8 @@
   CFX_ByteString m_bsRecipient;
   CFX_ByteString m_FilePath;
   CFX_ByteString m_Password;
-
-  struct ObjectInfo {
-    ObjectInfo() : pos(0), type(0), gennum(0) {}
-
-    FX_FILESIZE pos;
-    uint8_t type;
-    uint16_t gennum;
-  };
   std::map<FX_DWORD, ObjectInfo> m_ObjectInfo;
-
-  CFX_FileSizeArray m_SortedOffset;
+  std::set<FX_FILESIZE> m_SortedOffset;
   CFX_ArrayTemplate<CPDF_Dictionary*> m_Trailers;
   FX_BOOL m_bVersionUpdated;
   CPDF_Object* m_pLinearized;
diff --git a/core/include/fxcrt/fx_basic.h b/core/include/fxcrt/fx_basic.h
index 291aaaf..449889e 100644
--- a/core/include/fxcrt/fx_basic.h
+++ b/core/include/fxcrt/fx_basic.h
@@ -438,7 +438,6 @@
 typedef CFX_ArrayTemplate<FX_WORD> CFX_WordArray;
 typedef CFX_ArrayTemplate<FX_DWORD> CFX_DWordArray;
 typedef CFX_ArrayTemplate<void*> CFX_PtrArray;
-typedef CFX_ArrayTemplate<FX_FILESIZE> CFX_FileSizeArray;
 #ifdef PDF_ENABLE_XFA
 typedef CFX_ArrayTemplate<FX_FLOAT> CFX_FloatArray;
 typedef CFX_ArrayTemplate<uint8_t> CFX_ByteArray;
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
index 3696bb1..6489b1e 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -36,10 +36,6 @@
   FX_DWORD m_Offset;
 };
 
-int CompareFileSize(const void* p1, const void* p2) {
-  return *(FX_FILESIZE*)p1 - *(FX_FILESIZE*)p2;
-}
-
 int32_t GetHeaderOffset(IFX_FileRead* pFile) {
   const FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025);
   const size_t kBufSize = 4;
@@ -179,7 +175,7 @@
   m_ObjectStreamMap.clear();
   m_ObjCache.clear();
 
-  m_SortedOffset.RemoveAll();
+  m_SortedOffset.clear();
   m_ObjectInfo.clear();
   int32_t iLen = m_Trailers.GetSize();
   for (int32_t i = 0; i < iLen; ++i) {
@@ -226,13 +222,7 @@
 
   FX_BOOL bXRefRebuilt = FALSE;
   if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) {
-    FX_FILESIZE startxref_offset = m_Syntax.SavePos();
-    void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(),
-                                  m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
-                                  CompareFileSize);
-    if (!pResult)
-      m_SortedOffset.Add(startxref_offset);
-
+    m_SortedOffset.insert(m_Syntax.SavePos());
     m_Syntax.GetKeyword();
     bool bNumber;
     CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber);
@@ -275,8 +265,6 @@
     if (!m_pDocument->GetRoot())
       return FORMAT_ERROR;
   }
-  FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-              sizeof(FX_FILESIZE), CompareFileSize);
   if (GetRootObjNum() == 0) {
     ReleaseEncryptHandler();
     if (!RebuildCrossRef() || GetRootObjNum() == 0)
@@ -366,13 +354,13 @@
   if (xrefsize > 0 && xrefsize <= kMaxXRefSize)
     ShrinkObjectMap(xrefsize);
 
-  CFX_FileSizeArray CrossRefList;
-  CFX_FileSizeArray XRefStreamList;
-  CrossRefList.Add(xrefpos);
-  XRefStreamList.Add(GetDirectInteger(m_pTrailer, "XRefStm"));
-
+  std::vector<FX_FILESIZE> CrossRefList;
+  std::vector<FX_FILESIZE> XRefStreamList;
   std::set<FX_FILESIZE> seen_xrefpos;
+  CrossRefList.push_back(xrefpos);
+  XRefStreamList.push_back(GetDirectInteger(m_pTrailer, "XRefStm"));
   seen_xrefpos.insert(xrefpos);
+
   // When |m_pTrailer| doesn't have Prev entry or Prev entry value is not
   // numerical, GetDirectInteger() returns 0. Loading will end.
   xrefpos = GetDirectInteger(m_pTrailer, "Prev");
@@ -381,18 +369,20 @@
     if (pdfium::ContainsKey(seen_xrefpos, xrefpos))
       return FALSE;
     seen_xrefpos.insert(xrefpos);
-    CrossRefList.InsertAt(0, xrefpos);
+    // SLOW ...
+    CrossRefList.insert(CrossRefList.begin(), xrefpos);
     LoadCrossRefV4(xrefpos, 0, TRUE);
     std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict(
         LoadTrailerV4());
     if (!pDict)
       return FALSE;
     xrefpos = GetDirectInteger(pDict.get(), "Prev");
-
-    XRefStreamList.InsertAt(0, pDict->GetIntegerBy("XRefStm"));
+    // SLOW ...
+    XRefStreamList.insert(XRefStreamList.begin(),
+                          pDict->GetIntegerBy("XRefStm"));
     m_Trailers.Add(pDict.release());
   }
-  for (int32_t i = 0; i < CrossRefList.GetSize(); i++) {
+  for (size_t i = 0; i < CrossRefList.size(); ++i) {
     if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE))
       return FALSE;
   }
@@ -411,19 +401,22 @@
   if (xrefsize == 0) {
     return FALSE;
   }
-  CFX_FileSizeArray CrossRefList, XRefStreamList;
-  CrossRefList.Add(xrefpos);
-  XRefStreamList.Add(GetDirectInteger(m_pTrailer, "XRefStm"));
 
+  std::vector<FX_FILESIZE> CrossRefList;
+  std::vector<FX_FILESIZE> XRefStreamList;
   std::set<FX_FILESIZE> seen_xrefpos;
+  CrossRefList.push_back(xrefpos);
+  XRefStreamList.push_back(GetDirectInteger(m_pTrailer, "XRefStm"));
   seen_xrefpos.insert(xrefpos);
+
   xrefpos = GetDirectInteger(m_pTrailer, "Prev");
   while (xrefpos) {
     // Check for circular references.
     if (pdfium::ContainsKey(seen_xrefpos, xrefpos))
       return FALSE;
     seen_xrefpos.insert(xrefpos);
-    CrossRefList.InsertAt(0, xrefpos);
+    // SLOW ...
+    CrossRefList.insert(CrossRefList.begin(), xrefpos);
     LoadCrossRefV4(xrefpos, 0, TRUE);
     std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict(
         LoadTrailerV4());
@@ -431,11 +424,12 @@
       return FALSE;
     }
     xrefpos = GetDirectInteger(pDict.get(), "Prev");
-
-    XRefStreamList.InsertAt(0, pDict->GetIntegerBy("XRefStm"));
+    // SLOW ...
+    XRefStreamList.insert(XRefStreamList.begin(),
+                          pDict->GetIntegerBy("XRefStm"));
     m_Trailers.Add(pDict.release());
   }
-  for (int32_t i = 1; i < CrossRefList.GetSize(); i++)
+  for (size_t i = 1; i < CrossRefList.size(); ++i)
     if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) {
       return FALSE;
     }
@@ -445,12 +439,7 @@
                                               FX_DWORD dwObjCount) {
   FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset;
   m_Syntax.RestorePos(dwStartPos);
-  void* pResult =
-      FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-                    sizeof(FX_FILESIZE), CompareFileSize);
-  if (!pResult) {
-    m_SortedOffset.Add(pos);
-  }
+  m_SortedOffset.insert(pos);
   FX_DWORD start_objnum = 0;
   FX_DWORD count = dwObjCount;
   FX_FILESIZE SavedPos = m_Syntax.SavePos();
@@ -489,12 +478,7 @@
         }
         m_ObjectInfo[objnum].gennum = version;
         if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen) {
-          void* pResult = FXSYS_bsearch(
-              &m_ObjectInfo[objnum].pos, m_SortedOffset.GetData(),
-              m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), CompareFileSize);
-          if (!pResult) {
-            m_SortedOffset.Add(m_ObjectInfo[objnum].pos);
-          }
+          m_SortedOffset.insert(m_ObjectInfo[objnum].pos);
         }
         m_ObjectInfo[objnum].type = 1;
       }
@@ -504,11 +488,6 @@
   return TRUE;
 }
 
-bool CPDF_Parser::FindPosInOffsets(FX_FILESIZE pos) const {
-  return FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-                       sizeof(FX_FILESIZE), CompareFileSize);
-}
-
 bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos,
                                  FX_FILESIZE streampos,
                                  FX_BOOL bSkip) {
@@ -516,11 +495,9 @@
   if (m_Syntax.GetKeyword() != "xref")
     return false;
 
-  if (!FindPosInOffsets(pos))
-    m_SortedOffset.Add(pos);
-
-  if (streampos && !FindPosInOffsets(streampos))
-      m_SortedOffset.Add(streampos);
+  m_SortedOffset.insert(pos);
+  if (streampos)
+    m_SortedOffset.insert(streampos);
 
   while (1) {
     FX_FILESIZE SavedPos = m_Syntax.SavePos();
@@ -570,9 +547,8 @@
               m_bVersionUpdated = TRUE;
             }
             m_ObjectInfo[objnum].gennum = version;
-            if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen &&
-                !FindPosInOffsets(m_ObjectInfo[objnum].pos)) {
-              m_SortedOffset.Add(m_ObjectInfo[objnum].pos);
+            if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen) {
+              m_SortedOffset.insert(m_ObjectInfo[objnum].pos);
             }
             m_ObjectInfo[objnum].type = 1;
           }
@@ -606,7 +582,7 @@
 
 FX_BOOL CPDF_Parser::RebuildCrossRef() {
   m_ObjectInfo.clear();
-  m_SortedOffset.RemoveAll();
+  m_SortedOffset.clear();
   if (m_pTrailer) {
     m_pTrailer->Release();
     m_pTrailer = NULL;
@@ -767,14 +743,8 @@
                   break;
                 }
                 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset;
+                m_SortedOffset.insert(obj_pos);
                 last_obj = start_pos;
-                void* pResult =
-                    FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(),
-                                  m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
-                                  CompareFileSize);
-                if (!pResult) {
-                  m_SortedOffset.Add(obj_pos);
-                }
                 FX_FILESIZE obj_end = 0;
                 CPDF_Object* pObject = ParseIndirectObjectAtByStrict(
                     m_pDocument, obj_pos, objnum, &obj_end);
@@ -974,13 +944,7 @@
   } else if (last_trailer == -1 || last_xref < last_obj) {
     last_trailer = m_Syntax.m_FileLen;
   }
-  FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset;
-  void* pResult =
-      FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-                    sizeof(FX_FILESIZE), CompareFileSize);
-  if (!pResult) {
-    m_SortedOffset.Add(offset);
-  }
+  m_SortedOffset.insert(last_trailer - m_Syntax.m_HeaderOffset);
   return m_pTrailer && !m_ObjectInfo.empty();
 }
 
@@ -1092,12 +1056,7 @@
         FX_FILESIZE offset =
             GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
         m_ObjectInfo[startnum + j].pos = offset;
-        void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(),
-                                      m_SortedOffset.GetSize(),
-                                      sizeof(FX_FILESIZE), CompareFileSize);
-        if (!pResult) {
-          m_SortedOffset.Add(offset);
-        }
+        m_SortedOffset.insert(offset);
         continue;
       }
       if (GetObjectType(startnum + j)) {
@@ -1111,12 +1070,7 @@
             GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
         m_ObjectInfo[startnum + j].pos = offset;
         if (type == 1) {
-          void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(),
-                                        m_SortedOffset.GetSize(),
-                                        sizeof(FX_FILESIZE), CompareFileSize);
-          if (!pResult) {
-            m_SortedOffset.Add(offset);
-          }
+          m_SortedOffset.insert(offset);
         } else {
           if (offset < 0 || !IsValidObjectNumber(offset)) {
             pStream->Release();
@@ -1161,17 +1115,12 @@
   if (GetObjectType(objnum) == 2)
     return TRUE;
   FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
-  void* pResult =
-      FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-                    sizeof(FX_FILESIZE), CompareFileSize);
-  if (!pResult) {
+  auto it = m_SortedOffset.find(pos);
+  if (it == m_SortedOffset.end())
     return TRUE;
-  }
-  if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() ==
-      m_SortedOffset.GetSize() - 1) {
+  if (++it == m_SortedOffset.end())
     return FALSE;
-  }
-  FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos;
+  FX_FILESIZE size = *it - pos;
   FX_FILESIZE SavedPos = m_Syntax.SavePos();
   m_Syntax.RestorePos(pos);
   const char kFormStream[] = "/Form\0stream";
@@ -1253,23 +1202,18 @@
   if (GetObjectType(objnum) == 2)
     objnum = GetObjectPositionOrZero(objnum);
 
-  if (GetObjectType(objnum) == 1 || GetObjectType(objnum) == 255) {
-    FX_FILESIZE offset = GetObjectPositionOrZero(objnum);
-    if (offset == 0)
-      return 0;
+  if (GetObjectType(objnum) != 1 && GetObjectType(objnum) != 255)
+    return 0;
 
-    FX_FILESIZE* pResult = static_cast<FX_FILESIZE*>(FXSYS_bsearch(
-        &offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-        sizeof(FX_FILESIZE), CompareFileSize));
-    if (!pResult)
-      return 0;
+  FX_FILESIZE offset = GetObjectPositionOrZero(objnum);
+  if (offset == 0)
+    return 0;
 
-    if (pResult - m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1)
-      return 0;
+  auto it = m_SortedOffset.find(offset);
+  if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end())
+    return 0;
 
-    return pResult[1] - offset;
-  }
-  return 0;
+  return *it - offset;
 }
 
 void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum,
@@ -1341,14 +1285,12 @@
     m_Syntax.RestorePos(SavedPos);
     return;
   }
-  void* pResult =
-      FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-                    sizeof(FX_FILESIZE), CompareFileSize);
-  if (!pResult) {
+  auto it = m_SortedOffset.find(pos);
+  if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) {
     m_Syntax.RestorePos(SavedPos);
     return;
   }
-  FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1];
+  FX_FILESIZE nextoff = *it;
   FX_BOOL bNextOffValid = FALSE;
   if (nextoff != pos) {
     m_Syntax.RestorePos(nextoff);
@@ -1594,8 +1536,6 @@
       return FORMAT_ERROR;
     }
   }
-  FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-              sizeof(FX_FILESIZE), CompareFileSize);
   if (GetRootObjNum() == 0) {
     ReleaseEncryptHandler();
     if (!RebuildCrossRef() || GetRootObjNum() == 0)
@@ -1663,8 +1603,6 @@
     m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
     return FORMAT_ERROR;
   }
-  FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
-              sizeof(FX_FILESIZE), CompareFileSize);
   m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
   return SUCCESS;
 }
@@ -2664,114 +2602,59 @@
                       IFX_DownloadHints* pHints);
 
   CPDF_Parser m_parser;
-
   CPDF_SyntaxParser m_syntaxParser;
-
   CPDF_Object* m_pRoot;
-
   FX_DWORD m_dwRootObjNum;
-
   FX_DWORD m_dwInfoObjNum;
-
   CPDF_Object* m_pLinearized;
-
   CPDF_Object* m_pTrailer;
-
   FX_BOOL m_bDocAvail;
-
   FX_FILESIZE m_dwHeaderOffset;
-
   FX_FILESIZE m_dwLastXRefOffset;
-
   FX_FILESIZE m_dwXRefOffset;
-
   FX_FILESIZE m_dwTrailerOffset;
-
   FX_FILESIZE m_dwCurrentOffset;
-
   PDF_DATAAVAIL_STATUS m_docStatus;
-
   FX_FILESIZE m_dwFileLen;
-
   CPDF_Document* m_pDocument;
-
   std::set<FX_DWORD> m_ObjectSet;
-
   CFX_ArrayTemplate<CPDF_Object*> m_objs_array;
-
   FX_FILESIZE m_Pos;
-
   FX_FILESIZE m_bufferOffset;
-
   FX_DWORD m_bufferSize;
-
   CFX_ByteString m_WordBuf;
-
   uint8_t m_bufferData[512];
-
-  CFX_FileSizeArray m_CrossOffset;
-
   CFX_DWordArray m_XRefStreamList;
-
   CFX_DWordArray m_PageObjList;
-
   FX_DWORD m_PagesObjNum;
-
   FX_BOOL m_bLinearized;
-
   FX_DWORD m_dwFirstPageNo;
-
   FX_BOOL m_bLinearedDataOK;
-
   FX_BOOL m_bMainXRefLoadTried;
-
   FX_BOOL m_bMainXRefLoadedOK;
-
   FX_BOOL m_bPagesTreeLoad;
-
   FX_BOOL m_bPagesLoad;
-
   CPDF_Parser* m_pCurrentParser;
-
   FX_FILESIZE m_dwCurrentXRefSteam;
-
   FX_BOOL m_bAnnotsLoad;
-
   FX_BOOL m_bHaveAcroForm;
-
   FX_DWORD m_dwAcroFormObjNum;
-
   FX_BOOL m_bAcroFormLoad;
-
   CPDF_Object* m_pAcroForm;
-
   CFX_ArrayTemplate<CPDF_Object*> m_arrayAcroforms;
-
   CPDF_Dictionary* m_pPageDict;
-
   CPDF_Object* m_pPageResource;
-
   FX_BOOL m_bNeedDownLoadResource;
-
   FX_BOOL m_bPageLoadedOK;
-
   FX_BOOL m_bLinearizedFormParamLoad;
-
   CFX_ArrayTemplate<CPDF_Object*> m_PagesArray;
-
   FX_DWORD m_dwEncryptObjNum;
-
   FX_FILESIZE m_dwPrevXRefOffset;
-
   FX_BOOL m_bTotalLoadPageTree;
-
   FX_BOOL m_bCurPageDictLoadOK;
-
   CPDF_PageNode m_pageNodes;
-
   std::set<FX_DWORD> m_pageMapCheckState;
   std::set<FX_DWORD> m_pagesLoadState;
-
   std::unique_ptr<CPDF_HintTables> m_pHintTables;
   FX_BOOL m_bSupportHintTable;
 };
@@ -2865,26 +2748,21 @@
   if (pParser->GetObjectType(objnum) == 2)
     objnum = pParser->GetObjectPositionOrZero(objnum);
 
-  if (pParser->GetObjectType(objnum) == 1 ||
-      pParser->GetObjectType(objnum) == 255) {
-    offset = pParser->GetObjectPositionOrZero(objnum);
-    if (offset == 0) {
-      return 0;
-    }
-    void* pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(),
-                                  pParser->m_SortedOffset.GetSize(),
-                                  sizeof(FX_FILESIZE), CompareFileSize);
-    if (!pResult) {
-      return 0;
-    }
-    if ((FX_FILESIZE*)pResult -
-            (FX_FILESIZE*)pParser->m_SortedOffset.GetData() ==
-        pParser->m_SortedOffset.GetSize() - 1) {
-      return 0;
-    }
-    return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset);
+  if (pParser->GetObjectType(objnum) != 1 &&
+      pParser->GetObjectType(objnum) != 255) {
+    return 0;
   }
-  return 0;
+
+  offset = pParser->GetObjectPositionOrZero(objnum);
+  if (offset == 0)
+    return 0;
+
+  auto it = pParser->m_SortedOffset.find(offset);
+  if (it == pParser->m_SortedOffset.end() ||
+      ++it == pParser->m_SortedOffset.end()) {
+    return 0;
+  }
+  return *it - offset;
 }
 FX_BOOL CPDF_DataAvail::IsObjectsAvail(
     CFX_ArrayTemplate<CPDF_Object*>& obj_array,
@@ -3107,9 +2985,6 @@
     m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
     return FALSE;
   }
-  FXSYS_qsort(m_parser.m_SortedOffset.GetData(),
-              m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
-              CompareFileSize);
   m_dwRootObjNum = m_parser.GetRootObjNum();
   m_dwInfoObjNum = m_parser.GetInfoObjNum();
   m_pCurrentParser = &m_parser;
@@ -3810,7 +3685,6 @@
     return FALSE;
   }
   if (token == "xref") {
-    m_CrossOffset.InsertAt(0, m_dwXRefOffset);
     while (1) {
       if (!GetNextToken(token)) {
         iSize =
@@ -4486,14 +4360,15 @@
   m_dwNSharedObjsArray.RemoveAll();
   m_dwSharedObjNumArray.RemoveAll();
   m_dwIdentifierArray.RemoveAll();
-  m_szPageOffsetArray.RemoveAll();
-  m_szSharedObjOffsetArray.RemoveAll();
 }
-FX_DWORD CPDF_HintTables::GetItemLength(int index,
-                                        const CFX_FileSizeArray& szArray) {
-  if (index < 0 || szArray.GetSize() < 2 || index > szArray.GetSize() - 2 ||
-      szArray[index] > szArray[index + 1])
+FX_DWORD CPDF_HintTables::GetItemLength(
+    int index,
+    const std::vector<FX_FILESIZE>& szArray) {
+  if (index < 0 || szArray.size() < 2 ||
+      static_cast<size_t>(index) > szArray.size() - 2 ||
+      szArray[index] > szArray[index + 1]) {
     return 0;
+  }
   return szArray[index + 1] - szArray[index];
 }
 FX_BOOL CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) {
@@ -4583,26 +4458,26 @@
   int nFirstPageNum = pFirstPageNum ? pFirstPageNum->GetInteger() : 0;
   for (int i = 0; i < nPages; ++i) {
     if (i == nFirstPageNum) {
-      m_szPageOffsetArray.Add(m_szFirstPageObjOffset);
+      m_szPageOffsetArray.push_back(m_szFirstPageObjOffset);
     } else if (i == nFirstPageNum + 1) {
       if (i == 1) {
-        m_szPageOffsetArray.Add(nOffsetE);
+        m_szPageOffsetArray.push_back(nOffsetE);
       } else {
-        m_szPageOffsetArray.Add(m_szPageOffsetArray[i - 2] +
-                                dwPageLenArray[i - 2]);
+        m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 2] +
+                                      dwPageLenArray[i - 2]);
       }
     } else {
       if (i == 0) {
-        m_szPageOffsetArray.Add(nOffsetE);
+        m_szPageOffsetArray.push_back(nOffsetE);
       } else {
-        m_szPageOffsetArray.Add(m_szPageOffsetArray[i - 1] +
-                                dwPageLenArray[i - 1]);
+        m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 1] +
+                                      dwPageLenArray[i - 1]);
       }
     }
   }
   if (nPages > 0) {
-    m_szPageOffsetArray.Add(m_szPageOffsetArray[nPages - 1] +
-                            dwPageLenArray[nPages - 1]);
+    m_szPageOffsetArray.push_back(m_szPageOffsetArray[nPages - 1] +
+                                  dwPageLenArray[nPages - 1]);
   }
   hStream->ByteAlign();
 
@@ -4704,7 +4579,7 @@
     if (i < m_nFirstPageSharedObjs) {
       m_dwSharedObjNumArray.Add(nFirstPageObjNum + i);
       if (i == 0)
-        m_szSharedObjOffsetArray.Add(m_szFirstPageObjOffset);
+        m_szSharedObjOffsetArray.push_back(m_szFirstPageObjOffset);
     } else {
       FX_SAFE_DWORD safeObjNum = dwFirstSharedObjNum;
       safeObjNum += i - m_nFirstPageSharedObjs;
@@ -4712,7 +4587,7 @@
         return FALSE;
       m_dwSharedObjNumArray.Add(safeObjNum.ValueOrDie());
       if (i == m_nFirstPageSharedObjs)
-        m_szSharedObjOffsetArray.Add(
+        m_szSharedObjOffsetArray.push_back(
             pdfium::base::checked_cast<int32_t>(dwFirstSharedObjLoc));
     }
     if (i != 0 && i != m_nFirstPageSharedObjs) {
@@ -4720,7 +4595,7 @@
       safeLoc += m_szSharedObjOffsetArray[i - 1];
       if (!safeLoc.IsValid())
         return FALSE;
-      m_szSharedObjOffsetArray.Add(safeLoc.ValueOrDie());
+      m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie());
     }
   }
   if (dwSharedObjTotal > 0) {
@@ -4728,7 +4603,7 @@
     safeLoc += m_szSharedObjOffsetArray[dwSharedObjTotal - 1];
     if (!safeLoc.IsValid())
       return FALSE;
-    m_szSharedObjOffsetArray.Add(safeLoc.ValueOrDie());
+    m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie());
   }
   hStream->ByteAlign();
   if (hStream->BitsRemaining() < dwSharedObjTotal)
diff --git a/core/src/fpdfapi/fpdf_parser/parser_int.h b/core/src/fpdfapi/fpdf_parser/parser_int.h
index 70b5fcf..b486584 100644
--- a/core/src/fpdfapi/fpdf_parser/parser_int.h
+++ b/core/src/fpdfapi/fpdf_parser/parser_int.h
@@ -7,6 +7,8 @@
 #ifndef CORE_SRC_FPDFAPI_FPDF_PARSER_PARSER_INT_H_
 #define CORE_SRC_FPDFAPI_FPDF_PARSER_PARSER_INT_H_
 
+#include <vector>
+
 #include "core/include/fxcrt/fx_basic.h"
 #include "core/include/fxcrt/fx_stream.h"
 
@@ -36,7 +38,7 @@
  protected:
   FX_BOOL ReadPageHintTable(CFX_BitStream* hStream);
   FX_BOOL ReadSharedObjHintTable(CFX_BitStream* hStream, FX_DWORD offset);
-  FX_DWORD GetItemLength(int index, const CFX_FileSizeArray& szArray);
+  FX_DWORD GetItemLength(int index, const std::vector<FX_FILESIZE>& szArray);
 
  private:
   int ReadPrimaryHintStreamOffset() const;
@@ -50,8 +52,8 @@
   CFX_DWordArray m_dwNSharedObjsArray;
   CFX_DWordArray m_dwSharedObjNumArray;
   CFX_DWordArray m_dwIdentifierArray;
-  CFX_FileSizeArray m_szPageOffsetArray;
-  CFX_FileSizeArray m_szSharedObjOffsetArray;
+  std::vector<FX_FILESIZE> m_szPageOffsetArray;
+  std::vector<FX_FILESIZE> m_szSharedObjOffsetArray;
 };
 
 #endif  // CORE_SRC_FPDFAPI_FPDF_PARSER_PARSER_INT_H_
