diff --git a/core/fxcrt/fx_arabic.cpp b/core/fxcrt/fx_arabic.cpp
index d6b3c65..a649e49 100644
--- a/core/fxcrt/fx_arabic.cpp
+++ b/core/fxcrt/fx_arabic.cpp
@@ -374,7 +374,7 @@
 
 int32_t FX_BidiReorderLevel(int32_t iBaseLevel,
                             CFX_WideString& wsText,
-                            const CFX_Int32Array& levels,
+                            const CFX_ArrayTemplate<int32_t>& levels,
                             int32_t iStart,
                             bool bReverse) {
   ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
@@ -403,7 +403,7 @@
 }
 void FX_BidiReorder(int32_t iBaseLevel,
                     CFX_WideString& wsText,
-                    const CFX_Int32Array& levels) {
+                    const CFX_ArrayTemplate<int32_t>& levels) {
   ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
   ASSERT(wsText.GetLength() == levels.GetSize());
   int32_t iSize = wsText.GetLength();
diff --git a/core/fxcrt/fx_arabic.h b/core/fxcrt/fx_arabic.h
index 1f4d38b..e7ba079 100644
--- a/core/fxcrt/fx_arabic.h
+++ b/core/fxcrt/fx_arabic.h
@@ -30,17 +30,17 @@
 void FX_BidiReverseString(CFX_WideString& wsText,
                           int32_t iStart,
                           int32_t iCount);
-void FX_BidiSetDeferredRun(CFX_Int32Array& values,
+void FX_BidiSetDeferredRun(CFX_ArrayTemplate<int32_t>& values,
                            int32_t iStart,
                            int32_t iCount,
                            int32_t iValue);
 void FX_BidiClassify(const CFX_WideString& wsText,
-                     CFX_Int32Array& classes,
+                     CFX_ArrayTemplate<int32_t>& classes,
                      bool bWS = false);
 int32_t FX_BidiResolveExplicit(int32_t iBaseLevel,
                                int32_t iDirection,
-                               CFX_Int32Array& classes,
-                               CFX_Int32Array& levels,
+                               CFX_ArrayTemplate<int32_t>& classes,
+                               CFX_ArrayTemplate<int32_t>& levels,
                                int32_t iStart,
                                int32_t iCount,
                                int32_t iNest = 0);
@@ -136,8 +136,8 @@
 #define FX_BWALxx FX_BIDIWEAKACTION_Lxx
 
 void FX_BidiResolveWeak(int32_t iBaseLevel,
-                        CFX_Int32Array& classes,
-                        CFX_Int32Array& levels);
+                        CFX_ArrayTemplate<int32_t>& classes,
+                        CFX_ArrayTemplate<int32_t>& levels);
 enum FX_BIDINEUTRALSTATE {
   FX_BIDINEUTRALSTATE_r = 0,
   FX_BIDINEUTRALSTATE_l,
@@ -169,20 +169,20 @@
 int32_t FX_BidiGetDeferredNeutrals(int32_t iAction, int32_t iLevel);
 int32_t FX_BidiGetResolvedNeutrals(int32_t iAction);
 void FX_BidiResolveNeutrals(int32_t iBaseLevel,
-                            CFX_Int32Array& classes,
-                            const CFX_Int32Array& levels);
-void FX_BidiResolveImplicit(const CFX_Int32Array& classes,
-                            CFX_Int32Array& levels);
+                            CFX_ArrayTemplate<int32_t>& classes,
+                            const CFX_ArrayTemplate<int32_t>& levels);
+void FX_BidiResolveImplicit(const CFX_ArrayTemplate<int32_t>& classes,
+                            CFX_ArrayTemplate<int32_t>& levels);
 void FX_BidiResolveWhitespace(int32_t iBaseLevel,
-                              const CFX_Int32Array& classes,
-                              CFX_Int32Array& levels);
+                              const CFX_ArrayTemplate<int32_t>& classes,
+                              CFX_ArrayTemplate<int32_t>& levels);
 int32_t FX_BidiReorderLevel(int32_t iBaseLevel,
                             CFX_WideString& wsText,
-                            const CFX_Int32Array& levels,
+                            const CFX_ArrayTemplate<int32_t>& levels,
                             int32_t iStart,
                             bool bReverse = false);
 void FX_BidiReorder(int32_t iBaseLevel,
                     CFX_WideString& wsText,
-                    const CFX_Int32Array& levels);
+                    const CFX_ArrayTemplate<int32_t>& levels);
 
 #endif  // CORE_FXCRT_FX_ARABIC_H_
diff --git a/core/fxcrt/fx_basic.h b/core/fxcrt/fx_basic.h
index 5adcf70..31850f5 100644
--- a/core/fxcrt/fx_basic.h
+++ b/core/fxcrt/fx_basic.h
@@ -313,11 +313,6 @@
   }
 };
 
-#ifdef PDF_ENABLE_XFA
-typedef CFX_ArrayTemplate<uint8_t> CFX_ByteArray;
-typedef CFX_ArrayTemplate<int32_t> CFX_Int32Array;
-#endif  // PDF_ENABLE_XFA
-
 template <class DataType, int FixedSize>
 class CFX_FixedBufGrow {
  public:
diff --git a/xfa/fde/tto/fde_textout.h b/xfa/fde/tto/fde_textout.h
index 94b72f8..084af42 100644
--- a/xfa/fde/tto/fde_textout.h
+++ b/xfa/fde/tto/fde_textout.h
@@ -179,7 +179,7 @@
   int32_t m_iTotalLines;
   std::vector<FXTEXT_CHARPOS> m_CharPos;
   std::unique_ptr<CFDE_RenderDevice> m_pRenderDevice;
-  CFX_Int32Array m_hotKeys;
+  CFX_ArrayTemplate<int32_t> m_hotKeys;
   CFX_RectFArray m_rectArray;
 };
 
diff --git a/xfa/fde/xml/cfx_saxreader.h b/xfa/fde/xml/cfx_saxreader.h
index 8e06d9b..129399d 100644
--- a/xfa/fde/xml/cfx_saxreader.h
+++ b/xfa/fde/xml/cfx_saxreader.h
@@ -128,7 +128,7 @@
   bool m_bCharData;
   uint8_t m_CurByte;
   uint32_t m_dwDataOffset;
-  CFX_ByteArray m_SkipStack;
+  CFX_ArrayTemplate<uint8_t> m_SkipStack;
   uint8_t m_SkipChar;
   uint32_t m_dwNodePos;
   uint8_t* m_pszData;
diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h
index 6edd860..91862dc 100644
--- a/xfa/fgas/layout/fgas_rtfbreak.h
+++ b/xfa/fgas/layout/fgas_rtfbreak.h
@@ -298,7 +298,7 @@
   int32_t m_iFontHeight;
   int32_t m_iFontSize;
   int32_t m_iTabWidth;
-  CFX_Int32Array m_PositionedTabs;
+  CFX_ArrayTemplate<int32_t> m_PositionedTabs;
   bool m_bOrphanLine;
   FX_WCHAR m_wDefChar;
   int32_t m_iDefChar;
diff --git a/xfa/fxbarcode/BC_UtilCodingConvert.cpp b/xfa/fxbarcode/BC_UtilCodingConvert.cpp
index 7347575..c06cffc 100644
--- a/xfa/fxbarcode/BC_UtilCodingConvert.cpp
+++ b/xfa/fxbarcode/BC_UtilCodingConvert.cpp
@@ -22,7 +22,7 @@
 }
 
 void CBC_UtilCodingConvert::LocaleToUtf8(const CFX_ByteString& src,
-                                         CFX_ByteArray& dst) {
+                                         CFX_ArrayTemplate<uint8_t>& dst) {
   CFX_WideString unicode = CFX_WideString::FromLocal(src.AsStringC());
   CFX_ByteString utf8 = unicode.UTF8Encode();
   for (int32_t i = 0; i < utf8.GetLength(); i++) {
@@ -30,7 +30,7 @@
   }
 }
 
-void CBC_UtilCodingConvert::Utf8ToLocale(const CFX_ByteArray& src,
+void CBC_UtilCodingConvert::Utf8ToLocale(const CFX_ArrayTemplate<uint8_t>& src,
                                          CFX_ByteString& dst) {
   CFX_ByteString utf8;
   for (int32_t i = 0; i < src.GetSize(); i++) {
diff --git a/xfa/fxbarcode/BC_UtilCodingConvert.h b/xfa/fxbarcode/BC_UtilCodingConvert.h
index 698cd85..859eeea 100644
--- a/xfa/fxbarcode/BC_UtilCodingConvert.h
+++ b/xfa/fxbarcode/BC_UtilCodingConvert.h
@@ -17,8 +17,10 @@
                               CFX_ByteString& result);
   static void LocaleToUtf8(const CFX_ByteString& source,
                            CFX_ByteString& result);
-  static void LocaleToUtf8(const CFX_ByteString& source, CFX_ByteArray& result);
-  static void Utf8ToLocale(const CFX_ByteArray& source, CFX_ByteString& result);
+  static void LocaleToUtf8(const CFX_ByteString& source,
+                           CFX_ArrayTemplate<uint8_t>& result);
+  static void Utf8ToLocale(const CFX_ArrayTemplate<uint8_t>& source,
+                           CFX_ByteString& result);
   static void Utf8ToLocale(const uint8_t* source,
                            int32_t count,
                            CFX_ByteString& result);
diff --git a/xfa/fxbarcode/BC_Utils.cpp b/xfa/fxbarcode/BC_Utils.cpp
index 807b048..5d881c7 100644
--- a/xfa/fxbarcode/BC_Utils.cpp
+++ b/xfa/fxbarcode/BC_Utils.cpp
@@ -26,7 +26,8 @@
     dst += c;
   }
 }
-void BC_FX_ByteString_Append(CFX_ByteString& dst, const CFX_ByteArray& ba) {
+void BC_FX_ByteString_Append(CFX_ByteString& dst,
+                             const CFX_ArrayTemplate<uint8_t>& ba) {
   for (int32_t i = 0; i < ba.GetSize(); i++) {
     dst += ba[i];
   }
diff --git a/xfa/fxbarcode/common/BC_CommonBitArray.cpp b/xfa/fxbarcode/common/BC_CommonBitArray.cpp
index 722bbc5..0371837 100644
--- a/xfa/fxbarcode/common/BC_CommonBitArray.cpp
+++ b/xfa/fxbarcode/common/BC_CommonBitArray.cpp
@@ -41,7 +41,7 @@
 int32_t CBC_CommonBitArray::GetSize() {
   return m_size;
 }
-CFX_Int32Array& CBC_CommonBitArray::GetBits() {
+CFX_ArrayTemplate<int32_t>& CBC_CommonBitArray::GetBits() {
   return m_bits;
 }
 int32_t CBC_CommonBitArray::GetSizeInBytes() {
diff --git a/xfa/fxbarcode/common/BC_CommonBitArray.h b/xfa/fxbarcode/common/BC_CommonBitArray.h
index 80a56d1..6ad8ab3 100644
--- a/xfa/fxbarcode/common/BC_CommonBitArray.h
+++ b/xfa/fxbarcode/common/BC_CommonBitArray.h
@@ -17,7 +17,7 @@
   virtual ~CBC_CommonBitArray();
 
   int32_t GetSize();
-  CFX_Int32Array& GetBits();
+  CFX_ArrayTemplate<int32_t>& GetBits();
   int32_t GetSizeInBytes();
   bool Get(int32_t i);
   void Set(int32_t i);
@@ -30,7 +30,7 @@
 
  private:
   int32_t m_size;
-  CFX_Int32Array m_bits;
+  CFX_ArrayTemplate<int32_t> m_bits;
 };
 
 #endif  // XFA_FXBARCODE_COMMON_BC_COMMONBITARRAY_H_
diff --git a/xfa/fxbarcode/common/BC_CommonByteArray.cpp b/xfa/fxbarcode/common/BC_CommonByteArray.cpp
index 71fa85f..050ecb0 100644
--- a/xfa/fxbarcode/common/BC_CommonByteArray.cpp
+++ b/xfa/fxbarcode/common/BC_CommonByteArray.cpp
@@ -85,7 +85,7 @@
   FXSYS_memcpy(m_bytes, source + offset, count);
   m_index = count;
 }
-void CBC_CommonByteArray::Set(CFX_ByteArray* source,
+void CBC_CommonByteArray::Set(CFX_ArrayTemplate<uint8_t>* source,
                               int32_t offset,
                               int32_t count) {
   FX_Free(m_bytes);
diff --git a/xfa/fxbarcode/common/BC_CommonByteArray.h b/xfa/fxbarcode/common/BC_CommonByteArray.h
index dd6ee58..009f625 100644
--- a/xfa/fxbarcode/common/BC_CommonByteArray.h
+++ b/xfa/fxbarcode/common/BC_CommonByteArray.h
@@ -25,7 +25,7 @@
   void AppendByte(int32_t value);
   void Reserve(int32_t capacity);
   void Set(uint8_t* source, int32_t offset, int32_t count);
-  void Set(CFX_ByteArray* source, int32_t offset, int32_t count);
+  void Set(CFX_ArrayTemplate<uint8_t>* source, int32_t offset, int32_t count);
 
  private:
   int32_t m_size;
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
index 352dc3d..eac1a10 100644
--- a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp
@@ -39,7 +39,7 @@
     CBC_ReedSolomonGF256Poly* lastGenerator =
         m_cachedGenerators[m_cachedGenerators.GetSize() - 1];
     for (int32_t d = m_cachedGenerators.GetSize(); d <= degree; d++) {
-      CFX_Int32Array temp;
+      CFX_ArrayTemplate<int32_t> temp;
       temp.Add(1);
       temp.Add(m_field->Exp(d - 1));
       CBC_ReedSolomonGF256Poly temp_poly;
@@ -54,7 +54,7 @@
   }
   return m_cachedGenerators[degree];
 }
-void CBC_ReedSolomonEncoder::Encode(CFX_Int32Array* toEncode,
+void CBC_ReedSolomonEncoder::Encode(CFX_ArrayTemplate<int32_t>* toEncode,
                                     int32_t ecBytes,
                                     int32_t& e) {
   if (ecBytes == 0) {
@@ -68,7 +68,7 @@
   }
   CBC_ReedSolomonGF256Poly* generator = BuildGenerator(ecBytes, e);
   BC_EXCEPTION_CHECK_ReturnVoid(e);
-  CFX_Int32Array infoCoefficients;
+  CFX_ArrayTemplate<int32_t> infoCoefficients;
   infoCoefficients.SetSize(dataBytes);
   for (int32_t x = 0; x < dataBytes; x++) {
     infoCoefficients[x] = toEncode->operator[](x);
@@ -83,7 +83,7 @@
       infoTemp->Divide(generator, e));
   BC_EXCEPTION_CHECK_ReturnVoid(e);
   CBC_ReedSolomonGF256Poly* remainder = (*temp)[1];
-  CFX_Int32Array* coefficients = remainder->GetCoefficients();
+  CFX_ArrayTemplate<int32_t>* coefficients = remainder->GetCoefficients();
   int32_t numZeroCoefficients = ecBytes - coefficients->GetSize();
   for (int32_t i = 0; i < numZeroCoefficients; i++) {
     (*toEncode)[dataBytes + i] = 0;
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h
index b71cfb4..95828f1 100644
--- a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h
@@ -17,7 +17,9 @@
   explicit CBC_ReedSolomonEncoder(CBC_ReedSolomonGF256* field);
   virtual ~CBC_ReedSolomonEncoder();
 
-  void Encode(CFX_Int32Array* toEncode, int32_t ecBytes, int32_t& e);
+  void Encode(CFX_ArrayTemplate<int32_t>* toEncode,
+              int32_t ecBytes,
+              int32_t& e);
   virtual void Init();
 
  private:
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
index 33b828c..030048a 100644
--- a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp
@@ -85,7 +85,7 @@
     BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
     return temp;
   }
-  CFX_Int32Array coefficients;
+  CFX_ArrayTemplate<int32_t> coefficients;
   coefficients.SetSize(degree + 1);
   coefficients[0] = coefficient;
   CBC_ReedSolomonGF256Poly* temp = new CBC_ReedSolomonGF256Poly();
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
index 60f1f1b..748646b 100644
--- a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp
@@ -38,7 +38,7 @@
   m_field = nullptr;
 }
 void CBC_ReedSolomonGF256Poly::Init(CBC_ReedSolomonGF256* field,
-                                    CFX_Int32Array* coefficients,
+                                    CFX_ArrayTemplate<int32_t>* coefficients,
                                     int32_t& e) {
   if (!coefficients || coefficients->GetSize() == 0) {
     e = BCExceptionCoefficientsSizeIsNull;
@@ -64,7 +64,7 @@
     m_coefficients.Copy(*coefficients);
   }
 }
-CFX_Int32Array* CBC_ReedSolomonGF256Poly::GetCoefficients() {
+CFX_ArrayTemplate<int32_t>* CBC_ReedSolomonGF256Poly::GetCoefficients() {
   return &m_coefficients;
 }
 int32_t CBC_ReedSolomonGF256Poly::GetDegree() {
@@ -109,17 +109,17 @@
   if (other->IsZero())
     return Clone(e);
 
-  CFX_Int32Array smallerCoefficients;
+  CFX_ArrayTemplate<int32_t> smallerCoefficients;
   smallerCoefficients.Copy(m_coefficients);
-  CFX_Int32Array largerCoefficients;
+  CFX_ArrayTemplate<int32_t> largerCoefficients;
   largerCoefficients.Copy(*(other->GetCoefficients()));
   if (smallerCoefficients.GetSize() > largerCoefficients.GetSize()) {
-    CFX_Int32Array temp;
+    CFX_ArrayTemplate<int32_t> temp;
     temp.Copy(smallerCoefficients);
     smallerCoefficients.Copy(largerCoefficients);
     largerCoefficients.Copy(temp);
   }
-  CFX_Int32Array sumDiff;
+  CFX_ArrayTemplate<int32_t> sumDiff;
   sumDiff.SetSize(largerCoefficients.GetSize());
   int32_t lengthDiff =
       largerCoefficients.GetSize() - smallerCoefficients.GetSize();
@@ -141,13 +141,13 @@
   if (IsZero() || other->IsZero())
     return m_field->GetZero()->Clone(e);
 
-  CFX_Int32Array aCoefficients;
+  CFX_ArrayTemplate<int32_t> aCoefficients;
   aCoefficients.Copy(m_coefficients);
   int32_t aLength = m_coefficients.GetSize();
-  CFX_Int32Array bCoefficients;
+  CFX_ArrayTemplate<int32_t> bCoefficients;
   bCoefficients.Copy(*(other->GetCoefficients()));
   int32_t bLength = other->GetCoefficients()->GetSize();
-  CFX_Int32Array product;
+  CFX_ArrayTemplate<int32_t> product;
   product.SetSize(aLength + bLength - 1);
   for (int32_t i = 0; i < aLength; i++) {
     int32_t aCoeff = m_coefficients[i];
@@ -170,7 +170,7 @@
     return Clone(e);
 
   int32_t size = m_coefficients.GetSize();
-  CFX_Int32Array product;
+  CFX_ArrayTemplate<int32_t> product;
   product.SetSize(size);
   for (int32_t i = 0; i < size; i++) {
     product[i] = m_field->Multiply(m_coefficients[i], scalar);
@@ -192,7 +192,7 @@
     return m_field->GetZero()->Clone(e);
 
   int32_t size = m_coefficients.GetSize();
-  CFX_Int32Array product;
+  CFX_ArrayTemplate<int32_t> product;
   product.SetSize(size + degree);
   for (int32_t i = 0; i < size; i++) {
     product[i] = (m_field->Multiply(m_coefficients[i], coefficient));
diff --git a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
index 3eff31b..ff93264 100644
--- a/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
+++ b/xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h
@@ -17,11 +17,11 @@
   CBC_ReedSolomonGF256Poly();
   ~CBC_ReedSolomonGF256Poly();
   void Init(CBC_ReedSolomonGF256* field,
-            CFX_Int32Array* coefficients,
+            CFX_ArrayTemplate<int32_t>* coefficients,
             int32_t& e);
 
   int32_t GetCoefficients(int32_t degree);
-  CFX_Int32Array* GetCoefficients();
+  CFX_ArrayTemplate<int32_t>* GetCoefficients();
   int32_t GetDegree();
   bool IsZero();
   int32_t EvaluateAt(int32_t a);
@@ -41,7 +41,7 @@
 
  private:
   CBC_ReedSolomonGF256* m_field;
-  CFX_Int32Array m_coefficients;
+  CFX_ArrayTemplate<int32_t> m_coefficients;
 };
 
 #endif  // XFA_FXBARCODE_COMMON_REEDSOLOMON_BC_REEDSOLOMONGF256POLY_H_
diff --git a/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp b/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
index bc0aa72..e7eef07 100644
--- a/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
+++ b/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp
@@ -43,7 +43,7 @@
 int32_t CBC_DefaultPlacement::getNumcols() {
   return m_numcols;
 }
-CFX_ByteArray& CBC_DefaultPlacement::getBits() {
+CFX_ArrayTemplate<uint8_t>& CBC_DefaultPlacement::getBits() {
   return m_bits;
 }
 bool CBC_DefaultPlacement::getBit(int32_t col, int32_t row) {
diff --git a/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h b/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h
index 64d0288..36a7ab2 100644
--- a/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h
+++ b/xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h
@@ -18,7 +18,7 @@
 
   int32_t getNumrows();
   int32_t getNumcols();
-  CFX_ByteArray& getBits();
+  CFX_ArrayTemplate<uint8_t>& getBits();
   bool getBit(int32_t col, int32_t row);
   void setBit(int32_t col, int32_t row, bool bit);
   bool hasBit(int32_t col, int32_t row);
@@ -28,7 +28,7 @@
   CFX_WideString m_codewords;
   int32_t m_numrows;
   int32_t m_numcols;
-  CFX_ByteArray m_bits;
+  CFX_ArrayTemplate<uint8_t> m_bits;
   void module(int32_t row, int32_t col, int32_t pos, int32_t bit);
   void utah(int32_t row, int32_t col, int32_t pos);
   void corner1(int32_t pos);
diff --git a/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp b/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
index f52f0ff..7782830 100644
--- a/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
+++ b/xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
@@ -132,11 +132,11 @@
     BC_EXCEPTION_CHECK_ReturnValue(e, CFX_WideString());
     sb += ecc;
   } else {
-    CFX_Int32Array dataSizes;
+    CFX_ArrayTemplate<int32_t> dataSizes;
     dataSizes.SetSize(blockCount);
-    CFX_Int32Array errorSizes;
+    CFX_ArrayTemplate<int32_t> errorSizes;
     errorSizes.SetSize(blockCount);
-    CFX_Int32Array startPos;
+    CFX_ArrayTemplate<int32_t> startPos;
     startPos.SetSize(blockCount);
     for (int32_t i = 0; i < blockCount; i++) {
       dataSizes[i] = symbolInfo->getDataLengthForInterleavedBlock(i + 1);
diff --git a/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
index fcd668a..4b4b246 100644
--- a/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
+++ b/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
@@ -58,7 +58,8 @@
 CBC_HighLevelEncoder::CBC_HighLevelEncoder() {}
 CBC_HighLevelEncoder::~CBC_HighLevelEncoder() {}
 
-CFX_ByteArray& CBC_HighLevelEncoder::getBytesForMessage(CFX_WideString msg) {
+CFX_ArrayTemplate<uint8_t>& CBC_HighLevelEncoder::getBytesForMessage(
+    CFX_WideString msg) {
   CFX_ByteString bytestr;
   CBC_UtilCodingConvert::UnicodeToUTF8(msg, bytestr);
   for (int32_t i = 0; i < bytestr.GetLength(); i++) {
@@ -159,9 +160,9 @@
   while (true) {
     if ((startpos + charsProcessed) == msg.GetLength()) {
       int32_t min = std::numeric_limits<int32_t>::max();
-      CFX_ByteArray mins;
+      CFX_ArrayTemplate<uint8_t> mins;
       mins.SetSize(6);
-      CFX_Int32Array intCharCounts;
+      CFX_ArrayTemplate<int32_t> intCharCounts;
       intCharCounts.SetSize(6);
       min = findMinimums(charCounts, intCharCounts, min, mins);
       int32_t minCount = getMinimumCount(mins);
@@ -229,9 +230,9 @@
       charCounts[BASE256_ENCODATION]++;
     }
     if (charsProcessed >= 4) {
-      CFX_Int32Array intCharCounts;
+      CFX_ArrayTemplate<int32_t> intCharCounts;
       intCharCounts.SetSize(6);
-      CFX_ByteArray mins;
+      CFX_ArrayTemplate<uint8_t> mins;
       mins.SetSize(6);
       findMinimums(charCounts, intCharCounts,
                    std::numeric_limits<int32_t>::max(), mins);
@@ -317,10 +318,11 @@
   return tempVariable <= 254 ? (FX_WCHAR)tempVariable
                              : (FX_WCHAR)(tempVariable - 254);
 }
-int32_t CBC_HighLevelEncoder::findMinimums(std::vector<FX_FLOAT>& charCounts,
-                                           CFX_Int32Array& intCharCounts,
-                                           int32_t min,
-                                           CFX_ByteArray& mins) {
+int32_t CBC_HighLevelEncoder::findMinimums(
+    std::vector<FX_FLOAT>& charCounts,
+    CFX_ArrayTemplate<int32_t>& intCharCounts,
+    int32_t min,
+    CFX_ArrayTemplate<uint8_t>& mins) {
   for (int32_t l = 0; l < mins.GetSize(); l++) {
     mins[l] = (uint8_t)0;
   }
@@ -339,7 +341,8 @@
   }
   return min;
 }
-int32_t CBC_HighLevelEncoder::getMinimumCount(CFX_ByteArray& mins) {
+int32_t CBC_HighLevelEncoder::getMinimumCount(
+    CFX_ArrayTemplate<uint8_t>& mins) {
   int32_t minCount = 0;
   for (int32_t i = 0; i < 6; i++) {
     minCount += mins[i];
diff --git a/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h b/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h
index 3b88f88..5d72f10 100644
--- a/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h
+++ b/xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h
@@ -23,7 +23,7 @@
   CBC_HighLevelEncoder();
   ~CBC_HighLevelEncoder() override;
 
-  CFX_ByteArray& getBytesForMessage(CFX_WideString msg);
+  CFX_ArrayTemplate<uint8_t>& getBytesForMessage(CFX_WideString msg);
   static CFX_WideString encodeHighLevel(CFX_WideString msg,
                                         CFX_WideString ecLevel,
                                         int32_t& e);
@@ -59,15 +59,15 @@
   static const wchar_t* MACRO_05_HEADER;
   static const wchar_t* MACRO_06_HEADER;
   static const wchar_t MACRO_TRAILER;
-  CFX_ByteArray m_bytearray;
+  CFX_ArrayTemplate<uint8_t> m_bytearray;
 
  private:
   static FX_WCHAR randomize253State(FX_WCHAR ch, int32_t codewordPosition);
   static int32_t findMinimums(std::vector<FX_FLOAT>& charCounts,
-                              CFX_Int32Array& intCharCounts,
+                              CFX_ArrayTemplate<int32_t>& intCharCounts,
                               int32_t min,
-                              CFX_ByteArray& mins);
-  static int32_t getMinimumCount(CFX_ByteArray& mins);
+                              CFX_ArrayTemplate<uint8_t>& mins);
+  static int32_t getMinimumCount(CFX_ArrayTemplate<uint8_t>& mins);
   static bool isNativeC40(FX_WCHAR ch);
   static bool isNativeText(FX_WCHAR ch);
   static bool isNativeX12(FX_WCHAR ch);
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417.cpp b/xfa/fxbarcode/pdf417/BC_PDF417.cpp
index 9b8d0c1..16ed6fd 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417.cpp
@@ -410,7 +410,7 @@
       CBC_PDF417HighLevelEncoder::encodeHighLevel(msg, m_compaction, e);
   BC_EXCEPTION_CHECK_ReturnVoid(e);
   int32_t sourceCodeWords = highLevel.GetLength();
-  CFX_Int32Array* dimension =
+  CFX_ArrayTemplate<int32_t>* dimension =
       determineDimensions(sourceCodeWords, errorCorrectionCodeWords, e);
   BC_EXCEPTION_CHECK_ReturnVoid(e);
   int32_t cols = dimension->GetAt(0);
@@ -532,12 +532,12 @@
   }
 }
 
-CFX_Int32Array* CBC_PDF417::determineDimensions(
+CFX_ArrayTemplate<int32_t>* CBC_PDF417::determineDimensions(
     int32_t sourceCodeWords,
     int32_t errorCorrectionCodeWords,
     int32_t& e) {
   FX_FLOAT ratio = 0.0f;
-  CFX_Int32Array* dimension = nullptr;
+  CFX_ArrayTemplate<int32_t>* dimension = nullptr;
   for (int32_t cols = m_minCols; cols <= m_maxCols; cols++) {
     int32_t rows =
         calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols);
@@ -555,7 +555,7 @@
     }
     ratio = newRatio;
     delete dimension;
-    dimension = new CFX_Int32Array;
+    dimension = new CFX_ArrayTemplate<int32_t>;
     dimension->Add(cols);
     dimension->Add(rows);
   }
@@ -563,11 +563,11 @@
     int32_t rows = calculateNumberOfRows(sourceCodeWords,
                                          errorCorrectionCodeWords, m_minCols);
     if (rows < m_minRows) {
-      dimension = new CFX_Int32Array;
+      dimension = new CFX_ArrayTemplate<int32_t>;
       dimension->Add(m_minCols);
       dimension->Add(m_minRows);
     } else if (rows >= 3 && rows <= 90) {
-      dimension = new CFX_Int32Array;
+      dimension = new CFX_ArrayTemplate<int32_t>;
       dimension->Add(m_minCols);
       dimension->Add(rows);
     }
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417.h b/xfa/fxbarcode/pdf417/BC_PDF417.h
index 5f7c2d4..3ba5aa2 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417.h
@@ -51,9 +51,10 @@
                       int32_t r,
                       int32_t errorCorrectionLevel,
                       CBC_BarcodeMatrix* logic);
-  CFX_Int32Array* determineDimensions(int32_t sourceCodeWords,
-                                      int32_t errorCorrectionCodeWords,
-                                      int32_t& e);
+  CFX_ArrayTemplate<int32_t>* determineDimensions(
+      int32_t sourceCodeWords,
+      int32_t errorCorrectionCodeWords,
+      int32_t& e);
 
   std::unique_ptr<CBC_BarcodeMatrix> m_barcodeMatrix;
   bool m_compact;
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp
index f348d2c..c1f4da1 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp
@@ -59,16 +59,16 @@
 int32_t CBC_BarcodeMatrix::getHeight() {
   return m_outHeight;
 }
-CFX_ByteArray& CBC_BarcodeMatrix::getMatrix() {
+CFX_ArrayTemplate<uint8_t>& CBC_BarcodeMatrix::getMatrix() {
   return getScaledMatrix(1, 1);
 }
-CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(int32_t scale) {
+CFX_ArrayTemplate<uint8_t>& CBC_BarcodeMatrix::getScaledMatrix(int32_t scale) {
   return getScaledMatrix(scale, scale);
 }
-CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(int32_t xScale,
-                                                  int32_t yScale) {
+CFX_ArrayTemplate<uint8_t>& CBC_BarcodeMatrix::getScaledMatrix(int32_t xScale,
+                                                               int32_t yScale) {
   int32_t yMax = m_height * yScale;
-  CFX_ByteArray bytearray;
+  CFX_ArrayTemplate<uint8_t> bytearray;
   bytearray.Copy(m_matrix[0]->getScaledRow(xScale));
   int32_t xMax = bytearray.GetSize();
   m_matrixOut.SetSize(xMax * yMax);
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h
index 0f69222..95ab547 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h
@@ -21,15 +21,15 @@
   void setMatrix(int32_t x, int32_t y, bool black);
   void startRow();
   CBC_BarcodeRow* getCurrentRow();
-  CFX_ByteArray& getMatrix();
-  CFX_ByteArray& getScaledMatrix(int32_t scale);
-  CFX_ByteArray& getScaledMatrix(int32_t xScale, int32_t yScale);
+  CFX_ArrayTemplate<uint8_t>& getMatrix();
+  CFX_ArrayTemplate<uint8_t>& getScaledMatrix(int32_t scale);
+  CFX_ArrayTemplate<uint8_t>& getScaledMatrix(int32_t xScale, int32_t yScale);
   int32_t getWidth();
   int32_t getHeight();
 
  private:
   CFX_ArrayTemplate<CBC_BarcodeRow*> m_matrix;
-  CFX_ByteArray m_matrixOut;
+  CFX_ArrayTemplate<uint8_t> m_matrixOut;
   int32_t m_currentRow;
   int32_t m_height;
   int32_t m_width;
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp
index b721ffc..243af70 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp
@@ -41,10 +41,10 @@
     set(m_currentLocation++, black);
   }
 }
-CFX_ByteArray& CBC_BarcodeRow::getRow() {
+CFX_ArrayTemplate<uint8_t>& CBC_BarcodeRow::getRow() {
   return m_row;
 }
-CFX_ByteArray& CBC_BarcodeRow::getScaledRow(int32_t scale) {
+CFX_ArrayTemplate<uint8_t>& CBC_BarcodeRow::getScaledRow(int32_t scale) {
   m_output.SetSize(m_row.GetSize() * scale);
   for (int32_t i = 0; i < m_output.GetSize(); i++) {
     m_output[i] = (m_row[i / scale]);
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h
index 90e76ac..7d9d19c 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h
@@ -17,12 +17,12 @@
   void set(int32_t x, uint8_t value);
   void set(int32_t x, bool black);
   void addBar(bool black, int32_t width);
-  CFX_ByteArray& getRow();
-  CFX_ByteArray& getScaledRow(int32_t scale);
+  CFX_ArrayTemplate<uint8_t>& getRow();
+  CFX_ArrayTemplate<uint8_t>& getScaledRow(int32_t scale);
 
  private:
-  CFX_ByteArray m_row;
-  CFX_ByteArray m_output;
+  CFX_ArrayTemplate<uint8_t> m_row;
+  CFX_ArrayTemplate<uint8_t> m_output;
   int32_t m_currentLocation;
 };
 
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
index fa0e9bc..183566f 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
@@ -71,7 +71,7 @@
     }
     msg += ch;
   }
-  CFX_ByteArray byteArr;
+  CFX_ArrayTemplate<uint8_t> byteArr;
   for (int32_t k = 0; k < bytes.GetLength(); k++) {
     byteArr.Add(bytes.GetAt(k));
   }
@@ -260,7 +260,7 @@
   }
   return submode;
 }
-void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ByteArray* bytes,
+void CBC_PDF417HighLevelEncoder::encodeBinary(CFX_ArrayTemplate<uint8_t>* bytes,
                                               int32_t startpos,
                                               int32_t count,
                                               int32_t startmode,
@@ -387,7 +387,7 @@
 }
 int32_t CBC_PDF417HighLevelEncoder::determineConsecutiveBinaryCount(
     CFX_WideString msg,
-    CFX_ByteArray* bytes,
+    CFX_ArrayTemplate<uint8_t>* bytes,
     int32_t startpos,
     int32_t& e) {
   int32_t len = msg.GetLength();
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
index 39abe0f..38382c8 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
@@ -39,7 +39,7 @@
                             int32_t count,
                             CFX_WideString& sb,
                             int32_t initialSubmode);
-  static void encodeBinary(CFX_ByteArray* bytes,
+  static void encodeBinary(CFX_ArrayTemplate<uint8_t>* bytes,
                            int32_t startpos,
                            int32_t count,
                            int32_t startmode,
@@ -58,10 +58,11 @@
                                                 int32_t startpos);
   static int32_t determineConsecutiveTextCount(CFX_WideString msg,
                                                int32_t startpos);
-  static int32_t determineConsecutiveBinaryCount(CFX_WideString msg,
-                                                 CFX_ByteArray* bytes,
-                                                 int32_t startpos,
-                                                 int32_t& e);
+  static int32_t determineConsecutiveBinaryCount(
+      CFX_WideString msg,
+      CFX_ArrayTemplate<uint8_t>* bytes,
+      int32_t startpos,
+      int32_t& e);
 
   friend class PDF417HighLevelEncoder_EncodeNumeric_Test;
   friend class PDF417HighLevelEncoder_EncodeBinary_Test;
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
index a1b753e..2cd60fe 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
@@ -43,7 +43,7 @@
   CBC_PDF417HighLevelEncoder::Initialize();
   for (size_t i = 0; i < FX_ArraySize(encode_binary_cases); ++i) {
     EncodeBinaryCase* ptr = &encode_binary_cases[i];
-    CFX_ByteArray input_array;
+    CFX_ArrayTemplate<uint8_t> input_array;
     size_t input_length = strlen(ptr->input);
     input_array.SetSize(input_length);
     for (size_t j = 0; j < input_length; ++j) {
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp
index 4c9b5cb..72d1a05 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp
@@ -63,7 +63,7 @@
   int32_t lineThickness = 2;
   int32_t aspectRatio = 4;
   CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix();
-  CFX_ByteArray originalScale;
+  CFX_ArrayTemplate<uint8_t> originalScale;
   originalScale.Copy(barcodeMatrix->getScaledMatrix(
       lineThickness, aspectRatio * lineThickness));
   int32_t width = outWidth;
@@ -101,10 +101,10 @@
   FXSYS_memcpy(result, originalScale.GetData(), outHeight * outWidth);
   return result;
 }
-void CBC_PDF417Writer::rotateArray(CFX_ByteArray& bitarray,
+void CBC_PDF417Writer::rotateArray(CFX_ArrayTemplate<uint8_t>& bitarray,
                                    int32_t height,
                                    int32_t width) {
-  CFX_ByteArray temp;
+  CFX_ArrayTemplate<uint8_t> temp;
   temp.Copy(bitarray);
   for (int32_t ii = 0; ii < height; ii++) {
     int32_t inverseii = height - ii - 1;
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Writer.h b/xfa/fxbarcode/pdf417/BC_PDF417Writer.h
index 178d251..420c441 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417Writer.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Writer.h
@@ -27,7 +27,9 @@
   void SetTruncated(bool truncated);
 
  private:
-  void rotateArray(CFX_ByteArray& bitarray, int32_t width, int32_t height);
+  void rotateArray(CFX_ArrayTemplate<uint8_t>& bitarray,
+                   int32_t width,
+                   int32_t height);
   bool m_bTruncated;
 };
 
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
index 332f1de..ab17d24 100644
--- a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
@@ -95,7 +95,7 @@
                   e);
       BC_EXCEPTION_CHECK_ReturnVoid(e);
     } else if (tempMode == CBC_QRCoderMode::sBYTE) {
-      CFX_ByteArray bytes;
+      CFX_ArrayTemplate<uint8_t> bytes;
       CBC_UtilCodingConvert::LocaleToUtf8(splitResult.second, bytes);
       AppendModeInfo(tempMode, &headerAndDataBits, e);
       BC_EXCEPTION_CHECK_ReturnVoid(e);
@@ -722,7 +722,7 @@
   }
 }
 
-void CBC_QRCoderEncoder::Append8BitBytes(CFX_ByteArray& bytes,
+void CBC_QRCoderEncoder::Append8BitBytes(CFX_ArrayTemplate<uint8_t>& bytes,
                                          CBC_QRCoderBitVector* bits,
                                          int32_t& e) {
   for (int32_t i = 0; i < bytes.GetSize(); i++) {
@@ -734,7 +734,7 @@
 void CBC_QRCoderEncoder::AppendKanjiBytes(const CFX_ByteString& content,
                                           CBC_QRCoderBitVector* bits,
                                           int32_t& e) {
-  CFX_ByteArray bytes;
+  CFX_ArrayTemplate<uint8_t> bytes;
   uint32_t value = 0;
   for (int32_t i = 0; i < bytes.GetSize(); i += 2) {
     value = (uint32_t)((uint8_t)(content[i] << 8) | (uint8_t)content[i + 1]);
@@ -907,7 +907,7 @@
     int32_t numEcBytesInBlock,
     int32_t& e) {
   int32_t numDataBytes = dataBytes->Size();
-  CFX_Int32Array toEncode;
+  CFX_ArrayTemplate<int32_t> toEncode;
   toEncode.SetSize(numDataBytes + numEcBytesInBlock);
   for (int32_t i = 0; i < numDataBytes; i++) {
     toEncode[i] = (dataBytes->At(i));
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h
index 649938a..a1b078f 100644
--- a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h
@@ -62,7 +62,7 @@
                               CBC_QRCoderBitVector* bits,
                               CFX_ByteString encoding,
                               int32_t& e);
-  static void Append8BitBytes(CFX_ByteArray& bytes,
+  static void Append8BitBytes(CFX_ArrayTemplate<uint8_t>& bytes,
                               CBC_QRCoderBitVector* bits,
                               int32_t& e);
   static void AppendKanjiBytes(const CFX_ByteString& content,
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp
index b0b445b..b4effb9 100644
--- a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp
@@ -354,7 +354,7 @@
 int32_t CBC_QRCoderVersion::GetVersionNumber() {
   return m_versionNumber;
 }
-CFX_Int32Array* CBC_QRCoderVersion::GetAlignmentPatternCenters() {
+CFX_ArrayTemplate<int32_t>* CBC_QRCoderVersion::GetAlignmentPatternCenters() {
   return &m_alignmentPatternCenters;
 }
 int32_t CBC_QRCoderVersion::GetTotalCodeWords() {
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h
index 43b4b60..030dd51 100644
--- a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h
@@ -23,7 +23,7 @@
   int32_t GetTotalCodeWords();
   int32_t GetDimensionForVersion();
   CBC_CommonBitMatrix* BuildFunctionPattern(int32_t& e);
-  CFX_Int32Array* GetAlignmentPatternCenters();
+  CFX_ArrayTemplate<int32_t>* GetAlignmentPatternCenters();
   CBC_QRCoderECBlocks* GetECBlocksForLevel(
       CBC_QRCoderErrorCorrectionLevel* ecLevel);
   static CBC_QRCoderVersion* GetVersionForNumber(int32_t versionNumber,
@@ -48,7 +48,7 @@
 
   int32_t m_versionNumber;
   int32_t m_totalCodeWords;
-  CFX_Int32Array m_alignmentPatternCenters;
+  CFX_ArrayTemplate<int32_t> m_alignmentPatternCenters;
   CFX_ArrayTemplate<CBC_QRCoderECBlocks*> m_ecBlocksArray;
 };
 
diff --git a/xfa/fxbarcode/utils.h b/xfa/fxbarcode/utils.h
index 7473d41..cb6eed7 100644
--- a/xfa/fxbarcode/utils.h
+++ b/xfa/fxbarcode/utils.h
@@ -15,7 +15,8 @@
                               int32_t count,
                               FX_CHAR c);
 void BC_FX_ByteString_Append(CFX_ByteString& dst, int32_t count, FX_CHAR c);
-void BC_FX_ByteString_Append(CFX_ByteString& dst, const CFX_ByteArray& ba);
+void BC_FX_ByteString_Append(CFX_ByteString& dst,
+                             const CFX_ArrayTemplate<uint8_t>& ba);
 
 #if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_)
 #include <limits>
diff --git a/xfa/fxfa/app/cxfa_textlayout.h b/xfa/fxfa/app/cxfa_textlayout.h
index 4de53d1..cb0ad13 100644
--- a/xfa/fxfa/app/cxfa_textlayout.h
+++ b/xfa/fxfa/app/cxfa_textlayout.h
@@ -60,7 +60,7 @@
   }
 
   bool m_bHasBlock;
-  CFX_Int32Array m_Blocks;
+  CFX_ArrayTemplate<int32_t> m_Blocks;
 
  private:
   void GetTextDataNode();
diff --git a/xfa/fxfa/app/xfa_ffchoicelist.cpp b/xfa/fxfa/app/xfa_ffchoicelist.cpp
index 2764d72..e0e0469 100644
--- a/xfa/fxfa/app/xfa_ffchoicelist.cpp
+++ b/xfa/fxfa/app/xfa_ffchoicelist.cpp
@@ -65,7 +65,7 @@
   }
   dwExtendedStyle |= GetAlignment();
   m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
-  CFX_Int32Array iSelArray;
+  CFX_ArrayTemplate<int32_t> iSelArray;
   m_pDataAcc->GetSelectedItems(iSelArray);
   int32_t iSelCount = iSelArray.GetSize();
   for (int32_t j = 0; j < iSelCount; j++) {
@@ -86,7 +86,7 @@
 bool CXFA_FFListBox::CommitData() {
   CFWL_ListBox* pListBox = static_cast<CFWL_ListBox*>(m_pNormalWidget);
   int32_t iSels = pListBox->CountSelItems();
-  CFX_Int32Array iSelArray;
+  CFX_ArrayTemplate<int32_t> iSelArray;
   for (int32_t i = 0; i < iSels; ++i)
     iSelArray.Add(pListBox->GetSelIndex(i));
   m_pDataAcc->SetSelectedItems(iSelArray, true, false, true);
@@ -94,7 +94,7 @@
 }
 
 bool CXFA_FFListBox::IsDataChanged() {
-  CFX_Int32Array iSelArray;
+  CFX_ArrayTemplate<int32_t> iSelArray;
   m_pDataAcc->GetSelectedItems(iSelArray);
   int32_t iOldSels = iSelArray.GetSize();
   CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget;
@@ -140,7 +140,7 @@
   }
   CFWL_ListBox* pListBox = ((CFWL_ListBox*)m_pNormalWidget);
   CFX_ArrayTemplate<CFWL_ListItem*> selItemArray;
-  CFX_Int32Array iSelArray;
+  CFX_ArrayTemplate<int32_t> iSelArray;
   m_pDataAcc->GetSelectedItems(iSelArray);
   int32_t iSelCount = iSelArray.GetSize();
   for (int32_t j = 0; j < iSelCount; j++) {
@@ -154,8 +154,9 @@
   m_pNormalWidget->Update();
   return true;
 }
-void CXFA_FFListBox::OnSelectChanged(CFWL_Widget* pWidget,
-                                     const CFX_Int32Array& arrSels) {
+void CXFA_FFListBox::OnSelectChanged(
+    CFWL_Widget* pWidget,
+    const CFX_ArrayTemplate<int32_t>& arrSels) {
   CXFA_EventParam eParam;
   eParam.m_eType = XFA_EVENT_Change;
   eParam.m_pTarget = m_pDataAcc;
@@ -201,7 +202,7 @@
   CXFA_FFField::OnProcessEvent(pEvent);
   switch (pEvent->GetType()) {
     case CFWL_Event::Type::SelectChanged: {
-      CFX_Int32Array arrSels;
+      CFX_ArrayTemplate<int32_t> arrSels;
       OnSelectChanged(m_pNormalWidget, arrSels);
       break;
     }
@@ -256,7 +257,7 @@
   for (int32_t i = 0; i < iItems; i++) {
     pComboBox->AddString(wsLabelArray[i].AsStringC());
   }
-  CFX_Int32Array iSelArray;
+  CFX_ArrayTemplate<int32_t> iSelArray;
   m_pDataAcc->GetSelectedItems(iSelArray);
   int32_t iSelCount = iSelArray.GetSize();
   if (iSelCount > 0) {
@@ -383,7 +384,7 @@
   if (!m_pNormalWidget) {
     return false;
   }
-  CFX_Int32Array iSelArray;
+  CFX_ArrayTemplate<int32_t> iSelArray;
   m_pDataAcc->GetSelectedItems(iSelArray);
   int32_t iSelCount = iSelArray.GetSize();
   if (iSelCount > 0) {
diff --git a/xfa/fxfa/app/xfa_ffchoicelist.h b/xfa/fxfa/app/xfa_ffchoicelist.h
index e9bee6f..75057b0 100644
--- a/xfa/fxfa/app/xfa_ffchoicelist.h
+++ b/xfa/fxfa/app/xfa_ffchoicelist.h
@@ -23,7 +23,8 @@
   void OnDrawWidget(CFX_Graphics* pGraphics,
                     const CFX_Matrix* pMatrix = nullptr) override;
 
-  void OnSelectChanged(CFWL_Widget* pWidget, const CFX_Int32Array& arrSels);
+  void OnSelectChanged(CFWL_Widget* pWidget,
+                       const CFX_ArrayTemplate<int32_t>& arrSels);
   void SetItemState(int32_t nIndex, bool bSelected);
   void InsertItem(const CFX_WideStringC& wsLabel, int32_t nIndex = -1);
   void DeleteItem(int32_t nIndex);
diff --git a/xfa/fxfa/parser/cxfa_resolveprocessor.cpp b/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
index 271e14b..9bd3472 100644
--- a/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
@@ -497,7 +497,8 @@
   nodes.Append((CXFA_ObjArray&)array);
   return nodes.GetSize();
 }
-int32_t CXFA_ResolveProcessor::ResolvePopStack(CFX_Int32Array& stack) {
+int32_t CXFA_ResolveProcessor::ResolvePopStack(
+    CFX_ArrayTemplate<int32_t>& stack) {
   int32_t nType = -1;
   int32_t iSize = stack.GetSize() - 1;
   if (iSize > -1) {
@@ -520,7 +521,7 @@
   FX_WCHAR* pConditionBuf = wsCondition.GetBuffer(iLength - nStart);
   int32_t nNameCount = 0;
   int32_t nConditionCount = 0;
-  CFX_Int32Array stack;
+  CFX_ArrayTemplate<int32_t> stack;
   int32_t nType = -1;
   const FX_WCHAR* pSrc = wsExpression.c_str();
   FX_WCHAR wPrev = 0, wCur;
diff --git a/xfa/fxfa/parser/cxfa_resolveprocessor.h b/xfa/fxfa/parser/cxfa_resolveprocessor.h
index 2590021..d806d57 100644
--- a/xfa/fxfa/parser/cxfa_resolveprocessor.h
+++ b/xfa/fxfa/parser/cxfa_resolveprocessor.h
@@ -60,7 +60,7 @@
   int32_t ResolveNumberSign(CXFA_ResolveNodesData& rnd);
   int32_t ResolveAsterisk(CXFA_ResolveNodesData& rnd);
   int32_t ResolveNormal(CXFA_ResolveNodesData& rnd);
-  int32_t ResolvePopStack(CFX_Int32Array& stack);
+  int32_t ResolvePopStack(CFX_ArrayTemplate<int32_t>& stack);
   void SetStylesForChild(uint32_t dwParentStyles, CXFA_ResolveNodesData& rnd);
 
   void ConditionArray(int32_t iCurIndex,
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
index 80c50b7..31c5cf4 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -874,7 +874,7 @@
   return -1;
 }
 
-void CXFA_WidgetData::GetSelectedItems(CFX_Int32Array& iSelArray) {
+void CXFA_WidgetData::GetSelectedItems(CFX_ArrayTemplate<int32_t>& iSelArray) {
   std::vector<CFX_WideString> wsValueArray;
   GetSelectedItemsValue(wsValueArray);
   int32_t iValues = pdfium::CollectionSize<int32_t>(wsValueArray);
@@ -973,7 +973,7 @@
                             bSyncData);
       }
     } else if (iSel >= 0) {
-      CFX_Int32Array iSelArray;
+      CFX_ArrayTemplate<int32_t> iSelArray;
       GetSelectedItems(iSelArray);
       for (int32_t i = 0; i < iSelArray.GetSize(); i++) {
         if (iSelArray[i] == nIndex) {
@@ -999,7 +999,7 @@
   }
 }
 
-void CXFA_WidgetData::SetSelectedItems(CFX_Int32Array& iSelArray,
+void CXFA_WidgetData::SetSelectedItems(CFX_ArrayTemplate<int32_t>& iSelArray,
                                        bool bNotify,
                                        bool bScriptModify,
                                        bool bSyncData) {
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.h b/xfa/fxfa/parser/cxfa_widgetdata.h
index 7986fa9..4f5db3b 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.h
+++ b/xfa/fxfa/parser/cxfa_widgetdata.h
@@ -102,7 +102,7 @@
                           bool bSaveValue = false);
   int32_t CountSelectedItems();
   int32_t GetSelectedItem(int32_t nIndex = 0);
-  void GetSelectedItems(CFX_Int32Array& iSelArray);
+  void GetSelectedItems(CFX_ArrayTemplate<int32_t>& iSelArray);
   void GetSelectedItemsValue(std::vector<CFX_WideString>& wsSelTextArray);
   bool GetItemState(int32_t nIndex);
   void SetItemState(int32_t nIndex,
@@ -110,7 +110,7 @@
                     bool bNotify,
                     bool bScriptModify,
                     bool bSyncData);
-  void SetSelectedItems(CFX_Int32Array& iSelArray,
+  void SetSelectedItems(CFX_ArrayTemplate<int32_t>& iSelArray,
                         bool bNotify,
                         bool bScriptModify,
                         bool bSyncData);
