diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..06ab010
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+SOURCES/poppler-21.01.0.tar.xz
+SOURCES/poppler-test-2021-06-14.tar.xz
diff --git a/.poppler.metadata b/.poppler.metadata
new file mode 100644
index 0000000..5b0a25b
--- /dev/null
+++ b/.poppler.metadata
@@ -0,0 +1,2 @@
+692697b218efd08ebaeb4ff96861a4d2ad20bdc2 SOURCES/poppler-21.01.0.tar.xz
+bd4b27622506278016668f7c5037f9e47a41abfb SOURCES/poppler-test-2021-06-14.tar.xz
diff --git a/SOURCES/poppler-0.30.0-rotated-words-selection.patch b/SOURCES/poppler-0.30.0-rotated-words-selection.patch
new file mode 100644
index 0000000..98230f9
--- /dev/null
+++ b/SOURCES/poppler-0.30.0-rotated-words-selection.patch
@@ -0,0 +1,279 @@
+From 0ab1f29d4ce315b0fca260c0e0f3007024d00342 Mon Sep 17 00:00:00 2001
+From: Marek Kasik <mkasik@redhat.com>
+Date: Tue, 28 Jan 2014 15:13:24 +0100
+Subject: [PATCH] TextOutputDev: Respect orientation when selecting words
+
+Take rotation into account when visiting selection.
+This doesn't fix all problems (there are still problems
+on line and block levels).
+
+https://bugs.freedesktop.org/show_bug.cgi?id=16619
+---
+ poppler/TextOutputDev.cc | 193 ++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 150 insertions(+), 43 deletions(-)
+
+diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc
+index 7c2ca78..e93908c 100644
+--- a/poppler/TextOutputDev.cc
++++ b/poppler/TextOutputDev.cc
+@@ -178,6 +178,12 @@
+ // to read the underlying image. Issue #157
+ #define glyphlessSelectionOpacity 0.4
+ 
++// Returns whether x is between a and b or equal to a or b.
++// a and b don't need to be sorted.
++#define XBetweenAB(x,a,b) (!(((x) > (a) && (x) > (b)) || \
++                             ((x) < (a) && (x) < (b))) ? \
++                           true : false)
++
+ namespace {
+ 
+ inline bool isAscii7(Unicode uchar)
+@@ -4411,11 +4417,37 @@ void TextSelectionSizer::visitLine (TextLine *line,
+     PDFRectangle *rect;
+     double x1, y1, x2, y2, margin;
+ 
+-    margin = (line->yMax - line->yMin) / 8;
+-    x1 = line->edge[edge_begin];
+-    y1 = line->yMin - margin;
+-    x2 = line->edge[edge_end];
+-    y2 = line->yMax + margin;
++    switch (line->rot) {
++    default:
++    case 0:
++        margin = (line->yMax - line->yMin) / 8;
++        x1 = line->edge[edge_begin];
++        x2 = line->edge[edge_end];
++        y1 = line->yMin - margin;
++        y2 = line->yMax + margin;
++        break;
++    case 1:
++        margin = (line->xMax - line->xMin) / 8;
++        x1 = line->xMin - margin;
++        x2 = line->xMax + margin;
++        y1 = line->edge[edge_begin];
++        y2 = line->edge[edge_end];
++        break;
++    case 2:
++        margin = (line->yMax - line->yMin) / 8;
++        x1 = line->edge[edge_end];
++        x2 = line->edge[edge_begin];
++        y1 = line->yMin - margin;
++        y2 = line->yMax + margin;
++        break;
++    case 3:
++        margin = (line->xMax - line->xMin) / 8;
++        x1 = line->xMin - margin;
++        x2 = line->xMax + margin;
++        y1 = line->edge[edge_end];
++        y2 = line->edge[edge_begin];
++        break;
++    }
+ 
+     rect = new PDFRectangle(floor(x1 * scale), floor(y1 * scale), ceil(x2 * scale), ceil(y2 * scale));
+     list->push_back(rect);
+@@ -4499,19 +4531,56 @@ void TextSelectionPainter::visitLine (TextLine *line,
+ {
+     double x1, y1, x2, y2, margin;
+ 
+-    margin = (line->yMax - line->yMin) / 8;
+-    x1 = floor(line->edge[edge_begin]);
+-    y1 = floor(line->yMin - margin);
+-    x2 = ceil(line->edge[edge_end]);
+-    y2 = ceil(line->yMax + margin);
++    switch (line->rot) {
++    default:
++    case 0:
++        margin = (line->yMax - line->yMin) / 8;
++        x1 = line->edge[edge_begin];
++        x2 = line->edge[edge_end];
++        y1 = line->yMin - margin;
++        y2 = line->yMax + margin;
++        break;
++    case 1:
++        margin = (line->xMax - line->xMin) / 8;
++        x1 = line->xMin - margin;
++        x2 = line->xMax + margin;
++        y1 = line->edge[edge_begin];
++        y2 = line->edge[edge_end];
++        break;
++    case 2:
++        margin = (line->yMax - line->yMin) / 8;
++        x1 = line->edge[edge_end];
++        x2 = line->edge[edge_begin];
++        y1 = line->yMin - margin;
++        y2 = line->yMax + margin;
++        break;
++    case 3:
++        margin = (line->xMax - line->xMin) / 8;
++        x1 = line->xMin - margin;
++        x2 = line->xMax + margin;
++        y1 = line->edge[edge_end];
++        y2 = line->edge[edge_begin];
++        break;
++    }
++
++    ctm.transform(x1, y1, &x1, &y1);
++    ctm.transform(x2, y2, &x2, &y2);
+ 
+-    ctm.transform(line->edge[edge_begin], line->yMin - margin, &x1, &y1);
+-    ctm.transform(line->edge[edge_end], line->yMax + margin, &x2, &y2);
++    if (x1 < x2) {
++        x1 = floor(x1);
++        x2 = ceil(x2);
++    } else {
++        x1 = ceil(x1);
++        x2 = floor(x2);
++    }
+ 
+-    x1 = floor(x1);
+-    y1 = floor(y1);
+-    x2 = ceil(x2);
+-    y2 = ceil(y2);
++    if (y1 < y2) {
++        y1 = floor(y1);
++        y2 = ceil(y2);
++    } else {
++        y1 = ceil(y1);
++        y2 = floor(y2);
++    }
+ 
+     ictm.transform(x1, y1, &x1, &y1);
+     ictm.transform(x2, y2, &x2, &y2);
+@@ -4589,17 +4658,26 @@ void TextWord::visitSelection(TextSelectionVisitor *visitor,
+ void TextWord::visitSelection(TextSelectionVisitor *visitor, const PDFRectangle *selection, SelectionStyle style)
+ {
+     int i, begin, end;
+-    double mid;
++    double mid, s1, s2;
++
++    if (rot == 0 || rot == 2) {
++        s1 = selection->x1;
++        s2 = selection->x2;
++    } else {
++        s1 = selection->y1;
++        s2 = selection->y2;
++    }
+ 
+     begin = len;
+     end = 0;
+     for (i = 0; i < len; i++) {
+         mid = (edge[i] + edge[i + 1]) / 2;
+-        if (selection->x1 < mid || selection->x2 < mid)
+-            if (i < begin)
+-                begin = i;
+-        if (mid < selection->x1 || mid < selection->x2)
+-            end = i + 1;
++      if (XBetweenAB (mid, s1, s2)) {
++          if (i < begin)
++              begin = i;
++
++          end = i + 1;
++      }
+     }
+ 
+     /* Skip empty selection. */
+@@ -4615,26 +4694,41 @@ void TextLine::visitSelection(TextSelectionVisitor *visitor,
+     TextWord *p, *begin, *end, *current;
+     int i, edge_begin, edge_end;
+     PDFRectangle child_selection;
++    double s1, s2, p_min, p_max;
++
++    if (rot == 0 || rot == 2) {
++        s1 = selection->x1;
++        s2 = selection->x2;
++    } else {
++        s1 = selection->y1;
++        s2 = selection->y2;
++    }
+ 
+     begin = nullptr;
+     end = nullptr;
+     current = nullptr;
+     for (p = words; p != nullptr; p = p->next) {
++        if (rot == 0 || rot == 2) {
++            p_min = p->xMin;
++            p_max = p->xMax;
++        } else {
++            p_min = p->yMin;
++            p_max = p->yMax;
++        }
++
+         if (blk->page->primaryLR) {
+-            if ((selection->x1 < p->xMax) || (selection->x2 < p->xMax))
+-                if (begin == nullptr)
+-                    begin = p;
++            if (((s1 < p_max) || (s2 < p_max)) && begin == nullptr)
++                begin = p;
+ 
+-            if (((selection->x1 > p->xMin) || (selection->x2 > p->xMin)) && (begin != nullptr)) {
++            if (((s1 > p_min) || (s2 > p_min)) && begin != nullptr) {
+                 end = p->next;
+                 current = p;
+             }
+         } else {
+-            if ((selection->x1 > p->xMin) || (selection->x2 > p->xMin))
+-                if (begin == nullptr)
+-                    begin = p;
++            if (((s1 > p_min) || (s2 > p_min)) && begin == nullptr)
++                begin = p;
+ 
+-            if (((selection->x1 < p->xMax) || (selection->x2 < p->xMax)) && (begin != nullptr)) {
++            if (((s1 < p_max) || (s2 < p_max)) && begin != nullptr) {
+                 end = p->next;
+                 current = p;
+             }
+@@ -4650,23 +4740,41 @@ void TextLine::visitSelection(TextSelectionVisitor *visitor,
+ 
+     child_selection = *selection;
+     if (style == selectionStyleWord) {
+-        child_selection.x1 = begin ? begin->xMin : xMin;
+-        if (end && end->xMax != -1) {
+-            child_selection.x2 = current->xMax;
++        if (rot == 0 || rot == 2) {
++            child_selection.x1 = begin ? begin->xMin : xMin;
++            if (end && end->xMax != -1) {
++                child_selection.x2 = current->xMax;
++            } else {
++                child_selection.x2 = xMax;
++            }
+         } else {
+-            child_selection.x2 = xMax;
++            child_selection.y1 = begin ? begin->yMin : yMin;
++            if (end && end->yMax != -1) {
++                child_selection.y2 = current->yMax;
++            } else {
++                child_selection.y2 = yMax;
++            }
+         }
+     }
+ 
++    if (rot == 0 || rot == 2) {
++        s1 = child_selection.x1;
++        s2 = child_selection.x2;
++    } else {
++        s1 = child_selection.y1;
++        s2 = child_selection.y2;
++    }
++
+     edge_begin = len;
+     edge_end = 0;
+     for (i = 0; i < len; i++) {
+         double mid = (edge[i] + edge[i + 1]) / 2;
+-        if (child_selection.x1 < mid || child_selection.x2 < mid)
+-            if (i < edge_begin)
+-                edge_begin = i;
+-        if (mid < child_selection.x2 || mid < child_selection.x1)
+-            edge_end = i + 1;
++        if (XBetweenAB (mid, s1, s2)) {
++            if (i < edge_begin)
++                edge_begin = i;
++
++            edge_end = i + 1;
++        }
+     }
+ 
+     /* Skip empty selection. */
+-- 
+1.8.4.2
+
diff --git a/SOURCES/poppler-0.90.0-position-independent-code.patch b/SOURCES/poppler-0.90.0-position-independent-code.patch
new file mode 100644
index 0000000..3d385fd
--- /dev/null
+++ b/SOURCES/poppler-0.90.0-position-independent-code.patch
@@ -0,0 +1,12 @@
+--- poppler-0.90.0/CMakeLists.txt
++++ poppler-0.90.0/CMakeLists.txt
+@@ -17,6 +17,9 @@ else()
+   set(THREADS_PREFER_PTHREAD_FLAG TRUE)
+   find_package(Threads)
+ endif()
++
++set(CMAKE_POSITION_INDEPENDENT_CODE ON)
++
+ include(TestBigEndian)
+ test_big_endian(WORDS_BIGENDIAN)
+ include(CheckFileOffsetBits)
diff --git a/SOURCES/poppler-21.01.0-covscan.patch b/SOURCES/poppler-21.01.0-covscan.patch
new file mode 100644
index 0000000..0e77616
--- /dev/null
+++ b/SOURCES/poppler-21.01.0-covscan.patch
@@ -0,0 +1,439 @@
+--- poppler/glib/poppler-document.cc
++++ poppler/glib/poppler-document.cc
+@@ -869,12 +869,12 @@ GTree *poppler_document_create_dests_tre
+     // Iterate from name-dict
+     const int nDests = catalog->numDests();
+     for (i = 0; i < nDests; ++i) {
+-        // The names of name-dict cannot contain \0,
+-        // so we can use strlen().
+-        auto name = catalog->getDestsName(i);
+-        key = poppler_named_dest_from_bytestring(reinterpret_cast<const guint8 *>(name), strlen(name));
+         std::unique_ptr<LinkDest> link_dest = catalog->getDestsDest(i);
+         if (link_dest) {
++            // The names of name-dict cannot contain \0,
++            // so we can use strlen().
++            auto name = catalog->getDestsName(i);
++            key = poppler_named_dest_from_bytestring(reinterpret_cast<const guint8 *>(name), strlen(name));
+             dest = _poppler_dest_new_goto(document, link_dest.get());
+             g_tree_insert(tree, key, dest);
+         }
+@@ -883,10 +883,10 @@ GTree *poppler_document_create_dests_tre
+     // Iterate form name-tree
+     const int nDestsNameTree = catalog->numDestNameTree();
+     for (i = 0; i < nDestsNameTree; ++i) {
+-        auto name = catalog->getDestNameTreeName(i);
+-        key = poppler_named_dest_from_bytestring(reinterpret_cast<const guint8 *>(name->c_str()), name->getLength());
+         std::unique_ptr<LinkDest> link_dest = catalog->getDestNameTreeDest(i);
+         if (link_dest) {
++            auto name = catalog->getDestNameTreeName(i);
++            key = poppler_named_dest_from_bytestring(reinterpret_cast<const guint8 *>(name->c_str()), name->getLength());
+             dest = _poppler_dest_new_goto(document, link_dest.get());
+             g_tree_insert(tree, key, dest);
+         }
+@@ -3405,6 +3405,7 @@ PopplerFormField *poppler_document_get_f
+     unsigned fieldNum;
+     FormPageWidgets *widgets;
+     FormWidget *field;
++    PopplerFormField *formField;
+ 
+     FormWidget::decodeID(id, &pageNum, &fieldNum);
+ 
+@@ -3417,8 +3418,14 @@ PopplerFormField *poppler_document_get_f
+         return nullptr;
+ 
+     field = widgets->getWidget(fieldNum);
+-    if (field)
+-        return _poppler_form_field_new(document, field);
++    if (field) {
++        formField = _poppler_form_field_new(document, field);
++        delete widgets;
++
++        return formField;
++    }
++
++    delete widgets;
+ 
+     return nullptr;
+ }
+--- poppler-21.01.0/glib/poppler-page.cc
++++ poppler-21.01.0/glib/poppler-page.cc
+@@ -1530,15 +1530,18 @@ void poppler_page_add_annot(PopplerPage
+              * first remove cropbox of the prior page before adding cropbox of the new page later */
+             quads = new_quads_from_offset_cropbox(crop_box, annot_markup->getQuadrilaterals(), FALSE);
+             annot_markup->setQuadrilaterals(quads);
++            delete quads;
+         }
+         if (page_is_rotated) {
+             /* Quadrilateral's coords need to be saved un-rotated (same as rect coords) */
+             quads = _page_new_quads_unrotated(page->page, annot_markup->getQuadrilaterals());
+             annot_markup->setQuadrilaterals(quads);
++            delete quads;
+         }
+         /* Add to annot's quadrilaterals the offset for the cropbox of the new page */
+         quads = new_quads_from_offset_cropbox(page_crop_box, annot_markup->getQuadrilaterals(), TRUE);
+         annot_markup->setQuadrilaterals(quads);
++        delete quads;
+     }
+ 
+     page->page->addAnnot(annot->annot);
+--- poppler-21.01.0/glib/poppler-structure-element.cc
++++ poppler-21.01.0/glib/poppler-structure-element.cc
+@@ -1090,6 +1090,8 @@ static inline void convert_doubles_array
+     for (guint i = 0; i < *n_values; i++) {
+         doubles[i] = object->arrayGet(i).getNum();
+     }
++
++    values = &doubles;
+ }
+ 
+ static inline void convert_color(Object *object, PopplerColor *color)
+--- poppler-21.01.0/poppler/Form.cc
++++ poppler-21.01.0/poppler/Form.cc
+@@ -549,6 +549,7 @@ bool FormWidgetSignature::signDocument(c
+     GooString *fname = new GooString(saveFilename);
+     if (doc->saveAs(fname, writeForceIncremental) != errNone) {
+         fprintf(stderr, "signDocument: error saving to file \"%s\"\n", saveFilename);
++        delete fname;
+         return false;
+     }
+ 
+@@ -563,6 +564,8 @@ bool FormWidgetSignature::signDocument(c
+     FILE *file = openFile(saveFilename, "r+b");
+     if (!updateOffsets(file, objStart, objEnd, &sigStart, &sigEnd, &fileSize)) {
+         fprintf(stderr, "signDocument: unable update byte range\n");
++        delete fname;
++        fclose(file);
+         return false;
+     }
+ 
+@@ -574,15 +577,21 @@ bool FormWidgetSignature::signDocument(c
+     // and sign it
+     const std::unique_ptr<GooString> signature = sigHandler.signDetached(password);
+-    if (!signature)
++    if (!signature) {
++        delete fname;
++        fclose(file);
+         return false;
++    }
+ 
+     // write signature to saved file
+     if (!updateSignature(file, sigStart, sigEnd, signature.get())) {
+         fprintf(stderr, "signDocument: unable update signature\n");
++        delete fname;
++        fclose(file);
+         return false;
+     }
+     signatureField->setSignature(*signature);
+ 
++    delete fname;
+     fclose(file);
+ 
+     return true;
+@@ -662,22 +670,30 @@ bool FormWidgetSignature::updateOffsets(
+         }
+     }
+ 
+-    if (*sigStart == -1 || *sigEnd == -1)
++    if (*sigStart == -1 || *sigEnd == -1) {
++        free(buf);
+         return false;
++    }
+ 
+     // Search for ByteRange array and update offsets
+     for (int i = 0; i < bufSize - 10; i++) {
+         if (buf[i] == '/' && strncmp(&buf[i], "/ByteRange", 10) == 0) {
+             // update range
+             char *p = setNextOffset(&buf[i], *sigStart);
+-            if (!p)
++            if (!p) {
++                free(buf);
+                 return false;
++            }
+             p = setNextOffset(p, *sigEnd);
+-            if (!p)
++            if (!p) {
++                free(buf);
+                 return false;
++            }
+             p = setNextOffset(p, *fileSize - *sigEnd);
+-            if (!p)
++            if (!p) {
++                free(buf);
+                 return false;
++            }
+             break;
+         }
+     }
+--- poppler-21.01.0/poppler/JBIG2Stream.cc
++++ poppler-21.01.0/poppler/JBIG2Stream.cc
+@@ -2834,6 +2834,8 @@ JBIG2Bitmap *JBIG2Stream::readGenericBit
+ 
+         if (unlikely(!codingLine || !refLine)) {
+             error(errSyntaxError, curStr->getPos(), "Bad width in JBIG2 generic bitmap");
++            gfree(refLine);
++            gfree(codingLine);
+             delete bitmap;
+             return nullptr;
+         }
+--- poppler-21.01.0/poppler/Lexer.cc
++++ poppler-21.01.0/poppler/Lexer.cc
+@@ -461,6 +461,7 @@ Object Lexer::getObj(int objNum)
+             } else if (n == tokBufSize) {
+                 error(errSyntaxError, getPos(), "Warning: name token is longer than what the specification says it can be");
+                 *p = c;
++                delete s;
+                 s = new GooString(tokBuf, n);
+             } else {
+                 s->append((char)c);
+@@ -468,6 +468,7 @@ Object Lexer::getObj(int objNum)
+         }
+         if (n < tokBufSize) {
+             *p = '\0';
++            delete s;
+             return Object(objName, tokBuf);
+         } else {
+             Object obj(objName, s->c_str());
+--- poppler/poppler/CairoOutputDev.cc
++++ poppler/poppler/CairoOutputDev.cc
+@@ -2921,8 +2921,10 @@ void CairoOutputDev::setMimeData(GfxStat
+ 
+     // colorspace in stream dict may be different from colorspace in jpx
+     // data
+-    if (strKind == strJPX && colorSpace)
++    if (strKind == strJPX && colorSpace) {
++        delete colorSpace;
+         return;
++    }
+ 
+     // only embed mime data for gray, rgb, and cmyk colorspaces.
+     if (colorSpace) {
+--- poppler/poppler/TextOutputDev.cc
++++ poppler/poppler/TextOutputDev.cc
+@@ -20,7 +20,7 @@
+ // Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net>
+ // Copyright (C) 2007, 2008, 2012, 2017 Adrian Johnson <ajohnson@redneon.com>
+ // Copyright (C) 2008 Koji Otani <sho@bbr.jp>
+-// Copyright (C) 2008, 2010-2012, 2014-2020 Albert Astals Cid <aacid@kde.org>
++// Copyright (C) 2008, 2010-2012, 2014-2021 Albert Astals Cid <aacid@kde.org>
+ // Copyright (C) 2008 Pino Toscano <pino@kde.org>
+ // Copyright (C) 2008, 2010 Hib Eris <hib@hiberis.nl>
+ // Copyright (C) 2009 Ross Moore <ross@maths.mq.edu.au>
+@@ -1619,7 +1619,6 @@ TextBlock::~TextBlock()
+ 
+ void TextBlock::addWord(TextWord *word)
+ {
+-    pool->addWord(word);
+     if (xMin > xMax) {
+         xMin = word->xMin;
+         xMax = word->xMax;
+@@ -1639,6 +1638,7 @@ void TextBlock::addWord(TextWord *word)
+             yMax = word->yMax;
+         }
+     }
++    pool->addWord(word);
+ }
+ 
+ void TextBlock::coalesce(const UnicodeMap *uMap, double fixedPitch)
+@@ -3064,11 +3064,13 @@ void TextPage::coalesce(bool physLayout,
+             word0 = pool->getPool(startBaseIdx);
+             pool->setPool(startBaseIdx, word0->next);
+             word0->next = nullptr;
+-            blk = new TextBlock(this, rot);
+-            blk->addWord(word0);
+ 
+             fontSize = word0->fontSize;
+             minBase = maxBase = word0->base;
++
++            blk = new TextBlock(this, rot);
++            blk->addWord(word0);
++
+             colSpace1 = minColSpacing1 * fontSize;
+             colSpace2 = minColSpacing2 * fontSize;
+             lineSpace = maxLineSpacingDelta * fontSize;
+@@ -3095,9 +3097,9 @@ void TextPage::coalesce(bool physLayout,
+                             }
+                             word1 = word1->next;
+                             word2->next = nullptr;
++                            newMinBase = word2->base;
+                             blk->addWord(word2);
+                             found = true;
+-                            newMinBase = word2->base;
+                         } else {
+                             word0 = word1;
+                             word1 = word1->next;
+@@ -3123,9 +3125,9 @@ void TextPage::coalesce(bool physLayout,
+                             }
+                             word1 = word1->next;
+                             word2->next = nullptr;
++                            newMaxBase = word2->base;
+                             blk->addWord(word2);
+                             found = true;
+-                            newMaxBase = word2->base;
+                         } else {
+                             word0 = word1;
+                             word1 = word1->next;
+@@ -3198,12 +3200,12 @@ void TextPage::coalesce(bool physLayout,
+                                 }
+                                 word1 = word1->next;
+                                 word2->next = nullptr;
+-                                blk->addWord(word2);
+                                 if (word2->base < minBase) {
+                                     minBase = word2->base;
+                                 } else if (word2->base > maxBase) {
+                                     maxBase = word2->base;
+                                 }
++                                blk->addWord(word2);
+                                 found = true;
+                                 break;
+                             } else {
+@@ -3246,12 +3248,12 @@ void TextPage::coalesce(bool physLayout,
+                                 }
+                                 word1 = word1->next;
+                                 word2->next = nullptr;
+-                                blk->addWord(word2);
+                                 if (word2->base < minBase) {
+                                     minBase = word2->base;
+                                 } else if (word2->base > maxBase) {
+                                     maxBase = word2->base;
+                                 }
++                                blk->addWord(word2);
+                                 found = true;
+                                 break;
+                             } else {
+@@ -4456,13 +4456,18 @@ class TextSelectionSizer : public TextSe
+ {
+ public:
+     TextSelectionSizer(TextPage *page, double scale);
+-    ~TextSelectionSizer() override { }
++    ~TextSelectionSizer() override { delete list; }
+ 
+     void visitBlock(TextBlock *block, TextLine *begin, TextLine *end, const PDFRectangle *selection) override {};
+     void visitLine(TextLine *line, TextWord *begin, TextWord *end, int edge_begin, int edge_end, const PDFRectangle *selection) override;
+     void visitWord(TextWord *word, int begin, int end, const PDFRectangle *selection) override {};
+ 
+-    std::vector<PDFRectangle *> *getRegion() { return list; }
++    std::vector<PDFRectangle *> *takeRegion()
++    {
++        auto aux = list;
++        list = nullptr;
++        return aux;
++    }
+ 
+ private:
+     std::vector<PDFRectangle *> *list;
+@@ -5063,7 +5068,7 @@ std::vector<PDFRectangle *> *TextPage::g
+ 
+     visitSelection(&sizer, selection, style);
+ 
+-    return sizer.getRegion();
++    return sizer.takeRegion();
+ }
+ 
+ GooString *TextPage::getSelectionText(const PDFRectangle *selection, SelectionStyle style)
+--- poppler/poppler/XRef.cc
++++ poppler/poppler/XRef.cc
+@@ -402,6 +402,7 @@ int XRef::reserve(int newSize)
+ 
+         void *p = greallocn_checkoverflow(entries, realNewSize, sizeof(XRefEntry));
+         if (p == nullptr) {
++            entries = nullptr;
+             return 0;
+         }
+ 
+@@ -835,7 +836,6 @@ bool XRef::constructXRef(bool *wasRecons
+     int offset = 0;
+ 
+     resize(0); // free entries properly
+-    gfree(entries);
+     capacity = 0;
+     size = 0;
+     entries = nullptr;
+--- poppler/test/pdf-inspector.cc
++++ poppler/test/pdf-inspector.cc
+@@ -43,6 +43,7 @@ class PdfInspector
+ {
+ public:
+     PdfInspector();
++    ~PdfInspector();
+ 
+     void set_file_name(const char *file_name);
+     void load(const char *file_name);
+@@ -108,6 +109,11 @@ PdfInspector::PdfInspector()
+     load(nullptr);
+ }
+ 
++PdfInspector::~PdfInspector(void)
++{
++    delete output;
++}
++
+ void PdfInspector::set_file_name(const char *file_name)
+ {
+     GtkWidget *widget;
+--- poppler/utils/HtmlOutputDev.cc
++++ poppler/utils/HtmlOutputDev.cc
+@@ -1337,6 +1337,7 @@ void HtmlOutputDev::drawPngImage(GfxStat
+     // TODO can we calculate the resolution of the image?
+     if (!writer->init(f1, width, height, 72, 72)) {
+         error(errInternal, -1, "Can't init PNG for image '{0:t}'", fName);
++        delete fName;
+         delete writer;
+         fclose(f1);
+         return;
+@@ -1378,6 +1378,7 @@ void HtmlOutputDev::drawPngImage(GfxStat
+ 
+             if (!writer->writeRow(row_pointer)) {
+                 error(errIO, -1, "Failed to write into PNG '{0:t}'", fName);
++                delete fName;
+                 delete writer;
+                 delete imgStr;
+                 fclose(f1);
+@@ -1413,6 +1414,7 @@ void HtmlOutputDev::drawPngImage(GfxStat
+ 
+             if (!writer->writeRow(&png_row)) {
+                 error(errIO, -1, "Failed to write into PNG '{0:t}'", fName);
++                delete fName;
+                 delete writer;
+                 fclose(f1);
+                 gfree(png_row);
+--- poppler/utils/pdftotext.cc
++++ poppler/utils/pdftotext.cc
+@@ -329,6 +329,7 @@ int main(int argc, char *argv[])
+             fputs("<pre>\n", f);
+             if (f != stdout) {
+                 fclose(f);
++                f = nullptr;
+             }
+         }
+     }
+@@ -348,8 +349,9 @@ int main(int argc, char *argv[])
+                 printWordBBox(f, doc, textOut, firstPage, lastPage);
+             }
+         }
+-        if (f != stdout) {
++        if (f != stdout && f != nullptr) {
+             fclose(f);
++            f = nullptr;
+         }
+     } else {
+         textOut = new TextOutputDev(textFileName->c_str(), physLayout, fixedPitch, rawOrder, htmlMeta, discardDiag);
+@@ -390,7 +392,7 @@ int main(int argc, char *argv[])
+             fputs("</pre>\n", f);
+         fputs("</body>\n", f);
+         fputs("</html>\n", f);
+-        if (f != stdout) {
++        if (f != stdout && f != nullptr) {
+             fclose(f);
+         }
+     }
+@@ -533,7 +533,9 @@ void printWordBBox(FILE *f, PDFDoc *doc,
+         for (int i = 0; i < word_length; ++i) {
+             word = wordlist->get(i);
+             word->getBBox(&xMinA, &yMinA, &xMaxA, &yMaxA);
+-            const std::string myString = myXmlTokenReplace(word->getText()->c_str());
++            GooString *wordText = word->getText();
++            const std::string myString = myXmlTokenReplace(wordText->c_str());
++            delete wordText;
+             fprintf(f, "    <word xMin=\"%f\" yMin=\"%f\" xMax=\"%f\" yMax=\"%f\">%s</word>\n", xMinA, yMinA, xMaxA, yMaxA, myString.c_str());
+         }
+         fprintf(f, "  </page>\n");
diff --git a/SOURCES/poppler-21.01.0-glib-introspection.patch b/SOURCES/poppler-21.01.0-glib-introspection.patch
new file mode 100644
index 0000000..9bbb221
--- /dev/null
+++ b/SOURCES/poppler-21.01.0-glib-introspection.patch
@@ -0,0 +1,11 @@
+--- poppler-21.01.0/glib/CMakeLists.txt
++++ poppler-21.01.0/glib/CMakeLists.txt
+@@ -121,7 +121,7 @@ if (HAVE_INTROSPECTION AND BUILD_SHARED_
+ 
+   # General gir: Reset object-list for introspection & load tool args
+   set(INTROSPECTION_GIRS)
+-  set(INTROSPECTION_SCANNER_ARGS "--add-include-path=${CMAKE_CURRENT_SOURCE_DIR}" "--warn-all")
++  set(INTROSPECTION_SCANNER_ARGS "--add-include-path=${CMAKE_CURRENT_SOURCE_DIR}" "--warn-all" "--sources-top-dirs=${CMAKE_SOURCE_DIR}" "--sources-top-dirs=${CMAKE_BINARY_DIR}")
+   set(INTROSPECTION_COMPILER_ARGS "--includedir=${CMAKE_CURRENT_SOURCE_DIR}")
+ 
+   # Poppler: Assign package to gir & export keys
diff --git a/SOURCES/poppler-21.01.0-nss.patch b/SOURCES/poppler-21.01.0-nss.patch
new file mode 100644
index 0000000..bf96362
--- /dev/null
+++ b/SOURCES/poppler-21.01.0-nss.patch
@@ -0,0 +1,1055 @@
+diff --git a/config.h.cmake b/config.h.cmake
+index 7989cbfb..6f5e147e 100644
+--- a/config.h.cmake
++++ b/config.h.cmake
+@@ -24,9 +24,6 @@
+ /* Use zlib instead of builtin zlib decoder to uncompress flate streams. */
+ #cmakedefine ENABLE_ZLIB_UNCOMPRESS 1
+ 
+-/* Build against libnss3 for digital signature validation */
+-#cmakedefine ENABLE_NSS3 1
+-
+ /* Use cairo for rendering. */
+ #cmakedefine HAVE_CAIRO 1
+ 
+diff --git a/poppler/Decrypt.cc b/poppler/Decrypt.cc
+index 16476f4f..9f4adda3 100644
+--- a/poppler/Decrypt.cc
++++ b/poppler/Decrypt.cc
+@@ -39,17 +39,33 @@
+ #include "goo/grandom.h"
+ #include "Decrypt.h"
+ #include "Error.h"
+-
++#ifdef ENABLE_NSS3
++#include <nss.h>
++#include <prerror.h>
++#include <sechash.h>
++#endif
++
++#ifdef ENABLE_NSS3
++static PK11Context *rc4InitContext(const unsigned char *key, int keyLen);
++static unsigned char rc4DecryptByte(PK11Context *context, unsigned char c);
++#else
+ static void rc4InitKey(const unsigned char *key, int keyLen, unsigned char *state);
+ static unsigned char rc4DecryptByte(unsigned char *state, unsigned char *x, unsigned char *y, unsigned char c);
++#endif
+ 
+ static bool aesReadBlock(Stream *str, unsigned char *in, bool addPadding);
+ 
++#ifdef ENABLE_NSS3
++static PK11Context *aesInitContext(unsigned char *in, unsigned char *objKey, int objKeyLength, bool decrypt);
++#else
+ static void aesKeyExpansion(DecryptAESState *s, const unsigned char *objKey, int objKeyLen, bool decrypt);
++#endif
+ static void aesEncryptBlock(DecryptAESState *s, const unsigned char *in);
+ static void aesDecryptBlock(DecryptAESState *s, const unsigned char *in, bool last);
+ 
++#ifndef ENABLE_NSS3
+ static void aes256KeyExpansion(DecryptAES256State *s, const unsigned char *objKey, int objKeyLen, bool decrypt);
++#endif
+ static void aes256EncryptBlock(DecryptAES256State *s, const unsigned char *in);
+ static void aes256DecryptBlock(DecryptAES256State *s, const unsigned char *in, bool last);
+ 
+@@ -70,6 +86,31 @@ static const unsigned char passwordPad[32] = {
+ // Decrypt
+ //------------------------------------------------------------------------
+ 
++#ifdef ENABLE_NSS3
++static void shutdownNSS()
++{
++    if (NSS_Shutdown() != SECSuccess) {
++        error(errInternal, -1, "NSS shutdown failed: {0:s}",
++              PR_ErrorToString(PR_GetError(), PR_LANGUAGE_I_DEFAULT));
++    }
++}
++
++static bool initNSS() {
++    if (NSS_IsInitialized()) {
++        return true;
++    } else {
++        if (NSS_NoDB_Init(".") != SECSuccess) {
++            error(errInternal, -1, "NSS initialization failed: {0:s}",
++                  PR_ErrorToString(PR_GetError(), PR_LANGUAGE_I_DEFAULT));
++            return false;
++        } else {
++            atexit(shutdownNSS);
++            return true;
++        }
++    }
++}
++#endif
++
+ bool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength, const GooString *ownerKey, const GooString *userKey, const GooString *ownerEnc, const GooString *userEnc, int permissions, const GooString *fileID,
+                           const GooString *ownerPassword, const GooString *userPassword, unsigned char *fileKey, bool encryptMetadata, bool *ownerPasswordOk)
+ {
+@@ -80,13 +121,21 @@ bool Decrypt::makeFileKey(int encVersio
+     DecryptAES256State state;
+     unsigned char test[127 + 56], test2[32];
+     GooString *userPassword2;
+-    unsigned char fState[256];
+     unsigned char tmpKey[16];
+-    unsigned char fx, fy;
+     int len, i, j;
++#ifdef ENABLE_NSS3
++    PK11Context *rc4Context;
++#else
++    unsigned char fState[256];
++    unsigned char fx, fy;
++#endif
+ 
+     *ownerPasswordOk = false;
+ 
++#ifdef ENABLE_NSS3
++    initNSS();
++#endif
++
+     if (encRevision == 5 || encRevision == 6) {
+ 
+         // check the owner password
+@@ -115,14 +164,26 @@ bool Decrypt::makeFileKey(int encVersio
+                     // test contains the initial SHA-256 hash input K.
+                     revision6Hash(ownerPassword, test, userKey->c_str());
+                 }
++#ifndef ENABLE_NSS3
+                 aes256KeyExpansion(&state, test, 32, true);
++#endif
+                 for (i = 0; i < 16; ++i) {
+                     state.cbc[i] = 0;
+                 }
++#ifdef ENABLE_NSS3
++                state.context = aesInitContext(state.cbc, test, 32, true);
++                if (state.context) {
++#endif
+                 aes256DecryptBlock(&state, (unsigned char *)ownerEnc->c_str(), false);
+                 memcpy(fileKey, state.buf, 16);
+                 aes256DecryptBlock(&state, (unsigned char *)ownerEnc->c_str() + 16, false);
+                 memcpy(fileKey + 16, state.buf, 16);
++#ifdef ENABLE_NSS3
++                PK11_DestroyContext(state.context, PR_TRUE);
++                } else {
++                    return false;
++                }
++#endif
+ 
+                 *ownerPasswordOk = true;
+                 return true;
+@@ -156,14 +217,26 @@ bool Decrypt::makeFileKey(int encVersio
+                     // user key is not used in computing intermediate user key.
+                     revision6Hash(userPassword, test, nullptr);
+                 }
++#ifndef ENABLE_NSS3
+                 aes256KeyExpansion(&state, test, 32, true);
++#endif
+                 for (i = 0; i < 16; ++i) {
+                     state.cbc[i] = 0;
+                 }
++#ifdef ENABLE_NSS3
++                state.context = aesInitContext(state.cbc, test, 32, true);
++                if (state.context) {
++#endif
+                 aes256DecryptBlock(&state, (unsigned char *)userEnc->c_str(), false);
+                 memcpy(fileKey, state.buf, 16);
+                 aes256DecryptBlock(&state, (unsigned char *)userEnc->c_str() + 16, false);
+                 memcpy(fileKey + 16, state.buf, 16);
++#ifdef ENABLE_NSS3
++                PK11_DestroyContext(state.context, PR_TRUE);
++                } else {
++                    return false;
++                }
++#endif
+ 
+                 return true;
+             }
+@@ -189,22 +262,41 @@ bool Decrypt::makeFileKey(int encVersio
+                 }
+             }
+             if (encRevision == 2) {
++#ifdef ENABLE_NSS3
++                rc4Context = rc4InitContext(test, keyLength);
++                if (rc4Context) {
++                    for (i = 0; i < 32; ++i)
++                        test2[i] = rc4DecryptByte(rc4Context, ownerKey->getChar(i));
++                    PK11_DestroyContext(rc4Context, PR_TRUE);
++                }
++#else
+                 rc4InitKey(test, keyLength, fState);
+                 fx = fy = 0;
+                 for (i = 0; i < 32; ++i) {
+                     test2[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i));
+                 }
++#endif
+             } else {
+                 memcpy(test2, ownerKey->c_str(), 32);
+                 for (i = 19; i >= 0; --i) {
+                     for (j = 0; j < keyLength; ++j) {
+                         tmpKey[j] = test[j] ^ i;
+                     }
++#ifdef ENABLE_NSS3
++                    rc4Context = rc4InitContext(tmpKey, keyLength);
++                    if (rc4Context) {
++                        for (j = 0; j < 32; ++j) {
++                            test2[j] = rc4DecryptByte(rc4Context, test2[j]);
++                        }
++                        PK11_DestroyContext(rc4Context, PR_TRUE);
++                    }
++#else
+                     rc4InitKey(tmpKey, keyLength, fState);
+                     fx = fy = 0;
+                     for (j = 0; j < 32; ++j) {
+                         test2[j] = rc4DecryptByte(fState, &fx, &fy, test2[j]);
+                     }
++#endif
+                 }
+             }
+             userPassword2 = new GooString((char *)test2, 32);
+@@ -232,11 +324,15 @@ bool Decrypt::makeFileKey2(int encVersi
+ {
+     unsigned char *buf;
+     unsigned char test[32];
+-    unsigned char fState[256];
+     unsigned char tmpKey[16];
+-    unsigned char fx, fy;
+     int len, i, j;
+-    bool ok;
++    bool ok = true;
++#ifdef ENABLE_NSS3
++    PK11Context *rc4Context;
++#else
++    unsigned char fState[256];
++    unsigned char fx, fy;
++#endif
+ 
+     // generate file key
+     buf = (unsigned char *)gmalloc(72 + fileID->getLength());
+@@ -273,28 +369,52 @@ bool Decrypt::makeFileKey2(int encVersi
+ 
+     // test user password
+     if (encRevision == 2) {
++#ifdef ENABLE_NSS3
++        rc4Context = rc4InitContext(fileKey, keyLength);
++        if (rc4Context) {
++            for (i = 0; i < 32; ++i)
++                test[i] = rc4DecryptByte(rc4Context, userKey->getChar(i));
++            PK11_DestroyContext(rc4Context, PR_TRUE);
++        } else {
++            ok = false;
++        }
++#else
+         rc4InitKey(fileKey, keyLength, fState);
+         fx = fy = 0;
+         for (i = 0; i < 32; ++i) {
+             test[i] = rc4DecryptByte(fState, &fx, &fy, userKey->getChar(i));
+         }
+-        ok = memcmp(test, passwordPad, 32) == 0;
++#endif
++        if (ok)
++            ok = memcmp(test, passwordPad, 32) == 0;
+     } else if (encRevision == 3) {
+         memcpy(test, userKey->c_str(), 32);
+         for (i = 19; i >= 0; --i) {
+             for (j = 0; j < keyLength; ++j) {
+                 tmpKey[j] = fileKey[j] ^ i;
+             }
++#ifdef ENABLE_NSS3
++            rc4Context = rc4InitContext(tmpKey, keyLength);
++            if (rc4Context) {
++                for (j = 0; j < 32; ++j)
++                    test[j] = rc4DecryptByte(rc4Context, test[j]);
++                PK11_DestroyContext(rc4Context, PR_TRUE);
++            } else {
++                ok = false;
++            }
++#else
+             rc4InitKey(tmpKey, keyLength, fState);
+             fx = fy = 0;
+             for (j = 0; j < 32; ++j) {
+                 test[j] = rc4DecryptByte(fState, &fx, &fy, test[j]);
+             }
++#endif
+         }
+         memcpy(buf, passwordPad, 32);
+         memcpy(buf + 32, fileID->c_str(), fileID->getLength());
+         md5(buf, 32 + fileID->getLength(), buf);
+-        ok = memcmp(test, buf, 16) == 0;
++        if (ok)
++            ok = memcmp(test, buf, 16) == 0;
+     } else {
+         ok = false;
+     }
+@@ -334,6 +454,9 @@ BaseCryptStream::BaseCryptStream(Stream
+         if ((objKeyLength = keyLength + 5) > 16) {
+             objKeyLength = 16;
+         }
++#ifdef ENABLE_NSS3
++        state.rc4.context = nullptr;
++#endif
+         break;
+     case cryptAES:
+         objKey[keyLength] = refA.num & 0xff;
+@@ -349,9 +472,15 @@ BaseCryptStream::BaseCryptStream(Stream
+         if ((objKeyLength = keyLength + 5) > 16) {
+             objKeyLength = 16;
+         }
++#ifdef ENABLE_NSS3
++        state.aes.context = nullptr;
++#endif
+         break;
+     case cryptAES256:
+         objKeyLength = keyLength;
++#ifdef ENABLE_NSS3
++        state.aes256.context = nullptr;
++#endif
+         break;
+     case cryptNone:
+         break;
+@@ -359,10 +488,33 @@ BaseCryptStream::BaseCryptStream(Stream
+     charactersRead = 0;
+     nextCharBuff = EOF;
+     autoDelete = true;
++
++#ifdef ENABLE_NSS3
++    initNSS();
++#endif
+ }
+ 
+ BaseCryptStream::~BaseCryptStream()
+ {
++#ifdef ENABLE_NSS3
++    switch (algo) {
++    case cryptRC4:
++        if (state.rc4.context)
++            PK11_DestroyContext(state.rc4.context, PR_TRUE);
++        break;
++    case cryptAES:
++        if (state.aes.context)
++            PK11_DestroyContext(state.aes.context, PR_TRUE);
++        break;
++    case cryptAES256:
++        if (state.aes256.context)
++            PK11_DestroyContext(state.aes256.context, PR_TRUE);
++        break;
++    default:
++        break;
++    }
++#endif
++
+     if (autoDelete) {
+         delete str;
+     }
+@@ -424,18 +576,40 @@ void EncryptStream::reset() {
+ 
+     switch (algo) {
+     case cryptRC4:
++#ifdef ENABLE_NSS3
++        if (state.rc4.context)
++            PK11_DestroyContext(state.rc4.context, PR_TRUE);
++        state.rc4.context = rc4InitContext(objKey, objKeyLength);
++#else
+         state.rc4.x = state.rc4.y = 0;
+         rc4InitKey(objKey, objKeyLength, state.rc4.state);
++#endif
+         break;
+     case cryptAES:
++#ifdef ENABLE_NSS3
++        memcpy(state.aes.buf, state.aes.cbc, 16); // Copy CBC IV to buf
++        if (state.aes.context)
++            PK11_DestroyContext(state.aes.context, PR_TRUE);
++        state.aes.context = aesInitContext(state.aes.cbc, objKey, objKeyLength,
++                                           false);
++#else
+         aesKeyExpansion(&state.aes, objKey, objKeyLength, false);
+         memcpy(state.aes.buf, state.aes.cbc, 16); // Copy CBC IV to buf
++#endif
+         state.aes.bufIdx = 0;
+         state.aes.paddingReached = false;
+         break;
+     case cryptAES256:
++#ifdef ENABLE_NSS3
++        memcpy(state.aes256.buf, state.aes256.cbc, 16); // Copy CBC IV to buf
++        if (state.aes256.context)
++            PK11_DestroyContext(state.aes256.context, PR_TRUE);
++        state.aes256.context = aesInitContext(state.aes256.cbc, objKey, objKeyLength,
++                                              false);
++#else
+         aes256KeyExpansion(&state.aes256, objKey, objKeyLength, false);
+         memcpy(state.aes256.buf, state.aes256.cbc, 16); // Copy CBC IV to buf
++#endif
+         state.aes256.bufIdx = 0;
+         state.aes256.paddingReached = false;
+         break;
+@@ -456,7 +630,11 @@ int EncryptStream::lookChar() {
+     case cryptRC4:
+         if ((c = str->getChar()) != EOF) {
+             // RC4 is XOR-based: the decryption algorithm works for encryption too
++#ifdef ENABLE_NSS3
++            c = rc4DecryptByte(state.rc4.context, (unsigned char)c);
++#else
+             c = rc4DecryptByte(state.rc4.state, &state.rc4.x, &state.rc4.y, (unsigned char)c);
++#endif
+         }
+         break;
+     case cryptAES:
+@@ -506,21 +684,47 @@ void DecryptStream::reset() {
+ 
+     switch (algo) {
+     case cryptRC4:
++#ifdef ENABLE_NSS3
++        if (state.rc4.context)
++            PK11_DestroyContext(state.rc4.context, PR_TRUE);
++        state.rc4.context = rc4InitContext(objKey, objKeyLength);
++#else
+         state.rc4.x = state.rc4.y = 0;
+         rc4InitKey(objKey, objKeyLength, state.rc4.state);
++#endif
+         break;
+     case cryptAES:
++#ifdef ENABLE_NSS3
++        if (state.aes.context)
++            PK11_DestroyContext(state.aes.context, PR_TRUE);
++        for (i = 0; i < 16; ++i) {
++            state.aes.cbc[i] = str->getChar();
++        }
++        state.aes.context = aesInitContext(state.aes.cbc, objKey, objKeyLength,
++                                           true);
++#else
+         aesKeyExpansion(&state.aes, objKey, objKeyLength, true);
+         for (i = 0; i < 16; ++i) {
+             state.aes.cbc[i] = str->getChar();
+         }
++#endif
+         state.aes.bufIdx = 16;
+         break;
+     case cryptAES256:
++#ifdef ENABLE_NSS3
++        if (state.aes256.context)
++            PK11_DestroyContext(state.aes256.context, PR_TRUE);
++        for (i = 0; i < 16; ++i) {
++            state.aes256.cbc[i] = str->getChar();
++        }
++        state.aes256.context = aesInitContext(state.aes256.cbc, objKey, objKeyLength,
++                                              true);
++#else
+         aes256KeyExpansion(&state.aes256, objKey, objKeyLength, true);
+         for (i = 0; i < 16; ++i) {
+             state.aes256.cbc[i] = str->getChar();
+         }
++#endif
+         state.aes256.bufIdx = 16;
+         break;
+     case cryptNone:
+@@ -539,10 +743,21 @@ int DecryptStream::lookChar() {
+     switch (algo) {
+     case cryptRC4:
+         if ((c = str->getChar()) != EOF) {
++#ifdef ENABLE_NSS3
++            if (unlikely(state.rc4.context == nullptr))
++                c = EOF;
++            else
++                c = rc4DecryptByte(state.rc4.context, (unsigned char)c);
++#else
+             c = rc4DecryptByte(state.rc4.state, &state.rc4.x, &state.rc4.y, (unsigned char)c);
++#endif
+         }
+         break;
+     case cryptAES:
++#ifdef ENABLE_NSS3
++        if (unlikely(state.aes.context == nullptr))
++            break;
++#endif
+         if (state.aes.bufIdx == 16) {
+             if (aesReadBlock(str, in, false)) {
+                 aesDecryptBlock(&state.aes, in, str->lookChar() == EOF);
+@@ -555,6 +770,10 @@ int DecryptStream::lookChar() {
+         }
+         break;
+     case cryptAES256:
++#ifdef ENABLE_NSS3
++        if (unlikely(state.aes256.context == nullptr))
++            break;
++#endif
+         if (state.aes256.bufIdx == 16) {
+             if (aesReadBlock(str, in, false)) {
+                 aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF);
+@@ -576,7 +795,176 @@ int DecryptStream::lookChar() {
+ // RC4-compatible decryption
+ //------------------------------------------------------------------------
+ 
++#ifdef ENABLE_NSS3
++/*
++ * This function turns given key into token key (compared to a session key
++ * which is prohibited in FIPS mode).
++ */
++static PK11SymKey *tokenizeKey(const unsigned char *key, int keyLen,
++                               CK_ATTRIBUTE_TYPE operation) {
++    CK_MECHANISM_TYPE  cipherMech = CKM_AES_CBC_PAD;
++    PK11SlotInfo      *slot;
++    PK11SymKey        *wrappingKey = nullptr;
++    PK11SymKey        *symKey = nullptr;
++    PK11SymKey        *token = nullptr;
++    SECStatus          retval;
++    SECItem           *secParam = nullptr;
++    SECItem            ivItem, wrappedKey;
++    unsigned char      output[48];   // Buffer to hold 256 bit key + padding
++    unsigned char      iv[16];       // Initialization vector for AES
++    unsigned int       outputLength;
++    int                i;
++
++    slot = PK11_GetBestSlot(CKM_AES_KEY_GEN, nullptr);
++    if (slot == nullptr) {
++        error(errInternal, -1, "Unable to find security device (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    // Generate random key for wrapping of given key by AES-256
++    wrappingKey = PK11_KeyGen(slot, CKM_AES_KEY_GEN, nullptr, 32, nullptr);
++    if (wrappingKey == nullptr) {
++        error(errInternal, -1, "Failed to generate wrapping key (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    for (i = 0; i < 16; i++)
++        iv[i] = i;
++
++    ivItem.type = siBuffer;
++    ivItem.data = iv;
++    ivItem.len = 16;
++
++    secParam = PK11_ParamFromIV(cipherMech, &ivItem);
++    if (secParam == nullptr) {
++        error(errInternal, -1, "Failed to set up PKCS11 param (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    // Encrypt given key
++    retval = PK11_Encrypt(wrappingKey,
++                          cipherMech,
++                          secParam,
++                          output,
++                          &outputLength,
++                          sizeof(output),
++                          key,
++                          keyLen);
++    if (retval != SECSuccess) {
++        error(errInternal, -1, "Failed to encrypt key (err {0:d})",
++              PR_GetError());
++    }
++
++    wrappedKey.type = siBuffer;
++    wrappedKey.data = output;
++    wrappedKey.len = outputLength;
++
++    // Unwrap the wrapped key to token so it can be used in FIPS mode
++    token = PK11_UnwrapSymKey(wrappingKey,
++                              cipherMech,
++                              &ivItem,
++                              &wrappedKey,
++                              operation,
++                              CKA_UNWRAP,
++                              keyLen);
++
++    if (token == nullptr) {
++        error(errInternal, -1, "Failed to unwrap symmetric key (err {0:d})",
++              PR_GetError());
++    }
++
++err:
++    if (secParam != nullptr)
++        SECITEM_FreeItem(secParam, PR_TRUE);
++
++    if (wrappingKey != nullptr)
++        PK11_FreeSymKey(wrappingKey);
++
++    if (symKey != nullptr)
++        PK11_FreeSymKey(symKey);
++
++    if (slot != nullptr)
++        PK11_FreeSlot(slot);
++
++    return token;
++}
++
++static PK11Context *rc4InitContext(const unsigned char *key, int keyLen) {
++    CK_MECHANISM_TYPE  cipherMech = CKM_RC4;
++    PK11SlotInfo      *slot = nullptr;
++    PK11SymKey        *symKey = nullptr;
++    SECItem           *secParam = nullptr;
++    PK11Context       *context = nullptr;
++
++    slot = PK11_GetBestSlot(cipherMech, nullptr);
++    if (slot == nullptr) {
++        error(errInternal, -1, "Unable to find security device (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    symKey = tokenizeKey(key, keyLen, cipherMech);
++    if (symKey == nullptr) {
++        error(errInternal, -1, "Failed to create token from key (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    secParam = PK11_ParamFromIV(cipherMech, nullptr);
++    if (secParam == nullptr) {
++        error(errInternal, -1, "Failed to set up PKCS11 param (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    context = PK11_CreateContextBySymKey(cipherMech,
++                                         CKA_DECRYPT,
++                                         symKey,
++                                         secParam);
++    if (context == nullptr) {
++        error(errInternal, -1, "Failed to create context (err {0:d})",
++              PR_GetError());
++    }
++
++err:
++    if (secParam != nullptr)
++        SECITEM_FreeItem(secParam, PR_TRUE);
++
++    if (symKey != nullptr)
++        PK11_FreeSymKey(symKey);
++
++    if (slot != nullptr)
++        PK11_FreeSlot(slot);
++
++    return context;
++}
++
++static unsigned char rc4DecryptByte(PK11Context *context, unsigned char c) {
++    unsigned char outputChar = 0;
++    SECStatus     retval;
++    int           outputLength;
++
++    retval = PK11_CipherOp(context,
++                           &outputChar,
++                           &outputLength,
++                           1,
++                           &c,
++                           1);
++
++    if (retval != SECSuccess) {
++        error(errInternal, -1, "Failed to decrypt byte (err {0:d})",
++              PR_GetError());
++    }
++
++    return outputChar;
++}
++
++#else
++
+ static void rc4InitKey(const unsigned char *key, int keyLen, unsigned char *state)
+ {
+     unsigned char index1, index2;
+     unsigned char t;
+@@ -609,6 +997,8 @@ static unsigned char rc4DecryptByte(unsigned char *sta
+     return c ^ state[(tx + ty) % 256];
+ }
+ 
++#endif
++
+ //------------------------------------------------------------------------
+ // AES decryption
+ //------------------------------------------------------------------------
+@@ -639,6 +1029,178 @@ static bool aesReadBlock(Stream *str, G
+     }
+ }
+ 
++#ifdef ENABLE_NSS3
++
++static PK11Context *aesInitContext(unsigned char *in, unsigned char *objKey,
++                                   int objKeyLength, bool decrypt) {
++    CK_MECHANISM_TYPE  cipherMech = CKM_AES_CBC;
++    CK_ATTRIBUTE_TYPE  operationType = decrypt ? CKA_DECRYPT : CKA_ENCRYPT;
++    PK11SlotInfo      *slot;
++    PK11SymKey        *symKey = nullptr;
++    SECItem           *secParam = nullptr;
++    PK11Context       *context = nullptr;
++    SECItem            ivItem;
++
++    slot = PK11_GetBestSlot(cipherMech, nullptr);
++    if (slot == nullptr) {
++        error(errInternal, -1, "Unable to find security device (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    symKey = tokenizeKey(objKey, objKeyLength, cipherMech);
++    if (symKey == nullptr) {
++        error(errInternal, -1, "Failed to create token from key (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    ivItem.type = siBuffer;
++    ivItem.data = in;
++    ivItem.len = 16;
++
++    secParam = PK11_ParamFromIV(cipherMech, &ivItem);
++    if (secParam == nullptr) {
++        error(errInternal, -1, "Failed to set up PKCS11 param (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    context = PK11_CreateContextBySymKey(cipherMech,
++                                         operationType,
++                                         symKey,
++                                         secParam);
++
++err:
++    if (secParam != nullptr)
++        SECITEM_FreeItem(secParam, PR_TRUE);
++
++    if (symKey != nullptr)
++        PK11_FreeSymKey(symKey);
++
++    if (slot != nullptr)
++        PK11_FreeSlot(slot);
++
++    return context;
++}
++
++static void aesEncryptBlock(DecryptAESState *s, const unsigned char *in) {
++    SECStatus rv;
++    int       outputLength;
++
++    rv = PK11_CipherOp(s->context,
++                       s->buf,
++                       &outputLength,
++                       16,
++                       in,
++                       16);
++
++    if (rv != SECSuccess) {
++        error(errInternal, -1, "Failed to encrypt input block (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    s->bufIdx = 0;
++
++err:
++    return;
++}
++
++static void aesDecryptBlock(DecryptAESState *s, const unsigned char *in, bool last) {
++    SECStatus rv1;
++    int       outputLen;
++    int       n, i;
++
++    rv1 = PK11_CipherOp(s->context,
++                        s->buf,
++                        &outputLen,
++                        16,
++                        in,
++                        16);
++
++    if (rv1 != SECSuccess) {
++        error(errInternal, -1, "Failed to decrypt input block (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    s->bufIdx = 0;
++    if (last) {
++        n = s->buf[15];
++        if (n < 1 || n > 16) { // this should never happen
++            n = 16;
++        }
++        for (i = 15; i >= n; --i) {
++            s->buf[i] = s->buf[i-n];
++        }
++        s->bufIdx = n;
++    }
++
++err:
++    return;
++}
++
++static void aes256EncryptBlock(DecryptAES256State *s, const unsigned char *in) {
++    SECStatus rv;
++    int       outputLength;
++
++    rv = PK11_CipherOp(s->context,
++                       s->buf,
++                       &outputLength,
++                       16,
++                       in,
++                       16);
++
++    if (rv != SECSuccess) {
++        error(errInternal, -1, "Failed to encrypt input block (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    s->bufIdx = 0;
++
++err:
++    return;
++}
++
++static void aes256DecryptBlock(DecryptAES256State *s, const unsigned char *in,
++                               bool last) {
++    SECStatus rv1;
++    int       outputLen;
++    int       n, i;
++
++    rv1 = PK11_CipherOp(s->context,
++                        s->buf,
++                        &outputLen,
++                        16,
++                        in,
++                        16);
++
++    if (rv1 != SECSuccess) {
++        error(errInternal, -1, "Failed to decrypt input block (err {0:d})",
++              PR_GetError());
++        goto err;
++    }
++
++    s->bufIdx = 0;
++    if (last) {
++        n = s->buf[15];
++        if (n < 1 || n > 16) { // this should never happen
++            n = 16;
++        }
++        for (i = 15; i >= n; --i) {
++            s->buf[i] = s->buf[i-n];
++        }
++        s->bufIdx = n;
++    }
++
++err:
++    return;
++}
++
++#else
++
+ static const unsigned char sbox[256] = { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
+                                          0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
+                                          0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+@@ -1121,10 +1683,33 @@ static void aes256DecryptBlock(DecryptAE
+     }
+ }
+ 
++#endif
++
+ //------------------------------------------------------------------------
+ // MD5 message digest
+ //------------------------------------------------------------------------
+ 
++#ifdef ENABLE_NSS3
++static void hashFunc(const unsigned char *msg, int msgLen, unsigned char *hash,
++                     HASH_HashType type) {
++    HASHContext *context;
++    unsigned int hashLen = 0;
++
++    if (!initNSS())
++        return;
++
++    context = HASH_Create(type);
++    if (context == nullptr)
++        return;
++
++    HASH_Begin(context);
++    HASH_Update(context, msg, msgLen);
++    HASH_End(context, hash, &hashLen, HASH_ResultLen(type));
++    HASH_Destroy(context);
++}
++
++#else
++
+ // this works around a bug in older Sun compilers
+ static inline unsigned long rotateLeft(unsigned long x, int r)
+ {
+@@ -1151,8 +1736,13 @@ static inline unsigned long md5Round4(unsigned long a,
+     state->digest[15] = (unsigned char)(state->d >> 24);
+ }
+ 
++#endif
++
+ void md5(const unsigned char *msg, int msgLen, unsigned char *digest)
+ {
++#ifdef ENABLE_NSS3
++    hashFunc(msg, msgLen, digest, HASH_AlgMD5);
++#else
+     if (msgLen < 0) {
+         return;
+     }
+@@ -1296,12 +1886,14 @@ void md5(unsigned char *msg, int msgLen, unsigned char
+     for (int i = 0; i < 16; ++i) {
+         digest[i] = state.digest[i];
+     }
++#endif
+ }
+ 
+ //------------------------------------------------------------------------
+ // SHA-256 hash
+ //------------------------------------------------------------------------
+ 
++#ifndef ENABLE_NSS3
+ static const unsigned int sha256K[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+                                           0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+                                           0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+@@ -1400,9 +1992,13 @@ static void sha256HashBlock(unsigned char *blk,
+     H[6] += g;
+     H[7] += h;
+ }
++#endif
+ 
+ static void sha256(unsigned char *msg, int msgLen, unsigned char *hash)
+ {
++#ifdef ENABLE_NSS3
++    hashFunc(msg, msgLen, hash, HASH_AlgSHA256);
++#else
+     unsigned char blk[64];
+     unsigned int H[8];
+     int blkLen, i;
+@@ -1453,7 +2049,10 @@ static void sha256(unsigned char *msg, int msgL
+         hash[i * 4 + 2] = (unsigned char)(H[i] >> 8);
+         hash[i * 4 + 3] = (unsigned char)H[i];
+     }
++#endif
+ }
++
++#ifndef ENABLE_NSS3
+ //------------------------------------------------------------------------
+ // SHA-512 hash (see FIPS 180-4)
+ //------------------------------------------------------------------------
+@@ -1557,9 +2156,13 @@ static void sha512HashBlock(unsigned char *blk,
+     H[6] += g;
+     H[7] += h;
+ }
++#endif
+ 
+ static void sha512(unsigned char *msg, int msgLen, unsigned char *hash)
+ {
++#ifdef ENABLE_NSS3
++    hashFunc(msg, msgLen, hash, HASH_AlgSHA512);
++#else
+     unsigned char blk[128];
+     uint64_t H[8];
+     int blkLen = 0, i;
+@@ -1622,6 +2225,7 @@ static void sha512(unsigned char *msg, int msgL
+         hash[i * 8 + 6] = (unsigned char)(H[i] >> 8);
+         hash[i * 8 + 7] = (unsigned char)H[i];
+     }
++#endif
+ }
+ 
+ //------------------------------------------------------------------------
+@@ -1631,6 +2235,9 @@ static void sha512(unsigned char *msg, int msgL
+ // 2.A 384 bit message digest is obtained by truncating the final hash value.
+ static void sha384(unsigned char *msg, int msgLen, unsigned char *hash)
+ {
++#ifdef ENABLE_NSS3
++    hashFunc(msg, msgLen, hash, HASH_AlgSHA384);
++#else
+     unsigned char blk[128];
+     uint64_t H[8];
+     int blkLen, i;
+@@ -1696,6 +2303,7 @@ static void sha384(unsigned char *msg, int msgL
+         hash[i * 8 + 6] = (unsigned char)(H[i] >> 8);
+         hash[i * 8 + 7] = (unsigned char)H[i];
+     }
++#endif
+ }
+ 
+ //------------------------------------------------------------------------
+@@ -1735,7 +2344,11 @@ static void revision6Hash(GooString *inp
+         memcpy(state.buf, state.cbc, 16); // Copy CBC IV to buf
+         state.bufIdx = 0;
+         state.paddingReached = false;
++#ifdef ENABLE_NSS3
++        state.context = aesInitContext(state.cbc, aesKey, 16, false);
++#else
+         aesKeyExpansion(&state, aesKey, 16, false);
++#endif
+ 
+         for (int i = 0; i < (4 * sequenceLength); i++) {
+             aesEncryptBlock(&state, K1 + (16 * i));
+@@ -1776,6 +2389,9 @@ static void revision6Hash(GooString *inp
+             sha512(E, totalLength, K);
+         }
+         rounds++;
++#ifdef ENABLE_NSS3
++        PK11_DestroyContext(state.context, PR_TRUE);
++#endif
+     }
+     // the first 32 bytes of the final K are the output of the function.
+ }
+diff --git a/poppler/Decrypt.h b/poppler/Decrypt.h
+index d4667c8c..16fa9830 100644
+--- a/poppler/Decrypt.h
++++ b/poppler/Decrypt.h
+@@ -31,6 +32,9 @@
+ #include "goo/GooString.h"
+ #include "Object.h"
+ #include "Stream.h"
++#ifdef ENABLE_NSS3
++#include <pk11pub.h>
++#endif
+ 
+ //------------------------------------------------------------------------
+ // Decrypt
+@@ -73,14 +77,22 @@ private:
+  * case of encryption. */
+ struct DecryptRC4State
+ {
++#ifdef ENABLE_NSS3
++    PK11Context *context;
++#else
+     unsigned char state[256];
+     unsigned char x, y;
++#endif
+ };
+ 
+ struct DecryptAESState
+ {
++#ifdef ENABLE_NSS3
++    PK11Context *context;
++#else
+     unsigned int w[44];
+     unsigned char state[16];
++#endif
+     unsigned char cbc[16];
+     unsigned char buf[16];
+     bool paddingReached; // encryption only
+@@ -87,8 +99,12 @@ struct DecryptAESState {
+ 
+ struct DecryptAES256State
+ {
++#ifdef ENABLE_NSS3
++    PK11Context *context;
++#else
+     unsigned int w[60];
+     unsigned char state[16];
++#endif
+     unsigned char cbc[16];
+     unsigned char buf[16];
+     bool paddingReached; // encryption only
+diff --git a/poppler/poppler-config.h.cmake b/poppler/poppler-config.h.cmake
+index f0a5a1a0..dcaade6f 100644
+--- a/poppler/poppler-config.h.cmake
++++ b/poppler/poppler-config.h.cmake
+@@ -115,6 +115,12 @@
+ #cmakedefine HAVE_SPLASH 1
+ #endif
+ 
++/* Build against libnss3 for digital signature validation and
++   implementation of encryption/decryption. */
++#ifndef ENABLE_NSS3
++#cmakedefine ENABLE_NSS3 1
++#endif
++
+ //------------------------------------------------------------------------
+ // version
+ //------------------------------------------------------------------------
diff --git a/SOURCES/poppler-21.01.0-show-annotation-text.patch b/SOURCES/poppler-21.01.0-show-annotation-text.patch
new file mode 100644
index 0000000..6c0c28a
--- /dev/null
+++ b/SOURCES/poppler-21.01.0-show-annotation-text.patch
@@ -0,0 +1,28 @@
+From 5dbe101b7c3561aedf33872e218b8d1b6984f623 Mon Sep 17 00:00:00 2001
+From: Albert Astals Cid <aacid@kde.org>
+Date: Sat, 8 May 2021 00:54:13 +0200
+Subject: [PATCH] Restore setting the Encoding in createAnnotDrawFont
+
+It was removed in 9db685f379c1c9195b5f0c9a693e7a581e6b214f and as far as
+i remember the reason was that signatures created with that hung Adobe
+Reader, but I can't reproduce it anymore and on top of that is causing
+regressions when rendering PDF files (Issue #1070) so restore it.
+---
+ poppler/Annot.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/poppler/Annot.cc b/poppler/Annot.cc
+index 5287b4dc..40b1085a 100644
+--- a/poppler/Annot.cc
++++ b/poppler/Annot.cc
+@@ -2852,6 +2852,7 @@ static GfxFont *createAnnotDrawFont(XRef *xref, Dict *fontParentDict, const char
+     Dict *fontDict = new Dict(xref);
+     fontDict->add("BaseFont", Object(objName, fontname));
+     fontDict->add("Subtype", Object(objName, "Type1"));
++    fontDict->add("Encoding", Object(objName, "WinAnsiEncoding"));
+ 
+     Object fontsDictObj = fontParentDict->lookup("Font");
+     if (!fontsDictObj.isDict()) {
+-- 
+2.31.1
+
diff --git a/SOURCES/poppler-gcc11.patch b/SOURCES/poppler-gcc11.patch
new file mode 100644
index 0000000..1a78020
--- /dev/null
+++ b/SOURCES/poppler-gcc11.patch
@@ -0,0 +1,27 @@
+diff --git a/glib/poppler-enums.c.template b/glib/poppler-enums.c.template
+index 26a51b4..27be2b9 100644
+--- a/glib/poppler-enums.c.template
++++ b/glib/poppler-enums.c.template
+@@ -15,7 +15,7 @@
+ GType
+ @enum_name@_get_type (void)
+ {
+-  static volatile gsize g_define_type_id__volatile = 0;
++  static gsize g_define_type_id__volatile = 0;
+  
+   if (g_once_init_enter (&g_define_type_id__volatile)) {
+     static const G@Type@Value values[] = {
+
+diff --git a/glib/poppler-private.h b/glib/poppler-private.h
+index 7726ec7..436bca5 100644
+--- a/glib/poppler-private.h
++++ b/glib/poppler-private.h
+@@ -167,7 +167,7 @@ gboolean _poppler_convert_pdf_date_to_gtime (const GooString *date,
+ #define POPPLER_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func)                                                                                                                                                                   \
+     GType type_name##_get_type(void)                                                                                                                                                                                                           \
+     {                                                                                                                                                                                                                                          \
+-        static volatile gsize g_define_type_id__volatile = 0;                                                                                                                                                                                  \
++        static gsize g_define_type_id__volatile = 0;                                                                                                                                                                                           \
+         if (g_once_init_enter(&g_define_type_id__volatile)) {                                                                                                                                                                                  \
+             GType g_define_type_id = g_boxed_type_register_static(g_intern_static_string(#TypeName), (GBoxedCopyFunc)copy_func, (GBoxedFreeFunc)free_func);                                                                                    \
+             g_once_init_leave(&g_define_type_id__volatile, g_define_type_id);                                                                                                                                                                  \
diff --git a/SPECS/poppler.spec b/SPECS/poppler.spec
new file mode 100644
index 0000000..56b52d7
--- /dev/null
+++ b/SPECS/poppler.spec
@@ -0,0 +1,1148 @@
+%global test_date 2021-06-14
+
+Summary: PDF rendering library
+Name:    poppler
+Version: 21.01.0
+Release: 12%{?dist}
+License: (GPLv2 or GPLv3) and GPLv2+ and LGPLv2+ and MIT
+URL:     http://poppler.freedesktop.org/
+Source0: http://poppler.freedesktop.org/poppler-%{version}.tar.xz
+# git archive --prefix test/
+Source1: %{name}-test-%{test_date}.tar.xz
+
+# https://bugzilla.redhat.com/show_bug.cgi?id=1185007
+Patch0:  poppler-0.30.0-rotated-words-selection.patch
+
+Patch1:  poppler-0.90.0-position-independent-code.patch
+
+# Bogus volatiles detected by gcc-11
+Patch2:  %{name}-gcc11.patch
+
+Patch3:  poppler-21.01.0-glib-introspection.patch
+
+# https://bugzilla.redhat.com/show_bug.cgi?id=1944726
+Patch4:  poppler-21.01.0-nss.patch
+
+# https://bugzilla.redhat.com/show_bug.cgi?id=1968289
+Patch5:  poppler-21.01.0-show-annotation-text.patch
+
+# https://bugzilla.redhat.com/show_bug.cgi?id=1967967
+Patch6:  poppler-21.01.0-covscan.patch
+
+BuildRequires: make
+BuildRequires: cmake
+BuildRequires: gcc-c++
+BuildRequires: gettext-devel
+BuildRequires: pkgconfig(cairo)
+BuildRequires: pkgconfig(cairo-ft)
+BuildRequires: pkgconfig(cairo-pdf)
+BuildRequires: pkgconfig(cairo-ps)
+BuildRequires: pkgconfig(cairo-svg)
+BuildRequires: pkgconfig(fontconfig)
+BuildRequires: pkgconfig(freetype2)
+BuildRequires: pkgconfig(gdk-pixbuf-2.0)
+BuildRequires: pkgconfig(gio-2.0)
+BuildRequires: pkgconfig(gobject-2.0)
+BuildRequires: pkgconfig(gobject-introspection-1.0) 
+BuildRequires: pkgconfig(gtk+-3.0)
+BuildRequires: pkgconfig(gtk-doc)
+BuildRequires: pkgconfig(lcms2)
+BuildRequires: pkgconfig(libjpeg)
+BuildRequires: pkgconfig(libopenjp2)
+BuildRequires: pkgconfig(libpng)
+BuildRequires: pkgconfig(libtiff-4)
+BuildRequires: pkgconfig(nss)
+BuildRequires: pkgconfig(poppler-data)
+BuildRequires: pkgconfig(Qt5Core)
+BuildRequires: pkgconfig(Qt5Gui)
+BuildRequires: pkgconfig(Qt5Test)
+BuildRequires: pkgconfig(Qt5Widgets)
+BuildRequires: pkgconfig(Qt5Xml)
+
+Requires: poppler-data
+
+Obsoletes: poppler-glib-demos < 0.60.1-1
+
+%description
+%{name} is a PDF rendering library.
+
+%package devel
+Summary: Libraries and headers for poppler
+Requires: %{name}%{?_isa} = %{version}-%{release}
+
+%description devel
+You should install the poppler-devel package if you would like to
+compile applications based on poppler.
+
+%package glib
+Summary: Glib wrapper for poppler
+Requires: %{name}%{?_isa} = %{version}-%{release}
+
+%description glib
+%{summary}.
+
+%package glib-devel
+Summary: Development files for glib wrapper
+Requires: %{name}-glib%{?_isa} = %{version}-%{release}
+Requires: %{name}-devel%{?_isa} = %{version}-%{release}
+Suggests: %{name}-doc = %{version}-%{release}
+
+%description glib-devel
+%{summary}.
+
+%package glib-doc
+Summary: Documentation for glib wrapper
+BuildArch: noarch
+
+%description glib-doc
+%{summary}.
+
+%package qt5
+Summary: Qt5 wrapper for poppler
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Obsoletes: %{name}-qt < 0.90.0-9
+%description qt5
+%{summary}.
+
+%package qt5-devel
+Summary: Development files for Qt5 wrapper
+Requires: %{name}-qt5%{?_isa} = %{version}-%{release}
+Requires: %{name}-devel%{?_isa} = %{version}-%{release}
+Requires: qt5-qtbase-devel
+Obsoletes: %{name}-qt-devel < 0.90.0-9
+%description qt5-devel
+%{summary}.
+
+%package cpp
+Summary: Pure C++ wrapper for poppler
+Requires: %{name}%{?_isa} = %{version}-%{release}
+
+%description cpp
+%{summary}.
+
+%package cpp-devel
+Summary: Development files for C++ wrapper
+Requires: %{name}-cpp%{?_isa} = %{version}-%{release}
+Requires: %{name}-devel%{?_isa} = %{version}-%{release}
+
+%description cpp-devel
+%{summary}.
+
+%package utils
+Summary: Command line utilities for converting PDF files
+Requires: %{name}%{?_isa} = %{version}-%{release}
+%description utils
+Command line tools for manipulating PDF files and converting them to
+other formats.
+
+%prep
+%autosetup -p1 -b 1
+
+chmod -x poppler/CairoFontEngine.cc
+
+%build
+%cmake \
+  -DENABLE_CMS=lcms2 \
+  -DENABLE_DCTDECODER=libjpeg \
+  -DENABLE_GTK_DOC=ON \
+  -DENABLE_LIBOPENJPEG=openjpeg2 \
+  -DENABLE_UNSTABLE_API_ABI_HEADERS=ON \
+  -DENABLE_ZLIB=OFF \
+  ..
+%cmake_build
+
+%install
+%cmake_install
+
+%check
+%make_build test
+
+# verify pkg-config sanity/version
+export PKG_CONFIG_PATH=%{buildroot}%{_datadir}/pkgconfig:%{buildroot}%{_libdir}/pkgconfig
+test "$(pkg-config --modversion poppler)" = "%{version}"
+test "$(pkg-config --modversion poppler-cpp)" = "%{version}"
+test "$(pkg-config --modversion poppler-glib)" = "%{version}"
+test "$(pkg-config --modversion poppler-qt5)" = "%{version}"
+
+%ldconfig_scriptlets
+
+%ldconfig_scriptlets glib
+
+%ldconfig_scriptlets qt5
+
+%ldconfig_scriptlets cpp
+
+%files
+%doc README.md
+%license COPYING
+%{_libdir}/libpoppler.so.106*
+
+%files devel
+%{_libdir}/pkgconfig/poppler.pc
+%{_libdir}/libpoppler.so
+%dir %{_includedir}/poppler/
+# xpdf headers
+%{_includedir}/poppler/*.h
+%{_includedir}/poppler/fofi/
+%{_includedir}/poppler/goo/
+%{_includedir}/poppler/splash/
+
+%files glib
+%{_libdir}/libpoppler-glib.so.8*
+%{_libdir}/girepository-1.0/Poppler-0.18.typelib
+
+%files glib-devel
+%{_libdir}/pkgconfig/poppler-glib.pc
+%{_libdir}/libpoppler-glib.so
+%{_datadir}/gir-1.0/Poppler-0.18.gir
+%{_includedir}/poppler/glib/
+
+%files glib-doc
+%license COPYING
+%{_datadir}/gtk-doc/
+
+%files qt5
+%{_libdir}/libpoppler-qt5.so.1*
+
+%files qt5-devel
+%{_libdir}/libpoppler-qt5.so
+%{_libdir}/pkgconfig/poppler-qt5.pc
+%{_includedir}/poppler/qt5/
+
+%files cpp
+%{_libdir}/libpoppler-cpp.so.0*
+
+%files cpp-devel
+%{_libdir}/pkgconfig/poppler-cpp.pc
+%{_libdir}/libpoppler-cpp.so
+%{_includedir}/poppler/cpp
+
+%files utils
+%{_bindir}/pdf*
+%{_mandir}/man1/*
+
+%changelog
+* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 21.01.0-12
+- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
+  Related: rhbz#1991688
+
+* Thu Jun 17 2021 Marek Kasik <mkasik@redhat.com> - 21.01.0-11
+- Backport fixes for issues found by Coverity Scan
+- and fix some of the new issues
+- Resolves: #1967967
+
+* Mon Jun 14 2021 Marek Kasik <mkasik@redhat.com> - 21.01.0-10
+- Fix showing of upper-case non-ASCII characters in annotations
+- Resolves: #1968289
+
+* Mon Jun 14 2021 Marek Kasik <mkasik@redhat.com> - 21.01.0-9
+- Remove searchAcrossLines.pdf due to license
+- Resolves: #1967921
+
+* Mon May 10 2021 Marek Kasik <mkasik@redhat.com> - 21.01.0-8
+- Implement crypto functions using NSS
+- Resolves: #1944726
+
+* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 21.01.0-7
+- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
+
+* Tue Mar 30 2021 Jonathan Wakely <jwakely@redhat.com> - 21.01.0-6
+- Rebuilt for removed libstdc++ symbol (#1937698)
+
+* Tue Feb 9 2021 Marek Kasik <mkasik@redhat.com> - 21.01.0-5
+- Obsolete Qt4 frontend
+- Resolves: #1926010
+
+* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 21.01.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Fri Jan 15 2021 Marek Kasik <mkasik@redhat.com> - 21.01.0-3
+- Improve the previous fix
+- Resolves: #1915776
+
+* Wed Jan 13 2021 Marek Kasik <mkasik@redhat.com> - 21.01.0-2
+- Fix multilib property of poppler-glib
+- by using the same build directory for all architectures
+- Resolves: #1915776
+
+* Mon Jan 11 2021 Marek Kasik <mkasik@redhat.com> - 21.01.0-1
+- Update to 21.01.0
+- Remove the Qt4 frontend
+- Resolves: #1673727
+
+* Mon Dec 07 2020 Marek Kasik <mkasik@redhat.com> - 0.90.0-8
+- Build Qt4 frontend on Fedora only
+
+* Sat Oct 31 2020 Jeff Law <law@redhat.com> - 0.90.0-7
+- Fix bogus volatiles caught by gcc-11
+
+* Tue Aug 04 2020 Marek Kasik <mkasik@redhat.com> - 0.90.0-6
+- Align poppler with
+- https://fedoraproject.org/wiki/Changes/CMake_to_do_out-of-source_builds
+- Resolves: #1865248
+
+* Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.90.0-5
+- Second attempt - Rebuilt for
+  https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.90.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Fri Jul 10 2020 Marek Kasik <mkasik@redhat.com> - 0.90.0-3
+- Fix some other issues.
+- Resolves: #1673727
+
+* Fri Jul 10 2020 Marek Kasik <mkasik@redhat.com> - 0.90.0-2
+- Compile poppler with position independent code turned on.
+- Otherwise it doesn't build on Fedora 33.
+- Resolves: #1673727
+
+* Wed Jul 08 2020 Marek Kasik <mkasik@redhat.com> - 0.90.0-1
+- Update to 0.90.0
+- Resolves: #1673727
+
+* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.84.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Fri Jan 17 2020 Marek Kasik <mkasik@redhat.com> - 0.84.0-1
+- Update to 0.84.0
+- Resolves: #1673727
+
+* Fri Dec 20 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-15
+- Check scaled dimensions for 0
+- Resolves: #1785416
+
+* Wed Jul 24 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-14
+- Ignore dict Length if it is broken
+- Resolves: #1732342
+
+* Thu May 30 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-13
+- Don't read outside of image buffer in PSOutputDev
+- Resolves: #1696640
+
+* Thu May 30 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-12
+- SplashXPathScanner::clipAALine: Fix crash on broken file
+- Resolves: #1696640
+
+* Thu May 30 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-11
+- Restrict filling of overlapping boxes in Splash
+- Resolves: #1696640
+
+* Wed May 29 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-10
+- Fail gracefully if not all components of JPEG2000Stream
+- have the same size
+- Resolves: #1713585
+
+* Wed Apr 17 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-9
+- Fix infinite loop in broken files
+- Resolves: #1699863
+
+* Mon Apr 1 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-8
+- Constrain number of cycles in rescale filter
+- Compute correct coverage values for box filter
+- Resolves: #1686803
+
+* Mon Apr 1 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-7
+- Fix stack overflow on broken file
+- Resolves: #1691725
+
+* Mon Mar 11 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-6
+- Fix possible crash on broken files in ImageStream::getLine()
+- Resolves: #1683633
+
+* Fri Mar 8 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-5
+- Synchronize previous patch with upstream
+- Related: #1665274
+
+* Wed Feb 20 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-4
+- Check Catalog from XRef for being a Dict
+- Resolves: #1665274
+
+* Wed Feb 20 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-3
+- Defend against requests for negative XRef indices
+- Resolves: #1672420
+
+* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.73.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Fri Jan 25 2019 Marek Kasik <mkasik@redhat.com> - 0.73.0-1
+- Update to 0.73.0
+
+* Tue Jan 22 2019 Marek Kasik <mkasik@redhat.com> - 0.67.0-10
+- Avoid global display profile state becoming an uncontrolled
+- memory leak
+- Resolves: #1646549
+
+* Mon Jan 21 2019 Marek Kasik <mkasik@redhat.com> - 0.67.0-9
+- Do not try to parse into unallocated XRef entry
+- Resolves: #1665268
+
+* Mon Jan 21 2019 Marek Kasik <mkasik@redhat.com> - 0.67.0-8
+- Move the fileSpec.dictLookup call inside fileSpec.isDict if
+- Resolves: #1665264
+
+* Mon Jan 21 2019 Marek Kasik <mkasik@redhat.com> - 0.67.0-7
+- Do not try to construct invalid rich media annotation assets
+- Resolves: #1665260
+
+* Thu Nov 15 2018 Marek Kasik <mkasik@redhat.com> - 0.67.0-6
+- Check for valid file name of embedded file
+- Resolves: #1649451
+
+* Thu Nov 15 2018 Marek Kasik <mkasik@redhat.com> - 0.67.0-5
+- Check for valid embedded file before trying to save it
+- Resolves: #1649441
+
+* Thu Nov 15 2018 Marek Kasik <mkasik@redhat.com> - 0.67.0-4
+- Check for stream before calling stream methods
+- when saving an embedded file
+- Resolves: #1649436
+
+* Mon Nov 12 2018 Marek Kasik <mkasik@redhat.com> - 0.67.0-3
+- Avoid cycles in PDF parsing
+- Resolves: #1626620
+
+* Wed Oct 17 2018 Marek Kasik <mkasik@redhat.com> - 0.67.0-2
+- Fix crash on missing embedded file
+- Resolves: #1569334
+
+* Tue Aug 14 2018 Marek Kasik <mkasik@redhat.com> - 0.67.0-1
+- Update to 0.67.0
+- Resolves: #1568641
+
+* Tue Aug  7 2018 Marek Kasik <mkasik@redhat.com> - 0.63.0-8
+- Fix tiling patterns when pattern cell is too far
+- Resolves: #1557355
+
+* Tue Jul 31 2018 Florian Weimer <fweimer@redhat.com> - 0.63.0-7
+- Rebuild with fixed binutils
+
+* Fri Jul 27 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 0.63.0-6
+- Rebuild for new binutils
+
+* Thu Jul 26 2018 Marek Kasik <mkasik@redhat.com> - 0.63.0-5
+- Fix crash when Object has negative number (CVE-2018-13988)
+- Resolves: #1607461
+
+* Mon Jul 23 2018 Marek Kasik <mkasik@redhat.com> - 0.63.0-4
+- Use /usr/bin/python3 explicitly
+- https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3#Transition_Steps
+- Resolves: #1605490
+
+* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 0.63.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Mon May 28 2018 Marek Kasik <mkasik@redhat.com> - 0.63.0-2
+- Fix infinite recursion (CVE-2017-18267)
+- Resolves: #1578780
+
+* Fri Mar 23 2018 Marek Kasik <mkasik@redhat.com> - 0.63.0-1
+- Update to 0.63.0
+- Resolves: #1558001
+
+* Wed Mar 07 2018 Rex Dieter <rdieter@fedoraproject.org> - 0.62.0-2
+- BR: gcc-c++, use %%ldconfig_scriptlets %%make_build %%make_install
+
+* Wed Feb 14 2018 David Tardon <dtardon@redhat.com> - 0.62.0-1
+- new upstream release
+
+* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 0.61.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Tue Nov 14 2017 David Tardon <dtardon@redhat.com> - 0.61.1-1
+- new upstream release
+
+* Mon Nov 06 2017 David Tardon <dtardon@redhat.com> - 0.61.0-1
+- new upstream release
+
+* Tue Oct 24 2017 Rex Dieter <rdieter@fedoraproject.org> - 0.60.1-2
+- -qt5: drop hard-coded versioned dependency
+
+* Wed Oct 04 2017 David Tardon <dtardon@redhat.com> - 0.60.0-1
+- new upstream release
+
+* Mon Sep 25 2017 Caolán McNamara <caolanm@redhat.com> - 0.59.0-2
+- Resolves: rhbz#1494583 CVE-2017-14520
+
+* Mon Sep 04 2017 David Tardon <dtardon@redhat.com> - 0.59.0-1
+- new upstream release
+
+* Thu Aug 03 2017 David Tardon <dtardon@redhat.com> - 0.57.0-1
+- new upstream release
+
+* Thu Aug 03 2017 Fedora Release Engineering <releng@fedoraproject.org> - 0.56.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Thu Jul 27 2017 Fedora Release Engineering <releng@fedoraproject.org> - 0.56.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Wed Jul 12 2017 Caolán McNamara <caolanm@redhat.com> - 0.56.0-2
+- Resolves: rhbz#1459067 CVE-2017-7515 CVE-2017-9775 CVE-2017-9776 CVE-2017-9865
+
+* Fri Jun 23 2017 David Tardon <dtardon@redhat.com> - 0.56.0-1
+- new upstream release
+
+* Tue May 30 2017 Caolán McNamara <caolanm@redhat.com> - 0.55.0-2
+- Resolves: rhbz#1456828 CVE-2017-7511 Null pointer deference
+
+* Tue May 23 2017 David Tardon <dtardon@redhat.com> - 0.55.0-1
+- new upstream release
+
+* Mon Mar 20 2017 David Tardon <dtardon@redhat.com> - 0.53.0-1
+- new upstream release
+
+* Fri Feb 17 2017 David Tardon <dtardon@redhat.com> - 0.52.0-1
+- new upstream release
+
+* Sat Feb 11 2017 Fedora Release Engineering <releng@fedoraproject.org> - 0.51.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Mon Jan 16 2017 Caolán McNamara <caolanm@redhat.com> - 0.51.0-1
+- new upstream release
+
+* Fri Dec 16 2016 David Tardon <dtardon@redhat.com> - 0.50.0-1
+- new upstream release
+
+* Tue Nov 22 2016 David Tardon <dtardon@redhat.com> - 0.49.0-1
+- new upstream release
+
+* Fri Oct 21 2016 Marek Kasik <mkasik@redhat.com> - 0.48.0-1
+- Update to 0.48.0
+- Resolves: #1359555
+
+* Mon Sep 26 2016 Marek Kasik <mkasik@redhat.com> - 0.45.0-2
+- Don't crash when calling cmsGetColorSpace()
+- Resolves: #1363669
+
+* Mon Jul 18 2016 Marek Kasik <mkasik@redhat.com> - 0.45.0-1
+- Update to 0.45.0
+- Resolves: #1338421
+
+* Mon Jul 11 2016 Marek Kasik <mkasik@redhat.com> - 0.43.0-2
+- Restore the current position of char also in output device
+- Related: #1352717
+
+* Tue May  3 2016 Marek Kasik <mkasik@redhat.com> - 0.43.0-1
+- Update to 0.43.0
+- Resolves: #1318462
+
+* Fri Feb 26 2016 Marek Kasik <mkasik@redhat.com> - 0.41.0-1
+- Update to 0.41.0
+- Resolves: #1309145
+
+* Thu Feb 04 2016 Fedora Release Engineering <releng@fedoraproject.org> - 0.40.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Fri Jan 22 2016 Marek Kasik <mkasik@redhat.com> - 0.40.0-1
+- Update to 0.40.0
+- Resolves: #1251781
+
+* Wed Jul 22 2015 Marek Kasik <mkasik@redhat.com> - 0.34.0-1
+- Update to 0.34.0
+- Resolves: #1241305
+
+* Thu Jun 18 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.33.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Fri Jun  5 2015 Marek Kasik <mkasik@redhat.com> - 0.33.0-1
+- Update to 0.33.0
+- Resolves: #1190427
+
+* Sat May 02 2015 Kalev Lember <kalevlember@gmail.com> - 0.30.0-5
+- Rebuilt for GCC 5 C++11 ABI change
+
+* Thu Mar 26 2015 Marek Kasik <mkasik@redhat.com> - 0.30.0-4
+- Respect orientation when selecting words
+- Resolves: #1185007
+
+* Sat Feb 21 2015 Till Maas <opensource@till.name> - 0.30.0-3
+- Rebuilt for Fedora 23 Change
+  https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code
+
+* Fri Jan 23 2015 Marek Kasik <mkasik@redhat.com> - 0.30.0-2
+- Use libopenjpeg2 instead of libopenjpeg
+
+* Fri Jan 23 2015 Marek Kasik <mkasik@redhat.com> - 0.30.0-1
+- Update to 0.30.0
+- Resolves: #1171056
+
+* Tue Jan 20 2015 Marek Kasik <mkasik@redhat.com> - 0.28.1-3
+- Revert previous commit (It needs poppler-0.30.0)
+
+* Tue Jan 20 2015 Marek Kasik <mkasik@redhat.com> - 0.28.1-2
+- Use libopenjpeg2 instead of libopenjpeg
+
+* Fri Nov 14 2014 Marek Kasik <mkasik@redhat.com> - 0.28.1-1
+- Update to 0.28.1
+- Resolves: #1147443
+
+* Wed Aug 27 2014 Marek Kasik <mkasik@redhat.com> - 0.26.4-1
+- Update to 0.26.4
+
+* Sun Aug 17 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.26.3-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Wed Jul 30 2014 Marek Kasik <mkasik@redhat.com> - 0.26.3-1
+- Update to 0.26.3
+
+* Tue Jul 22 2014 Kalev Lember <kalevlember@gmail.com> - 0.26.2-2
+- Rebuilt for gobject-introspection 1.41.4
+
+* Fri Jun 27 2014 Marek Kasik <mkasik@redhat.com> - 0.26.2-1
+- Update to 0.26.2
+
+* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.26.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Tue May 13 2014 Marek Kasik <mkasik@redhat.com> - 0.26.0-1
+- Update to 0.26.0
+
+* Fri Jan  3 2014 Marek Kasik <mkasik@redhat.com> - 0.24.3-3
+- Use correct format string
+- Resolves: #1048202
+
+* Mon Nov 11 2013 Rex Dieter <rdieter@fedoraproject.org> 0.24.3-2
+- rebuild (qt5 qreal/arm)
+
+* Tue Oct 29 2013 Marek Kasik <mkasik@redhat.com> - 0.24.3-1
+- Update to 0.24.3
+- Resolves: #1023712
+
+* Fri Oct 18 2013 Rex Dieter <rdieter@fedoraproject.org> - 0.24.2-4
+- fix mocversiongrep configure checks (so Qt 5.2 works)
+- %%configure --disable-silent-rules
+
+* Fri Oct 18 2013 Rex Dieter <rdieter@fedoraproject.org> 0.24.2-3
+- undo ExcludeArch: ppc ppc64 (qt5-qtbase-5.1.1-6+ fixed)
+
+* Thu Oct 17 2013 Rex Dieter <rdieter@fedoraproject.org> 0.24.2-2
+- -qt5: ExcludeArch: ppc ppc64 (f20, hopefully temporary)
+
+* Mon Sep 30 2013 Marek Kasik <mkasik@redhat.com> - 0.24.2-1
+- Update to 0.24.2
+
+* Mon Sep 30 2013 Marek Kasik <mkasik@redhat.com> - 0.24.1-2
+- Don't convert pdftohtml.1 to UTF-8, it is already UTF-8
+
+* Tue Aug 27 2013 Marek Kasik <mkasik@redhat.com> - 0.24.1-1
+- Update to 0.24.1
+
+* Tue Aug 20 2013 Marek Kasik <mkasik@redhat.com> - 0.24.0-2
+- Fix Qt5 requirements
+
+* Mon Aug 19 2013 Marek Kasik <mkasik@redhat.com> - 0.24.0-1
+- Update to 0.24.0
+
+* Sun Aug 04 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.22.5-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Mon Jun 24 2013 Marek Kasik <mkasik@redhat.com> 0.22.5-1
+- Update to 0.22.5
+
+* Thu Jun 20 2013 Marek Kasik <mkasik@redhat.com> 0.22.1-5
+- Switch from LCMS to LCMS2
+- Resolves: #975465
+
+* Wed Jun  5 2013 Marek Kasik <mkasik@redhat.com> 0.22.1-4
+- Fix changelog dates
+
+* Fri Apr 12 2013 Marek Kasik <mkasik@redhat.com> 0.22.1-3
+- Enable generating of TIFF files by pdftoppm
+
+* Thu Apr 11 2013 Marek Kasik <mkasik@redhat.com> 0.22.1-2
+- Fix man pages of pdftops and pdfseparate
+
+* Wed Feb 27 2013 Marek Kasik <mkasik@redhat.com> 0.22.1-1
+- Update to 0.22.1
+
+* Thu Feb 14 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.22.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Sun Jan 20 2013 Rex Dieter <rdieter@fedoraproject.org> 0.22.0-2
+- -demos: omit extraneous (and broken) dep
+
+* Fri Jan 18 2013 Marek Kasik <mkasik@redhat.com> 0.22.0-1
+- Update to 0.22.0
+
+* Tue Nov 13 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-9
+- Move poppler-glib-demo to new sub-package demos
+- Resolves: #872338
+
+* Mon Nov 12 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-8
+- Add references to corresponding bugs for poppler-0.20.3-5.patch
+
+* Tue Nov  6 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-7
+- Add missing hunk to patch poppler-0.20.3-5.patch
+
+* Tue Nov  6 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-6
+- Backport most of the changes from poppler-0.20.3 - poppler-0.20.5
+-   (those which doesn't change API or ABI and are important)
+- See poppler-0.20.3-5.patch for detailed list of included commits
+
+* Wed Oct 31 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-5
+- Remove unused patch
+
+* Wed Oct 31 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-4
+- Update License field
+
+* Mon Aug  6 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-3
+- Fix conversion to ps when having multiple strips
+
+* Mon Aug  6 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-2
+- Make sure xScale and yScale are always initialized
+- Resolves: #840515
+
+* Mon Aug  6 2012 Marek Kasik <mkasik@redhat.com> 0.20.2-1
+- Update to 0.20.2
+
+* Mon Aug  6 2012 Marek Kasik <mkasik@redhat.com> 0.20.1-3
+- Try empty string instead of NULL as password if needed
+- Resolves: #845578
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.20.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Mon Jul  2 2012 Marek Kasik <mkasik@redhat.com> 0.20.1-1
+- Update to 0.20.1
+
+* Mon Jun 25 2012 Nils Philippsen <nils@redhat.com>
+- license is "GPLv2 or GPLv3" from poppler-0.20.0 on (based off xpdf-3.03)
+
+* Wed May 16 2012 Marek Kasik <mkasik@redhat.com> 0.20.0-1
+- Update to 0.20.0
+
+* Fri May  4 2012 Marek Kasik <mkasik@redhat.com> 0.18.4-3
+- Backport of a patch which sets mask matrix before drawing an image with a mask
+- Resolves: #817378
+
+* Tue Feb 28 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.18.4-2
+- Rebuilt for c++ ABI breakage
+
+* Sat Feb 18 2012 Rex Dieter <rdieter@fedoraproject.org> 0.18.4-1
+- 0.18.4
+
+* Thu Feb 09 2012 Rex Dieter <rdieter@fedoraproject.org> 0.18.3-3
+- rebuild (openjpeg)
+
+* Tue Jan 17 2012 Rex Dieter <rdieter@fedoraproject.org> 0.18.3-2
+- -devel: don't own all headers
+
+* Mon Jan 16 2012 Rex Dieter <rdieter@fedoraproject.org> 0.18.3-1
+- 0.18.3
+
+* Sat Jan 14 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.18.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Tue Dec 06 2011 Marek Kasik <mkasik@redhat.com> - 0.18.2-1
+- Update to 0.18.2
+- Remove upstreamed patches
+
+* Mon Dec 05 2011 Adam Jackson <ajax@redhat.com> 0.18.1-3
+- Rebuild for new libpng
+
+* Fri Oct 28 2011 Rex Dieter <rdieter@fedoraproject.org> 0.18.1-2
+- poppler-glib.pc pkgconfig file broken (#749898)
+- %%check: verify pkgconfig sanity
+
+* Fri Oct 28 2011 Rex Dieter <rdieter@fedoraproject.org> 0.18.1-1
+- Update to 0.18.1
+- pkgconfig-style deps
+- tighten deps with %%_isa
+
+* Fri Sep 30 2011 Marek Kasik <mkasik@redhat.com> - 0.18.0-2
+- rebuild 
+
+* Fri Sep 30 2011 Marek Kasik <mkasik@redhat.com> - 0.18.0-1
+- Update to 0.18.0
+
+* Mon Sep 26 2011 Marek Kasik <mkasik@redhat.com> - 0.17.3-2
+- Don't include pdfextract and pdfmerge in resulting packages for now
+- since they conflict with packages pdfmerge and mupdf (#740906)
+
+* Mon Sep 19 2011 Marek Kasik <mkasik@redhat.com> - 0.17.3-1
+- Update to 0.17.3
+
+* Wed Aug 17 2011 Marek Kasik <mkasik@redhat.com> - 0.17.0-2
+- Fix a problem with freeing of memory in PreScanOutputDev (#730941)
+
+* Fri Jul 15 2011 Marek Kasik <mkasik@redhat.com> - 0.17.0-1
+- Update to 0.17.0
+
+* Thu Jun 30 2011 Rex Dieter <rdieter@fedoraproject.org> 0.16.7-1
+- 0.16.7
+
+* Wed Jun 22 2011 Marek Kasik <mkasik@redhat.com> - 0.16.6-2
+- Drop dependency on gtk-doc (#604412)
+
+* Thu Jun  2 2011 Marek Kasik <mkasik@redhat.com> - 0.16.6-1
+- Update to 0.16.6
+
+* Thu May  5 2011 Marek Kasik <mkasik@redhat.com> - 0.16.5-1
+- Update to 0.16.5
+
+* Thu Mar 31 2011 Marek Kasik <mkasik@redhat.com> - 0.16.4-1
+- Update to 0.16.4
+
+* Sun Mar 13 2011 Marek Kasik <mkasik@redhat.com> - 0.16.3-2
+- Update to 0.16.3
+
+* Sun Mar 13 2011 Marek Kasik <mkasik@redhat.com> - 0.16.3-1
+- Update to 0.16.3
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.16.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Wed Feb  2 2011 Marek Kasik <mkasik@redhat.com> - 0.16.2-1
+- Update to 0.16.2
+
+* Tue Jan 18 2011 Rex Dieter <rdieter@fedoraproject.org> - 0.16.0-3
+- drop qt3 bindings
+- rename -qt4 -> -qt
+
+* Wed Jan 12 2011 Rex Dieter <rdieter@fedoraproject.org> - 0.16.0-2
+- rebuild (openjpeg)
+
+* Mon Dec 27 2010 Rex Dieter <rdieter@fedoraproject.org> - 0.16.0-1
+- 0.16.0
+
+* Fri Dec 10 2010 Marek Kasik <mkasik@redhat.com> - 0.15.3-1
+- Update to 0.15.3
+
+* Mon Nov  1 2010 Marek Kasik <mkasik@redhat.com> - 0.15.1-1
+- Update to 0.15.1
+- Remove CVE-2010-3702, 3703 and 3704 patches (they are already in 0.15.1)
+
+* Thu Oct  7 2010 Marek Kasik <mkasik@redhat.com> - 0.15.0-5
+- Add poppler-0.15.0-CVE-2010-3702.patch
+    (Properly initialize parser)
+- Add poppler-0.15.0-CVE-2010-3703.patch
+    (Properly initialize stack)
+- Add poppler-0.15.0-CVE-2010-3704.patch
+    (Fix crash in broken pdf (code < 0))
+- Resolves: #639861
+
+* Wed Sep 29 2010 jkeating - 0.15.0-4
+- Rebuilt for gcc bug 634757
+
+* Mon Sep 27 2010 Marek Kasik <mkasik@redhat.com> - 0.15.0-3
+- Remove explicit requirement of gobject-introspection
+
+* Fri Sep 24 2010 Marek Kasik <mkasik@redhat.com> - 0.15.0-2
+- Move requirement of gobject-introspection to glib sub-package
+
+* Fri Sep 24 2010 Marek Kasik <mkasik@redhat.com> - 0.15.0-1
+- Update to 0.15.0
+- Enable introspection
+
+* Sat Sep 11 2010 Rex Dieter <rdieter@fedoraproject.org> - 0.14.3-1
+- Update to 0.14.3
+
+* Thu Aug 19 2010 Marek Kasik <mkasik@redhat.com> - 0.14.2-1
+- Update to 0.14.2
+- Remove poppler-0.12.1-objstream.patch
+
+* Fri Jul 16 2010 Marek Kasik <mkasik@redhat.com> - 0.14.1-1
+- Update to 0.14.1
+- Don't apply poppler-0.12.1-objstream.patch, it is not needed anymore
+
+* Fri Jun 18 2010 Matthias Clasen <mclasen@redhat.com> - 0.14.0-1
+- Update to 0.14.0
+
+* Wed May 26 2010 Marek Kasik <mkasik@redhat.com> - 0.13.4-1
+- poppler-0.13.4
+
+* Mon May  3 2010 Marek Kasik <mkasik@redhat.com> - 0.13.3-2
+- Update "sources" file
+- Add BuildRequires "gettext-devel"
+
+* Fri Apr 30 2010 Marek Kasik <mkasik@redhat.com> - 0.13.3-1
+- poppler-0.13.3
+
+* Thu Mar  4 2010 Marek Kasik <mkasik@redhat.com> - 0.12.4-2
+- Fix showing of radio buttons (#480868)
+
+* Thu Feb 18 2010 Rex Dieter <rdieter@fedoraproject.org> - 0.12.4-1
+- popper-0.12.4
+
+* Tue Feb 16 2010 Marek Kasik <mkasik@redhat.com> - 0.12.3-9
+- Fix downscaling of rotated pages (#563353)
+
+* Thu Jan 28 2010 Marek Kasik <mkasik@redhat.com> - 0.12.3-8
+- Get current FcConfig before using it (#533992)
+
+* Sun Jan 24 2010 Rex Dieter <rdieter@fedoraproject.org> - 0.12.3-7
+- use alternative/upstream downscale patch (#556549, fdo#5589)
+
+* Wed Jan 20 2010 Marek Kasik <mkasik@redhat.com> - 0.12.3-6
+- Add dependency on poppler-data (#553991)
+
+* Tue Jan 19 2010 Rex Dieter <rdieter@fedoraproject.org> - 0.12.3-5
+- cairo backend, scale images correctly (#556549, fdo#5589)
+
+* Fri Jan 15 2010 Rex Dieter <rdieter@fedoraproject.org> - 0.12.3-4
+- Sanitize versioned Obsoletes/Provides
+
+* Fri Jan 15 2010 Marek Kasik <mkasik@redhat.com> - 0.12.3-3
+- Correct permissions of goo/GooTimer.h
+- Convert pdftohtml.1 to utf8
+- Make the pdftohtml's Provides/Obsoletes versioned
+
+* Thu Jan 07 2010 Rex Dieter <rdieter@fedoraproject.org> - 0.12.3-1
+- poppler-0.12.3
+
+* Mon Nov 23 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.12.2-1
+- poppler-0.12.2
+
+* Sun Oct 25 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.12.1-3
+- CVE-2009-3607 poppler: create_surface_from_thumbnail_data
+  integer overflow (#526924)
+
+* Mon Oct 19 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.12.1-1
+- poppler-0.12.1
+- deprecate xpdf/pdftohtml Conflicts/Obsoletes
+
+* Wed Sep 09 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.12.0-1
+- Update to 0.12.0
+
+* Tue Aug 18 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.11.3-1
+- Update to 0.11.3
+
+* Mon Aug  3 2009 Matthias Clasen <mclasen@redhat.com> - 0.11.2-1
+- Update to 0.11.2
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.11.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Tue Jun 23 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.11.1-2
+- omit poppler-data (#507675)
+
+* Tue Jun 23 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.11.1-1
+- poppler-0.11.1
+
+* Mon Jun 22 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.11.0-6
+- reduce lib deps in qt/qt4 pkg-config support
+
+* Sat Jun 20 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.11.0-5
+- --enable-libjpeg
+- (explicitly) --disable-zlib
+
+* Fri Jun 19 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.11.0-3
+- --enable-libopenjpeg, --disable-zlib
+
+* Sun May 24 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.11.0-2
+- update changelog
+- track sonames
+
+* Tue May 19 2009 Bastien Nocera <bnocera@redhat.com> - 0.11.0-1
+- Update to 0.11.0
+
+* Thu Mar 12 2009 Matthias Clasen <mclasen@redhat.com> - 0.10.5-1
+- Update to 0.10.5
+
+* Thu Feb 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.10.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Tue Feb 17 2009 Matthias Clasen <mclasen@redhat.com> - 0.10.4-1
+- Update to 0.10.4
+
+* Tue Jan 20 2009 Rex Dieter <rdieter@fedoraproject.org> - 0.10.3-2
+- add needed scriptlets
+- nuke rpaths
+
+* Tue Jan 13 2009 Matthias Clasen <mclasen@redhat.com> - 0.10.3-1
+- Update to 0.10.3
+
+* Wed Dec 17 2008 Matthias Clasen <mclasen@redhat.com> - 0.10.2-1
+- Update to 0.10.2
+
+* Tue Nov 11 2008 Matthias Clasen <mclasen@redhat.com> - 0.10.1-1
+- Update to 0.10.1 and  -data 0.2.1
+
+* Tue Sep 16 2008 Rex Dieter <rdieter@fedoraproject.org> - 0.8.7-2
+- cleanup qt3 hack
+- %%description cosmetics
+
+* Sun Sep  7 2008 Matthias Clasen <mclasen@redhat.com> - 0.8.7-1
+- Update to 0.8.7
+
+* Fri Aug 22 2008 Matthias Clasen <mclasen@redhat.com> - 0.8.6-1
+- Update to 0.8.6
+
+* Tue Aug 05 2008 Colin Walters <walters@redhat.com> - 0.8.5-1
+- Update to 0.8.5
+
+* Wed Jun  4 2008 Matthias Clasen <mclasen@redhat.com> - 0.8.3-1
+- Update to 0.8.3
+
+* Mon Apr 28 2008 Matthias Clasen <mclasen@redhat.com> - 0.8.1-1
+- Update to 0.8.1
+
+* Sun Apr 06 2008 Adam Jackson <ajax@redhat.com> 0.8.0-3
+- poppler-0.8.0-ocg-crash.patch: Fix a crash when no optional content
+  groups are defined.
+- Mangle configure to account for the new directory for qt3 libs.
+- Fix grammar in %%description.
+
+* Tue Apr 01 2008 Rex Dieter <rdieter@fedoraproject.org> - 0.8.0-2
+- -qt-devel: Requires: qt3-devel
+
+* Sun Mar 30 2008 Matthias Clasen <mclasen@redhat.com> - 0.8.0-1
+- Update to 0.8.0
+
+* Sun Mar 23 2008 Matthias Clasen <mclasen@redhat.com> - 0.7.3-1
+- Update to 0.7.3
+
+* Wed Mar 12 2008 Matthias Clasen <mclasen@redhat.com> - 0.7.2-1
+- Update to 0.7.2
+
+* Thu Feb 28 2008 Matthias Clasen <mclasen@redhat.com> - 0.7.1-1
+- Update to 0.7.1
+
+* Thu Feb 21 2008 Matthias Clasen <mclasen@redhat.com> - 0.7.0-1
+- Update to 0.7.0
+
+* Tue Feb 19 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 0.6.4-4
+- Autorebuild for GCC 4.3
+
+* Mon Feb 18 2008 Jindrich Novy <jnovy@redhat.com> - 0.6.4-3
+- apply ObjStream patch (#433090)
+
+* Tue Jan 29 2008 Matthias Clasen <mclasen@redhat.com> - 0.6.4-2
+- Add some required inter-subpackge deps
+
+* Tue Jan 29 2008 Matthias Clasen <mclasen@redhat.com> - 0.6.4-1
+- Update to 0.6.4
+- Split off poppler-glib
+
+* Sun Dec  2 2007 Matthias Clasen <mclasen@redhat.com> - 0.6.2-3
+- Fix the qt3 checks some more
+
+* Wed Nov 28 2007 Matthias Clasen <mclasen@redhat.com> - 0.6.2-2
+- package xpdf headers in poppler-devel (Jindrich Novy)
+- Fix qt3 detection (Denis Leroy)
+
+* Thu Nov 22 2007 Matthias Clasen <mclasen@redhat.com> - 0.6.2-1
+- Update to 0.6.2
+
+* Thu Oct 11 2007 Rex Dieter <rdieter[AT]fedoraproject.org> - 0.6-2
+- include qt4 wrapper
+
+* Tue Sep  4 2007 Kristian Høgsberg <krh@redhat.com> - 0.6-1
+- Update to 0.6
+
+* Wed Aug 15 2007 Matthias Clasen <mclasen@redhat.com> - 0.5.91-2
+- Remove debug spew
+
+* Tue Aug 14 2007 Matthias Clasen <mclasen@redhat.com> - 0.5.91-1
+- Update to 0.5.91
+
+* Wed Aug  8 2007 Matthias Clasen <mclasen@redhat.com> - 0.5.9-2
+- Update the license field
+
+* Mon Jun 18 2007 Matthias Clasen <mclasen@redhat.com> - 0.5.9-1
+- Update to 0.5.9
+
+* Thu Mar  1 2007 Bill Nottingham <notting@redhat.com> - 0.5.4-7
+- fix it so the qt pkgconfig/.so aren't in the main poppler-devel
+
+* Fri Dec 15 2006 Matthias Clasen <mclasen@redhat.com> - 0.5.4-5
+- Include epoch in the Provides/Obsoletes for xpdf-utils
+
+* Wed Dec 13 2006 Matthias Clasen <mclasen@redhat.com> - 0.5.4-4
+- Add Provides/Obsoletes for xpdf-utils (#219033)
+
+* Fri Dec 08 2006 Rex Dieter <rexdieter[AT]users.sf.net> - 0.5.4-3
+- drop hard-wired: Req: gtk2
+- --disable-static
+- enable qt wrapper
+- -devel: Requires: pkgconfig
+
+* Sun Oct 01 2006 Jesse Keating <jkeating@redhat.com> - 0.5.4-2
+- rebuilt for unwind info generation, broken in gcc-4.1.1-21
+
+* Thu Sep 21 2006 Kristian Høgsberg <krh@redhat.com> - 0.5.4-1.fc6
+- Rebase to 0.5.4, drop poppler-0.5.3-libs.patch, fixes #205813,
+  #205549, #200613, #172137, #172138, #161293 and more.
+
+* Wed Sep 13 2006 Kristian Høgsberg <krh@redhat.com> - 0.5.3-3.fc6
+- Move .so to -devel (#203637).
+
+* Mon Aug 14 2006 Matthias Clasen <mclasen@redhat.com> - 0.5.3-2.fc6
+- link against fontconfig (see bug 202256)
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 0.5.3-1.1
+- rebuild
+
+* Wed May 31 2006 Kristian Høgsberg <krh@redhat.com> 0.5.3-1
+- Update to 0.5.3.
+
+* Mon May 22 2006 Kristian Høgsberg <krh@redhat.com> 0.5.2-1
+- Update to 0.5.2.
+
+* Wed Mar  1 2006 Kristian Høgsberg <krh@redhat.com> 0.5.1-2
+- Rebuild the get rid of old soname dependency.
+
+* Tue Feb 28 2006 Kristian Høgsberg <krh@redhat.com> 0.5.1-1
+- Update to version 0.5.1.
+
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 0.5.0-4.2
+- bump again for double-long bug on ppc(64)
+
+* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 0.5.0-4.1
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Wed Jan 18 2006 Ray Strode <rstrode@redhat.com> - 0.5.0-4
+- change xpdf conflict version to be <= instead of <
+
+* Wed Jan 18 2006 Ray Strode <rstrode@redhat.com> - 0.5.0-3
+- update conflicts: xpdf line to be versioned
+
+* Wed Jan 11 2006 Kristian Høgsberg <krh@redhat.com> - 0.5.0-2.0
+- Update to 0.5.0 and add poppler-utils subpackage.
+- Flesh out poppler-utils subpackage.
+
+* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
+- rebuilt
+
+* Sun Sep  4 2005 Kristian Høgsberg <krh@redhat.com> - 0.4.2-1
+- Update to 0.4.2 and disable splash backend so we don't build it.
+
+* Fri Aug 26 2005 Marco Pesenti Gritti <mpg@redhat.com> - 0.4.1-2
+- Rebuild
+
+* Fri Aug 26 2005 Marco Pesenti Gritti <mpg@redhat.com> - 0.4.1-1
+- Update to 0.4.1
+
+* Wed Aug 17 2005 Kristian Høgsberg <krh@redhat.com> - 0.4.0-2
+- Bump release and rebuild.
+
+* Wed Aug 17 2005 Marco Pesenti gritti <mpg@redhat.com> - 0.4.0-1
+- Update to 0.4.0
+
+* Mon Aug 15 2005 Kristian Høgsberg <krh@redhat.com> - 0.3.3-2
+- Rebuild to pick up new cairo soname.
+
+* Mon Jun 20 2005 Kristian Høgsberg <krh@redhat.com> - 0.3.3-1
+- Update to 0.3.3 and change to build cairo backend.
+
+* Sun May 22 2005 Marco Pesenti gritti <mpg@redhat.com> - 0.3.2-1
+- Update to 0.3.2
+
+* Sat May  7 2005 Marco Pesenti Gritti <mpg@redhat.com> - 0.3.1
+- Update to 0.3.1
+
+* Sat Apr 23 2005 Marco Pesenti Gritti <mpg@redhat.com> - 0.3.0
+- Update to 0.3.0
+
+* Wed Apr 13 2005 Florian La Roche <laroche@redhat.com>
+- remove empty post/postun scripts
+
+* Wed Apr  6 2005 Marco Pesenti Gritti <mpg@redhat.com> - 0.2.0-1
+- Update to 0.2.0
+
+* Sat Mar 12 2005 Marco Pesenti Gritti <mpg@redhat.com> - 0.1.2-1
+- Update to 0.1.2
+- Use tar.gz because there are not bz of poppler
+
+* Wed Mar  2 2005 Marco Pesenti Gritti <mpg@redhat.com> - 0.1.1-1
+- Initial build