From 3cba5a0c8a6bc536f71268c32d84b4a1b045a548 Mon Sep 17 00:00:00 2001
From: Brendan Dahl <brendan.dahl@gmail.com>
Date: Mon, 15 Apr 2013 16:14:07 -0700
Subject: [PATCH] Normalize CFF CID sub matrices to work on windows.

---
 src/fonts.js            |  29 ++++++++++++++++++++++++++++-
 src/util.js             |  12 ++++++++++++
 test/pdfs/issue3061.pdf | Bin 0 -> 17022 bytes
 test/test_manifest.json |   7 +++++++
 4 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 test/pdfs/issue3061.pdf

diff --git a/src/fonts.js b/src/fonts.js
index 3cfdba094..330210b28 100644
--- a/src/fonts.js
+++ b/src/fonts.js
@@ -17,7 +17,7 @@
 /* globals assert, bytesToString, CIDToUnicodeMaps, error, ExpertCharset,
            ExpertSubsetCharset, FileReaderSync, globalScope, GlyphsUnicode,
            info, isArray, isNum, ISOAdobeCharset, isWorker, PDFJS, Stream,
-           stringToBytes, TextDecoder, TODO, warn, Lexer */
+           stringToBytes, TextDecoder, TODO, warn, Lexer, Util */
 
 'use strict';
 
@@ -6696,6 +6696,33 @@ var CFFCompiler = (function CFFCompilerClosure() {
       var nameIndex = this.compileNameIndex(cff.names);
       output.add(nameIndex);
 
+      if (cff.isCIDFont) {
+        // The spec is unclear on how font matrices should relate to each other
+        // when there is one in the main top dict and the sub top dicts.
+        // Windows handles this differently than linux and osx so we have to
+        // normalize to work on all.
+        // Rules based off of some mailing list discussions:
+        // - If main font has a matrix and subfont doesn't, use the main matrix.
+        // - If no main font matrix and there is a subfont matrix, use the
+        //   subfont matrix.
+        // - If both have matrices, concat together.
+        // - If neither have matrices, use default.
+        // To make this work on all platforms we move the top matrix into each
+        // sub top dict and concat if necessary.
+        if (cff.topDict.hasName('FontMatrix')) {
+          var base = cff.topDict.getByName('FontMatrix');
+          cff.topDict.removeByName('FontMatrix');
+          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
+            var subDict = cff.fdArray[i];
+            var matrix = base.slice(0);
+            if (subDict.hasName('FontMatrix')) {
+              matrix = Util.transform(matrix, subDict.getByName('FontMatrix'));
+            }
+            subDict.setByName('FontMatrix', matrix);
+          }
+        }
+      }
+
       var compiled = this.compileTopDicts([cff.topDict],
                                           output.length,
                                           cff.isCIDFont);
diff --git a/src/util.js b/src/util.js
index c29699f7d..8706b27fb 100644
--- a/src/util.js
+++ b/src/util.js
@@ -223,6 +223,18 @@ var Util = PDFJS.Util = (function UtilClosure() {
     return Util.makeCssCmyk(cmyk);
   };
 
+  // Concatenates two transformation matrices together and returns the result.
+  Util.transform = function Util_transform(m1, m2) {
+    return [
+      m1[0] * m2[0] + m1[2] * m2[1],
+      m1[1] * m2[0] + m1[3] * m2[1],
+      m1[0] * m2[2] + m1[2] * m2[3],
+      m1[1] * m2[2] + m1[3] * m2[3],
+      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
+      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]
+    ];
+  };
+
   // For 2d affine transforms
   Util.applyTransform = function Util_applyTransform(p, m) {
     var xt = p[0] * m[0] + p[1] * m[2] + m[4];
diff --git a/test/pdfs/issue3061.pdf b/test/pdfs/issue3061.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4c16f7c58f7606f9d01fe43120668eff9f680d0a
GIT binary patch
literal 17022
zcmeHvby(Ej_O3_?2nZsf#7Or9Lx++wbV)Z14Ku*dDJd=8(jwg;T_OU~CEcB(ln7k>
z_BrQ!&%Nh)e)s-$=C93X@4fa~@4NP%=QHegF(^q$aez5_@EMj@21oI6c>y2*!q^I5
zNC+rrX$LoQuylu;0>D5y0GJm9fdCZ&{6I+nm<t5u2P)h=R|9}~c)56i(f}O*l$#3x
zhC=j2MDXEura!F!{_cYh=KgaL3AhQu6s~0CVC#6Zq&ULH$=1#h00k;Jz)dYpPzVPA
z7$PD9l(Muz!5x57HbyA;uTy|92^}F(Fc`$cCCUc|b8$f-Qj&a7us9S1;gRIx=I7_(
z;}#L(mXP8Di;0U$ar1+rT-;ou5Qu~rFRz58q$m$J4~SPp4+yg}g}dtT-URrwZH55w
z+_<L#l!M!uqbva2ygz+${v}L4pb7$k0`UFPuX=+F00IT7xgp^|O%=EqP(ud{fB?WZ
z@jId%;6}FixEAxq#-{fS4UG*Qu!!&SJoU3@dZ~kJyoXK12%tri{vmB-Xl$B<rPAH@
zGWBfm-38fGU$k3PMA+Lu0sPI#Z%{g-j2uv|4sbJk5IzHgq@vWH;NnBL{si>zkOJ^>
z{~itx6sQW|;{OL14Gj%VZhSPob=#jEOReqhd-l7O_;OUzel|*<+FrG_bth$$1H2b;
z(MLmZl<*}pUO+#-6TXFpb!(3L4%xqY`V*etQb-<-GBPzn83Dk*K&E754tE6nWMAc1
z*u-!8Y!K#uCJg_dbHx#MD7YQU5di*mvbX~RDTZ*>0o@GY=I7>w@Bwb<=H%no1Ipjz
ziqZe3?<Tcwto*j93fvLl<X{5-nQM}+sAsCEn|!*V_7{(&ZWg>rf?wK74hR!fI7$b2
zvps-na97j~sW;^RG92`)?>~e2({b=mw|<NIZzzzmbZ|rgpwQoG;O64K**?6#T2eH&
zQbpPRm6CAP8LOG6_b%hz<e1G48i_Idf%di|^dA&fu(Pnc<{NHnL1ONHSvcLDhRp<v
ziFWRPN}d^@#F0%4pfiHe=hBD7r9H;ULD6H%#T@c~oTJjgNyd1lP_zWvX2d@X7V$P!
zl=om}J!$f!Z`Y@Oi%@*soEG(ZuJzPl(rfr)^ZV?+r_RJhYS+M|*Hi{#s`sF;6fww~
zqxW?kG4&lKq<(cP$u*q9X(sc|07EMK8|$b>+^(ryz5%cLYd6gNt7U#<T9wxGUBSu^
zp9A_+8fc<YPi+8sAt0Picz7?J02^DG^kxzd`Rh=B^Rln~M@ut_!?~M<Z}e;X4Ts5|
z*TWM{)DGAb(@H#iT)UorTI+f&R6UZ=-C_y6&niIk>3V>i+Ijz#h4QsUhlm*6D1P!`
zTq|)9Hzv}{eMg*M0xMW4<=W2I780$s8e+`BzkytiM0QskNW^wf$Mcxl*Cojn5<5&w
z&E^V`!OT=6sBh`WE8yhD#_??ye9Y^s2ImrGf#mm|QsSGvi-St%alDIrYB(tq3r!@!
zqAD0e3!V$$WQWBmlebDSNnt%9`)Y~GPVb8t$X&{9??8$<SaanO<vG1Bl%uCCj)-A1
zsvHaA>X&2wC|{b}n?~ez<#R#qdFTjg9kJ5zWw^5i`9YK9GqAs7TZNuDMbknfTW^<h
zuAhiJIxAZq5SiqnydpNd_2|cm-M{X%Uv|d-KIwit!N8E46ZH2J$u*55tR1%lMDFi0
zpo-D7xpsQ3(O5hA!d3kO3mw~-u+zT`Q5ShHrY$j$RZ6dBLk;PzNyG1x)%1K&)9_J;
z@S6^BS&||&c2)Q*-X4N7`>m?UTL!*$Ka>2qrMQK6X0uE5l2;&!_#i!ZQr8+lX$j%$
z_zQHs8fvA#aUb$;_snnZL;iYNxu)qwi`t<-zAJf}=J)7sP!Dr7El&?)nELY>JdhzR
zsnNY;cJ~WoF3VinFAPswT1~mqI5%V!iYP_4ms^qX;5DT$EkcFQ_*b~$Xxc%mlO@K-
zyc+M3?v860`I$CY;mzJIyp$rMY+ZNV6Af<9hke!5Ysuy-blwHmnqaOU9#GVl^0(|7
zruxxRwG-d&w@_>trRrBpibid7a)FH#PpGJNWvOzatE4(hg>&@EQ>`$ABVQ?-j#V*6
zX3(0mh#9^$jHudv>96$&B6Q@)lkz&@d^Y`Cls34m$$p-B4-Eft5m!mF9kUl|;J52-
z_&1pS`=kDM%=rGwc+qvM&(-yHD<L@uRL*s6-iC?6bn6yH^d02i*oXe#Z~_ML@k4;B
zPR6L8Uw+~+iJxcZ&o4rd_+J;U@xVsuJg=<{r<3%xZzFq=hu**#K`afxh`D>0o?e_d
z=9PZ>`uk=wtx9$+^~vU#{pRgTj`~y1Zu@0au$l@|`ZkXEX7aO5xG&vc&!hQhDzo+e
zPu~}=CtAIMKn~fK)7h%itCPCc<|wMJM=sbvR#sNKE5F?A-KN?2KsQB>Xa>0XZm6dK
z)7=ijDdSutOSPmXy0m+?VeJbmxh`L%Q*C#-%{=+M#oir=xN?{+i*wP0B~#i(C3oCk
zlytkT&mOgU$t^>2JoIC=DV;?&M%4jM0a<GmvJ%yAsRYq+=p`I}nypuSLgALq|NZ-q
zSRAel@9$f~ljg)yWH8Mf_L#g?5(f63xp<AF42>juS=j5>peKTYMyQbNfR4EAII;81
z;2hp?VUEW+%#Rtw6JDz%y$S%r`r3*}-q16B#ErdKF$TAa_=vXkJh-mlIvAVLbd_<j
zhInGlOk%zydWkTMIL0B?eDV2_R7NFR8J~uFQnU*6vegz{Cmm#Vyd77)yqhaVeHFSq
z*B-VWvGS#2@Wa=DCP6osFZ=6Vhx_f+X>E;(WZiVGr(Y$Suw4m{mfd_$?;RMuCb{5w
zae4<qiy%fo5V#1|1Lb*>rfxUI!#7`EuL^gi4y3kwq@3PGFdk^lv(JBRnrh;2s&CS8
z#dFnhn{l0SD`<l13jqBSd-|5)UmaZQo0{H|W$Q<#kktSlBJTKbEOCSc*h`N2D;vxX
z6E{2S68lsD%$iI+Balbweftex?d;`HpC&xcPG`eylV3R=eDerCxQGV4Ot>(gMclvC
zA3JU9z}^r!^Y%3QVbCQW)7{Q~cq#5k{e7pid4w!aepPj~4yWPSguJK2a(C?Q*iwba
z6gh=?NWHntx46W7l!6y>`=sDddBKEG$jm3rb@uSg;Ppq3<s7C1cdOoS9_A!71f2+y
z@?&J&9@6z_$ztXmh`aKLl);x>fJF=_%1bj(l8FJO_lxGO(_KN})J9z0H4r;%26(EG
zoa0E&cZqR5@T(C%#FiXuicZ@^@(3|b2PAymV8IP%$&@gB!$Hbs$+DDM9NvX~n`(Ea
z^YSVwggVG+8djTfP^nssvx-NOclESw>OCgx%;JoBp-WQ}9Tb<$!cmZ8s+L^y-YTpA
zgHEFzRpdf+LR=O4TTIdv9xa$7c)`YLh+uKY2-s9N`G{+{tDHcvXZ&z3JP_;;6|MN7
z`dn*9cT%ha<K3%;SvtS^^5MOLHyrTgL?z@{<UsK~p&<et@%nW8rKU%fgD>S=uM@LL
z(q$5E$6zw1Ky+Z)eYD-R<<)q*PulirC@I5}?{qg$eWs#a;OlsO1QXHq+U;U22&^!=
z2$1N`e~z40CTHS*H5seVw5KiD_XcfCr+6ZszM{K<tJCbZdv9n&TTx0$aTiVsW|md+
z$Wv=}tICJTlJR~nkDo9Z?QfI4(oA1RS@jUNj_+)>TX*&>iA2xsRa~@d<WI8GMYnzb
z_68%fr=lv)l$}!PfTCVpdGgU|C*jgs|NBL0%31nKL7VUp7N_^A6h-6NWZB*N8F7M-
zirpP((!P1qHJ$3YVxPB%m|RYxQTkxuP$$N!(}@cf$D^9U%*a2m(3j%3>xIXf$vamB
z)qqF{{F2DylJ5pNC}kIavG`c}9*UrK-A~@bGoUjUYM>5@e(Lw;3W6R=NPz8itm5J{
zw1q~UC@MQ0UOi>?rvI*OM6!zQdU0{O{Y#V1*aD@qA|+>LyH!Hokb7}YTP#9YWn-}%
zFr-pCUO^<Y2b4G$?MxPIFQXEYLdXE+dVcn+$<(d~b;z96@b&jcRU?GvIRP>fx4P7)
zQzVGVwpQ7#`I+-e7zHYWLd-0H<Rssq*0E0XMBm+|-@DJ)qAAsP>pO?fmQX37;CIAX
zIQsNsGryGO*q0&VI8&b}N8fT@b=z*TVbF-s6P6ByG%Rf?kZ%s$>C%##xCe3F$dK65
z4)kP_evniG^?q0p+%c3zH?%bC?7<EDXf?fifkuMM*<vD$2?8kWRW-a=XjkL^NQcDT
z$+9PX>7>AA-p&(-Gli#mju}e({NYpY_Q^x&b@gJ@<u^(?OYW&+0&CyMjpFdReIcy-
zD|-Z?6`#j#nz|H5)x(f>`i#xEa`!!NqkEpEw5?^zQ=Vfs1ar;U5=iZ?q!rKEIlT<o
zWj_NwG0f7csU2##e-E-VFg}skt|Dq&JIBcsVpBh1cUy{e`Kg#0=h7pKAO}AM(NnwQ
zhYZd^m|Pu1a=4GnXgS#tkL@}<T1fWBNLVVL+R?kND_1{rxRY<gbuoOgmqe(WMwMS&
z^x~k+(-6bW4^?vAZ{<MFx_JN1O0{s+j|UawB%;QzB3*{qJNXnuIjL9f=@b~R^gCCj
z^CUFAk<~Mnj2ity(=Oo6p(`=WZHi}W#2T;P-#(Q#ZD(c~S>W)&(K)C_0F-2Dz|u4`
z&HinOJn|gNy(;cq{ak~u)ab;X={PtRU(K|W5p&^X^z!XFKT<`v7ig*H6%Ayh0UaIt
zZ)sWx%z2+h&EmO)YNtQnm%4Y4&;E^}dl5w*FC8;mHYo>8qgxId4k3LbPG_4x3!vY`
zC3oI}b=@b8(8}R`Io?ZkF54cyg=kL(5sKU~2$o&+dN%xSBNR6MUWLFKlj`6D*es1{
zabgC{X})3~DrKx|1KH~J)f#l=Hho(0=7QfBGK^JCvNbdcdN_wi)^ci@*c$PTUo*1k
z-iM(4C8fQ+K-(<lb)fw)otUe9HHPg*tF~_TY>0_rHiv6nbqb<wb?<h|+;036XCrT?
zs=EXUIiyvn_YF|dgnAPfOdRuourm)<)=Q2|`NcNMPp<~tMXdAr(1#e6ttSy<H=!v*
z2lT%(-(n{iVz#(z<?wCQQ|-gER$R_bT5q4gGUHoc0VhTn#K)f41GnjhY_rwb^~~GY
zhN5jc+B)k4G&Ubps})r`(Yt?FC-U*K3}MG3!I8_MFlXsnTs`D|O?|RlGuM(7qQI%*
z{7zdW*ad!j%dgtu;EUA}B<_nze3C;8z9dD*`S2my$NMF!k4V_sBR^_m2@qF-TfR`4
zm-)EgDqE{rh^!d3qtde$*V+@^4ZP@RJTv!uKF^gYwMbneLEwomZZDuz>z{HFe7pv}
ze{7=vO0t)B59<O`I6g0x+th}1dPKOAmn4|_9hl40|J|KdJQ^asV%xWy?+NT91TYZZ
zch$b9kFk~6aECXHp=R<Z_b~MQ{3mARc3(}^4IG9<ZII;28Q_J6Q_4m|KM3{V@H4GA
z%KB};ne~J#mo_=?jPpiSr+sGH6Qun9=ET;BT`0nScoG*|Ot~ex#o{v-Fw81FZbF=A
zwF7&Y$ECjfld86QxGbnNRO&9#gP=QM=_@||!cMjD>J~1$pjE$UPiJ!bWioT_36`F0
zo^Q;bK<esPnGe<vwn)@@p&B**1TXp`c_kgjqj&g)hc=Yi)ETxu*mMqPNTne@?BHqh
z#aD*Q&4&j>4R|VRCY5D5`?_Q$&>T%-G=S4)i|39Bm01R}^fl9h?1ORo<YGT4W7WPB
zjm;d)`K&LMy;X;MF326ofJuH31a?r7Dz|jLts!`^e<(s}N$8=YC_#z93iM-te%T`P
z3C)=`j)~^6xc$jthJAbkc8*!HSixK*kRle3oclAFk6FYOh}Z3Pdu7{%QC&?bE{gt$
zB?J3@e&^CR<G$2Jqq`d>lu*t=0ZwWrLEF3liI2vbT&h`6@?%B@hFqB;j2&yk#7xbN
zLYL^nt@3oAN`b|l&Ig~mAfNps8<erQ(e~80&!+^dlN`#I)JK>b@fTh#zS0T7kHXK$
z72DDjv+)w7Q>m8o!MS&m;X|^=I=Whl9y*-jq>}(5Vcd2;IZGxmpg*N+A&2v@VHq`K
zYAV}TCeWuWrj?H<Z&iR9mhaaoaMk127P{NJx}O#H=@?bLeJ|}G+rFU8IXHuXTb}<c
zIWG=TJ<URRxNlZwuzhr$psM@+4m;>+ZRS(GDzb}S0?8${tE}G8H&R2?uz-cqj*!fr
zY$YgQ!U}Xj0sHoqqe`lvPPu>ieYqb^u4O*%J!dGKsR;euck*YJXy&-;In92xSY9Eo
zM>MNH(|EGR;bce<_C8~jpgh_sdt&9*dNf_#lp)Z`_85jd<UA|4(2o{Ea7`4Me94RZ
z?Dx{<t8)cenM8GdH#JTt^A+>JOQ#hclgTYB;&~eH7e%O<w1;3Y`Zl8GJ6>T)3ny4N
zs%yX9Ft7+me55DbnAg{dZ4KlL!K^Vd;xWTpK@5h{Cu4uRBfv(&@-XJJFLe`Uud_0b
zxKem!2c%`trbGqZPu%6en7hr8szzN{#!q30iEnV-C_6l^bZ+T-mh8B5{P5&7dx@jw
zPH)y7vt_HQI}!e;nU)s(DPa@YxlAeEK316Z$TQVitdGuN>rZ@cEByF^k><UERqt{z
zU(0n%sue7Vw)d1UOALx#mi8jVe>*@!yx>wxQ!?W+oR6?e2{4_-A*+YIdYkUJ?p+o6
zMSSz_;f2SC&1GKByoyN`jK<B^B0#r0oNK8?Sm779W>0X!ue>$KD}*IZm`a_5S)P@t
z2t1t~8dkTVx9_4{GH;whBe;Xbv8Cl6!*@OUfM}(#>b&icP;zsBij66Y$$6dMleKBE
z?u*E&({cxI?cmarC9nA}(aeel+G#<Jq;!|OhcjPzE*qy*Y4E>$tFqX1+PdzO&|4NN
zsKq84QnwzwGm(F^1#Ec1^PChXjFk$D_i()Yf&lAk;?*o81D#ngRp{btF_oz+)-;O~
ztDP|_NxR2f)bm<6ZU;V0F9@@?N-<T&O|6#S21fTA;&s=qU^QYkr$J=HIDRYzeB3{s
zDntv%Z%+9ZT(YB18qHr;jI_b1c-1Bv6dF0V7Rq;KXgkQj+=47m-xMBZ$d1t59DcCw
z$`trOc%#rkgMUsTs(YX3j?3|ZydbtnqZ`(T>+0RJiObaq^qHB3cuKtHFY6g>_bU46
zYf_NW73$h6RA>5vFwZeOjTwG9op)5_kM^p^WkS|SWs}j8n1i@uCCU_Q@;o@6{uqxX
z6>_pzNe%nx6%rgnCQFL={0?>g$>_|rEY5yOBx1PY3!@-Br~lpU;}zo{Ugi<B`y0_y
z@9thfAgU4pucXy;FwKfE6EUW%DTQ@8b2xbLo@pd4r$fz6Dl!|%E#`eHTXi-q1=lYg
zlF37NNc(;2rITB4GwqSLt1{$N`>$}l*S{)kB_16>;OC%wFve6{haYcP!T5M}yUOmP
zyh=xFW8&+_eUPRQ?VzL2Y`b3+1WjCIUfvr&2#igZ$(o6*A<v93lV#b5eCpNxYDO7g
zFy_BRBd+}FjIa12eq-V&`&rUqem1GWb9tt>jU0q_u?5tdrelSeEJSXgUez(?T>Fkw
z9D!|Uh}Dr+H50m|dC6RZYFcWILJL)H4$gCsUHKA~x$rq!@fsoK!+I(9u5=%uCe$v+
ziDK-4G<U_RJJa+^-s==sz$<TNZ1wBgR76ZsA`@(=d7<=u{{$DWA&IWH*h9R&y`$)!
z&%Ql$E|Q%t9lR3hk(sSzPdfU4psVgY<tL@XbGA5~u#GM;X{OxjnR{1x>JeJmzdEa9
ze%=))u8Q_UBx(j0WPqQsc(Av>zt`m%S(Cj}tC>k9kjav%-ugO=;yElD%D%R<b?3n8
zj`kk^);Ya^lXZ%WzTHX+GRLB!xxM>}_GQpy$E1YETuZ2(67X#19$*<=m{~C^0r5HS
z(ed5_UezPEAkJXOoWwwrQ(A_t8MnUD+Lv=L)3-F#I8W9}kZ!tAy#!Zl+ol-jxRt#N
zbbZ45Q;_E!JL|cH>PI42wpW?uBAP3O*rI6Nkqv9S-!;gTc4|p1X^-f#V?V3|K7U0M
zWmA2XPv>-Amh;vYnE2o^nl^(fxx86W0XZ%(?7-3Whf|JvxcYI*@Qas3ab!x?JP*RP
z!4F{+3lLVIpPzO{L-E)v)g-Cy-h2Kn8U@wb_xoJ!IhzA}_RDZJi9&lHo&y9t5oZl=
zVF<+5`|o4$Yi#2YbX}Q5CcDn3!`gH+d9*@QMEL!FB0fe|m~K=Bc(|bPeAd4Afm)c!
zA(@(nltmDtVh5s9N<+eQ{D=ex0uR3sjPZ4lkxG9~sx|s*%L<aybHZRvr75D;9^OHm
zFZmih&NcaC=F8CcDOsMGtnXh7&g?%b$+r`<Bs|j7w3CMWr8Rwb<~S#}u|~X@St4zH
zraL;TKKfF4@!{x-$;&ZxTh1D9@j|n)=Rq^DK~23(nW1e~6{{WyMM~%!vo&0kg;D%=
zpg>MTnMCkLfO!Zz2|Vj#jHmZg4V82ZCH55m%Hc6vDhB+-mg}|ITU(juEK!@4<HQl&
z%TK;+b=Qcn*fH9(<(_^p$s8eJ7<<HP$BfO$we#g}n@76n2oc}yJZ_HwN)so|TkabZ
z>DemjtxJ6dhSM955$fKhrRD62a?fdR3%BCD*B^80EF)-N-hcbLuYBDBIu`j-LNo)0
z$i-iGaA0xYeh#%3NnwIAM@X{5tQ_}W0|)V`sbajp%1`n#(O;0HKbmZ*_B=N$2zfEs
zZg5T=d9sN{i(%3q3v<%Jdg8tl^S0#De-0rHq;lJ^p?OOXXP$#SME`9Bugjq}BRoA{
z5M$v9WzFfHg=?Y$YQN*WK_<r0n2n-@_qB0(1*uUo4_pJHMCwt7!Vt0KhY?Kh^76d!
zH7J3@xHrJ+zS}|DAFT8iNa-bpEx6n*?0t*~DJ}x{KYoZklw#uH;zVIy?GxKGH(||8
zEi1*5_arJ&x7JqY($cW&*RTkNrCl^~Z|;*Z2u{Q2It@Ip<{uZNu9KB<>gT><_F8Wn
zVmk29RY|C_C&}p)TtVu!9ckG@nCv((;U|RzgcL&fWC5c^?g4g@Ckbd!QQs^g3WlEZ
zxbetlQA)ABx)##-0xzeG>$_iDHjCM&V$vGefq}Y>J9+gm0FR=}tpN-F(G$tNM?q`@
zlAXa$+1B~MZ_sE;Ym@%siTj8p=9D)96i0gnsiH8m<3%)=#7@Pa&n7J<933mRSvkS<
z5xupm@13@^v_>>Yi_`gZDs#Dann*<MMcyCxhz~vAY|lj{>^imLbZ4MfMCEi|E@g<9
zXY=CjJ?x1L8f?puP#u;R(QdJu+m$c`H8epfa>q*QGc(m5_icYVxLzX;4^qr{OxSsG
z+IikT8E9bKQoFK?RQoC{C($7E*mtGDeaVDZw6RXYoGDBzs`CEWgt`;d?6}z7)>d1c
zy51Z9AuVkqpo$jmD97_?OB#6Z0!v_)D6+sGhG3#r<L$D2ceWlFzp-f2$u>arN$8A3
zfSp#8W0pL?@2T{7O<|O$EyCENz`z2v=_vv$FUtDB0jD5T?Z?GA5aMg8eGn<gTu_P9
zY*Ha3L%R8n%BND%4+{-$q8?d2jV+qkn5;8>^M=%-V!s|#CSx#EkCVB{AkBwpkFF-A
zgOz_J&1aUCrDvdqr|LFnMH=%ACN5sGpLwrk<eepWExBc<jRdv3M70Sj)~WT?aY~Dy
zHi>0-S(I(IwX_g6<YMHMjAbYuB?ZXmp`Xt%SgVt9gwEExnk`5|P87A!MfiU>G5bxF
zqmr22Hqa6~BYWHygQxwEy(0FO_Y(%MgfO&|cRM83`nrl>#z+&`x^>r6>l3$PQ-%^8
zW?x-B09$Ed9n}-(<vH)l4bM}iNrnr!m(B)fax*e^>{GjW$I96N>qIw9h;#xV`P3IK
zw6EL$&N7QC$xsl3J3h$4|GCa<abgB(w;jriS}8_k#o*cMQX&cRJFoIVi{rQa%|WMZ
z!i8(xN$m+EI6Hwq+x%|%XXNo{nGQ$Y9sD!usP|pt8bP^COR+z;{a>_O!OCa#IQ4oJ
zM8Tx@;YJpb4m&GaxEl|c?qU#7;@z$r%?9!^qs~qD56)p0x?AeW5^E6G5|uOEvjB^z
z*8D=zskql1iEGw#1s5MbKU1=F;R`=K_M%Lod2`>p-JO$WTQc5j&Y)Ua*R0j5CtOP=
zKJHC<Kz8%A>s=+bKHSSIbo4X(Vy*oAUO83=u=e1yY}?e~S<Fn`je@*#*}haqQKJGm
z#xljmJ2dqKbJPh<ST2Vlsff0(+3N`nkyi50tO{v)4b%;0VIN)(?G5)V%}SkF1?a9A
zcIA(6grFZ1z9Qzoe1KN>jQlO7_r)E?GRU|Cz2`D))+0eASUp5YmwpV<kz8UEKOUI+
z4jm!4im<(FMc^;&g|2`dQV^U+kxr;_D-1t2TV1D+6RmgTX>5w;9+L>KH|Wm&`Rklj
z!&=1_*Y;(-DHX0xCMXi}Bl5u1Muh6=^01Ps$*xT|l};F7m7{+$M%rUXyoG2-meLd|
z>cRsP5p(W7_PmqlLo356E~fTc^_?6?w42<64Lk2$XKDU{&<FLe$j833kOJXE*1dI%
zMZQg6BCrT?Vmtdi3HMu(lJCeg0)~~}#UMVAH9Sqt?AK4q{vbR8Y^dYy6I?~Ejy0G(
zihAG9owziHhn&D%R^B@$bk$6arSm|j9Z%G%kB5X<PM<1zo{RGyHb$g0r3Jc`#e@wV
zoH2%W5*HaPe(<_4?(CyJtU9@R6cQpi{m8uK#qeBahb{Xc2dr05df#0LVV@<jH{mgO
zjS<MH-phv!`}lD7OMs;H(kJI$c4*QB=kwd>YpCawccE!*$r@Zk90fqz0q-jc`q$0s
zR<&RKFE0%O>BpzveA-~jc}8j%;kj<xz9*MMpZPVB<KlAHGdZq9sWViCMp39}jr~kC
zZRmjCv5@$kW^80`JbxJ}y9WhF2=C&hNsIq|C#DhF(z8L{<;6-i<OIXAB>AN;8Sm4(
zQ{U9T&b(OP=J}H6wcy?INUiZ3yvx$DHwI=bd*WybOpqQEaqQBW1Y-VB;f#5iHcZ8$
zcp~kFn_yX+U-+VZ*#YZeRGluMv6Po`j>%G8ZS9kUvUFM!T@A?7rE?xANdMq_rcL_~
zewmuM%0<R0KbJu*<hW5Fce_8fwQm&Hw#-*j5)P&iGP3NooUc|iFH6R$0%#7R1O#rS
zUk)RK6fp8Vaqlltbv6=kNG&rB_c8CU`R^<M#<3+OySUS_9}c2u=*noQw;$co8xNdP
zcjz&V6M#LuAbPkRba`|*=TRK`?(h<EpLePBkbYRUUZ?gAQ^fgberG|Sk@*BSjiBdS
zV%w(iN3AlYF%0O*Z9=RENFBrW?~^#59J^hPL~g-?fP}|-HPPUT&bvn#u%KR(=t%dk
z*slp2PMt!ZG!EIH+xDDObt<Od^Ast|=yE+QQNLe*J?M$0Gbl~o1dyL9u12|m)u%|{
z_wMsPQVRdLe*}4MxNsGhID~;(sA7H-5Z+8$(J^}Wdb*o+IWp~q-N(+Lrcj8apiKOC
z=xlQ8Rx2ST-RQjC$!dkdwI<%+tAXvA5}(&kON%y(=tFjtC|bJ8keXCjhLLwa!IpO-
zl1Y0_tIC&I;YM>j<y-~qmXAVQRjZ|oUjgRJD=t6p2c0OeFg<nISjiq6bFsWLFDxWi
zTg&sj+BY&NJA4nAjZ05!vgYJ)Ht*BqZol`)9((ByB!gkv+pVpC8reE_>@}X*+HOGC
zGUW3kmQ-n}oP3tv{==g4D7BKR&Ws$fEl2ORF3WKBIwsUeUc}POY5|wJZsKJTzGzqW
zgRsiAB$O@D2vr!R|4s#yCO@Aho{(K^3%f_Q1AaZ0a8$vI&ar!f&n8J*a_IIG??2Cf
z8TMpHf^3l56~Vmosz;G{A(hn;ODtx-Hep)3v2gY=htqS4%S=`!t!9t>C+17jc}3DY
z6G12q7Q11#%4wJVSGgNxtE4GjqOnkm5w!>C^>1?7t2CTr!u8$=5-0{{V=Xogi<?U@
z*3_$UusCj|l+OJCDLsbsJ(`%-_7Mt7qv9$V{x-d>n_0)_C1McU8vo-V=~th7NXpJ>
zm?G6e|41=~9FeXsv3FjWbBb@5oHFBxA<K{@3%ca6*&G&qxB&pPL}NJua%SGdK;Rks
z3^$`K2xO^Nvn?yMR$W7e17{|fB%~Yzz@zz=j%w!&Zp*o|&xZVWUJPu08|Tfi=9eUH
z7v_Da$PK&wUAt?9zv`P*!ObfvDH~E3_KYim@8Fc0x)_T(QL8M@mPJ#6QE^b;uAi86
z3O%o8aVBF)+#E}qscX{IM&dMHwwG$UH;lJ+`SZ(;t`AWxx@;54Ye6-sV{IR`ZK*@5
zjD2Q2RI+y-%6(v97(wsqcxI1qJXtNQvVZ1mKpr$kv3ze9!-sVIu3O=bG+CEHjRipp
zNUw5H>12tp)W98~)No*R>4MD=F<slF``psIUUo-aMvt{oj3HS7@5RQ*Xi8A)#Y4Xa
zGs{4YjWLV9e$`v{UZVD*6@Kih4;UF_ovY)<p%;E=EcVQqClC1x=9TxW)$wNbj*rt_
zW$RFgj!veuP$|jTiuNi*`vdfH(<k7&TuX%6K_VHWiVfk7#Q8bFyN>U}2+Vey1%zfb
z>G~JlHPX>EPN@%U8BQ}wuD2@#-d<J%l+<#S9z5V-6>=}oIgkOy0}gwCbcHm2KjFTZ
z{?R;=P$X~eN8CDG#;*Jj4_`(6VY-DJ4}F0~!a82v+CK9v76dni@Rh^?Sw?%vo}NnU
z!sf7M;QPb7_pcv_Iwy#gJceT)H9=?H-um@l6>e+S^aVsXSf!s>eQJ*9R+;TddvO5-
z3R<hauQ>@m_$-TIgfmO4U9lFQ49Vm;PA_2COCslR<|ac_L@As&1+EpD#u#V3aXUC9
zqe+h^0JIGrWAtvf_2d|gUBIvsk$9^6;k;Z)v&>l&F%1oOHc|7LA+vs2awt7=0k=E?
zHLk#&_}mAw+)R6Q;ZzY09fj1_!vruToq|ssF$HQP9Ub4~XC_VCzI?gptET4v+(aVJ
zT(>v_;;g9HV2hyapQ2D`$}eqcB()Y&<$w0UIlD7o!;@6R8*K)YEG^(Pjj2JQ{UMQc
z7xQYs@&177c-!7kA~F{tj&Egb>ReOvSt(maR=>tMU#Wzdd&^gJ17+;iBDpi%C|e?y
zSEH%N9E};~oY8=+t&#k`)%~Ph@}h;fHhu46vndxg8kdo$@fKPNQ2@g6!&TU(vif)v
zW%`IUG8@0vY88L^=0?|~ijCPZcz61Z&Ea=<o6wNl3Ngdtj?V`q>5S*+bme8j`@P(o
zf}$9miXBfvZqHxp2@{tUsKjcd<U?Vyat$i{%mamoy*)wwfe!@R{QM&LlOqbJr$Y^$
z+E#f4q?<c;k+QmW23{T-4LksRE1flecJq*DEX>J@Z^NM0D$X)c>gLw0!ph#qwhoP+
z@|pE@Z2>zSStIk8M_!Aaa~mf$@#E`7GTacloYS|`=JoQ3IEyh>w-%w#DfD}vV+^9v
znX#Xco?c<BW?!K=r-Sb(<2Tij&5x@du1^R(w^vs7?=@mX&$H8uHr<*2B$hMwRL7!G
z;Vqo<ZUVE1;XuXPszbAHTFm#8!Q{Dzg>CI%{YsCf(T=3N&FxJss*sHA3w|rY@X#wU
zrfn+=+mpmogsdu@rE&*OWzrg${G_|4gBeSTh{oWWm(1vr8o%sEYAV<8K<lUQi`BT=
zSn}_y*%l6LDN2pvGGi5t38lz0{)DVKG2@S)m7OsZV%u<CX{y^2jr_(oDjcQChRu!c
zGCr1(Qlta3KGW~ndtl_2e?p>+9o$(Y@npRnC$w3`_@#qN_y=9PEQ=2S`fc5*_(#J~
zoYIuj$9U@8I4ULcR`y%E+U%m~Vo7&1f{Zl@zGPdBe)N<i(RGGAJnEd05S_)jo@Ehy
zt@c)(q;F@808gvHVQVcWSDydoKic4B^Jb;s8tRj;+rv6c89#0<%nCsa)IvYNMPkOw
z%`yuLYg-ib;p-nOeTP+<DEMae58@gQ_0*$=!X`oJNr!FM>qj$#+C1NjulJ<BR9$H}
z7hH5|oJ!#91!d@k2eDWYc@l}>2)|QYv3>U)L;K~MEY@nGE^418!I2T5jLg(m3Qyd5
z9Kz1CoVfzLVVh$0!OQ|v_6N8=IWMOld9%9%nL4zimVF=1cdMT-(({rkpL{&W(Qvsy
zI;R7M7Y|ARRPAj_i$jl)qMjS47mFAZ94K`NwSuu@3SU*bM1e75jxj2+-8hfD>T`*4
zKS5FK0~+f^4b+6IXWJk}wScW%53U2ZHm8SVMXxUByo#<340{JtN_KUy$k>)Fq1UCa
zlje0Kp5n!;x4u8{Xw8I3yzj6r;UTkDKcw)QXKg0ZXt5=#e3vdEAYZn}?h<J3IN5$d
zSn5CM={PEFOc3!V=V3KQmm-PPaojL1c$ss0t9GVYCA(vz>f)B#9lr>koLG9E?R3gD
zG=(60M|$P<ci1g9+iPjg#noe_u5zENyO`yA2IaLP=N5=sJlP4nuU{NdEt{NCo?Htb
zR?s|lD?R+U&Xb1RxEQ3l)T|UdUOgbz&q&p!uOVmIec1YVUX-7FfT8#+O*4`}_e&YO
z+f~T1;9dGJ6)D-pJpS^7D(gus{)LhF)(p(<168V%<^d^MmiX5DvgloFf!p}vY^`)A
z6}_Hb%s&EX3u$#9;LlLMUHzOHD}?RSeXYNUa`^09c=8c2X?ZIa<1qTr)jOwqd34#`
z6!P$+j*gxDT2XH}R?hoHh<k3ib~#CrRD6#e@-_+^`m$QRY(}=Dd1&L5UtTKDl@|99
zyt#O>v6w6C0seID$^B40Fe+@31_P~ZZVjO5Nu12Joo?(OTdDI&Osk+4`XF->L(`jr
z`H01|W|N%jSqMk*j5dDC=}tBGYL;K*ULQShzylWtZ%rXlUt78Gi1~$#!J7f0vME9h
zZ@hdjN4cwYw#Sv;7seX=ndD6ocCKE$-`KL}>+kd*JnJ;xy}DR*CC8>|Y1r!LPpzuP
zY?Myn$L==xfgv+b>=+*F2%9wv9uC;*21t&oXVJ#Jl%eM$X!(&dHq4QdUoT|Al#Kq`
z(d${j-myQo@FJ>v9Uq8zI?5PZq2P8lSC?&Qb5?Jm`NScSS+x&~d}P120!zJH%QE%^
z^P7zjyi%33YG$?CUSY}5<@qM7?+!-qk7vV0=Q=#Xf|$Z~BX|+hkb0RI1CvsVg8iN1
znA)_q5W(G&FB6`3V4gHVsr@YNa+Wb43UxXRTqM(}_nVJK$LBV3jNCEcG}qmAOtB~C
z$Fbu5hb?R%83*^v9`k#yMn_?6ktLP`uQ>ajp4y1HNUJ=|Z@<X131fCr-4vocwH%D*
zsbu&%G=UkjSK#<M`ijDvei|C*WGL-$+<!Hyk&<90a{7HD(HT}z@(RCwurVj|@FCRL
z?%Yy>T`cxZ4s5ej51$$LD2m4|RZu!e|MDzG%VM2v`C~={1p{OL@E)=vTo#v%>cte2
zi9Py9(%A$_0l)aSNFUh9hf0l@$=Kw;nYAs$`XBGFtS^?TUOoE|v@rN^C;*z{-_Y^#
zeCg#<YKxJv-P!ClU&+_&Cki`$Sm}Y;y}1(EA`CMzctbA@Ekiq%C5U(UlG}~G(-3gp
zzkWigD^`$I9fH!LTx$?}3_hg^3iQCNKne)VQd|w*t7g`A$8%p9Ds9cZuW?0A8fG`>
zLFa?*-{^o8Kiu4W=eE}{rQ>^L(B0ptNWFdP_HntPc6R3$Ztyja2Q_87un!SG8|p{r
z?l}vZy|>NxALp&<A{%5W$6fUHIhy%HafJcz<9&G=*SJ9lM^P)*dNcW@k?<Zd>AX;f
ze3BL=kjbNzcmbz9cOw`qniHMm?PZOC%4jYs5e&V*Fl|pPgOzD<i@4;Fz+7n)Kg2KJ
zeNouM1us=+n<_nXG@qk{{?aO=Hen)e)tn(4)}iV8L|_&>xeDfRHhHhuGRnW1CO{;w
z^!~F&$3rINFNM2WGeiDj-_AblZ5}V6Czn?C%8Z~n*;eRj%CW^ez!a?4AD=aHX(ELj
zRi+8uN_?yY7y_OSslW#&qk-8}KPpjERuQ?gMP-7g_nWvD;~~*7EIN9Tu`^JKQ9n@K
zk_@PX9x+8#NNYr5vp!jGYnM|ik%~D)D>`F-;WM=Wq$il<<#taI4eK*SMcbj5jKXAu
z1BGkaw-Z>WhGrRH3=}LQ3`H>+GH%*@I)-mbzRzq_Mf-pJe5gl`sdYKzJo9<R@J?Mz
z>xD_S!)C@}n=zj!>&rBed#OQJ{b(31D;ZCf^<pp3eC>&P&c1E6(nz-jW7=MCho<;A
zNL~zG#{)_67T=vT6Y(8iv!x~EMYb2Xztz-ut866n93K<a!;#t+c8#x;pr$+!=SPNX
zZWDFOs>?k~H^G|ucA=P0$?LJn!ppo}gzt9n>A{Qa$c!|n>+pQ{dxgBrLb;9a4XAUE
z;dNg~&JnN9Dz2}}XKYSBUVEjvS*&-wJM09jKB!s3Zqk1uS5{C&l=+xPX!BvzlhlEV
z@#o&}=sv44NX)$!6nD{U5tN&wX?aH9Y@Oz?(g$|YFO8_*XuY*nOVsf<7hV6n=la{F
zSuO}4&mVVMHRa`gy`2BMgyGM7twK*+kwzxga1_88Zf<EOOncDSN(-<w6{gkTmIuir
z#o-o~((Vp$Rd)q76L)J9epA{fBDg}X0<N}5+Z#ayz}42q&QZWsnAYe<Bm)<?Y5#l-
zqy_vk1Z6EuEBdnopee5e5Jxz`0XJd?4igXv47mBh9n8fK<>F@tKtNy+5X29J@N$5;
z1h{wwAUwZ|ZD>VsZ<<05re*>v5>me{ck`Dptpy5&6aWHUTwFL^xHu6G=0Gq%KR*xz
z0YV@gHzPP4-Rw|Ct{irbbiW$;-Hrs@(Zs<LiLyl40e;#wGDbL|glTDiF7(Iex43MP
ze=KC@$oWf*oF)icpsNuQ2<8L<|FC>BQRoH}0eOU}rJ0+=jTA%VCMqrt5R?PVtp?^1
z0PzcO@pFK91wbGn;6IK0bLC%bh~EfqZlpnfV}nnC>&E1tHvTg5pKSb2_1{_f7f*gu
zw)`^oH#<VWpV0gTs$Y2c8Rb7c|35)!YVrqyNGAuIUx+d_0m5zIwm%gyHz<Pt5k*rI
z0W*Yytr1GZ2#K_@G%@-~6cA}@CItMm>wntI8$#se|8VqgskXKKM?Zg=A|Qb<arzku
zOhUxT$<kB+0s`?E-zZ{ka@>T6!-NZJ#9<6K0da7daq)8-8^O7tW+uPzFE9Vsx&O%C
zO&`qeMkHlt0{`8vnW+i436~KU2QQQl#9;)7ns69_jZ8Vr%%EIGe0(4<uPOiUcK<T>
ze;TJ78vY)on~obQx&9HNn}-57>LXJp6S#xOGbK5|GYf<x>et-|;O7KEg?{q-=a7Hv
z?XMYma|qm=Kfpf@px@K-kB$5Pr12*`|4+>SYV^O0{72ya7q0)p^&cVd9}WI*cKsKw
z{|JHqXz+it>wgR`+&^DoZq((%v@SO<DF6C~^zYS~zbTr37c@ipek}*^QxEvBdS=LT
zkWzWYu*(3jpG_Gwb~+%(5?PB8irKXttVWu<jZOb1pLAvl4TJpFgbSYUzq<18MUVgF
z3P10^bw%}8S2$(l*?T?>I>Ojt<H!mK1O(*)fuY<`u5u911UE>77o;>fcG|Dlu4ZUy
zgQIazDK0}LB~3ebiFz?-@pZI;u1cD2oR(6yVS%|}wxv1tJ;Pf}?NqRT_5Ck`%D*pm
z!1e#P*ug&+IJha^@Xu8Ze$%D@rKkbupNbmXlngM2e(!nTmjC{J+fe`ews*lH_Sd%o
csYHObTM#1*l7GeF&jJQu@J+diUrHGKFMp#O#sB~S

literal 0
HcmV?d00001

diff --git a/test/test_manifest.json b/test/test_manifest.json
index 68fbc7009..a1ce04f51 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -883,6 +883,13 @@
       "lastPage": 4,
       "type": "load"
     },
+    {  "id": "issue3061",
+      "file": "pdfs/issue3061.pdf",
+      "md5": "696a7cb1b194d095ca3f7861779a606b",
+      "rounds": 1,
+      "type": "eq",
+      "about": "CFF CID font with font matrices in main top dict and sub top dict."
+    },
     {  "id": "issue1878",
       "file": "pdfs/issue1878.pdf",
       "md5": "b4fb0ce7c19368e7104dce3d0d34bcb3",