From fb70f26ed91dbd191351026d917afcef9d8d2eb1 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 3 Sep 2012 18:33:46 +0400 Subject: [PATCH] implement one time passwords using TOTP --- classes/auth/internal.php | 44 +- classes/pref/prefs.php | 85 +- include/functions.php | 2 +- lib/otphp/LICENCE | 20 + lib/otphp/lib/hotp.php | 74 + lib/otphp/lib/otp.php | 120 + lib/otphp/lib/otphp.php | 27 + lib/otphp/lib/totp.php | 106 + lib/otphp/vendor/base32.php | 83 + lib/otphp/vendor/libs.php | 26 + lib/phpqrcode/CHANGELOG | 38 + lib/phpqrcode/INSTALL | 67 + lib/phpqrcode/LICENSE | 165 + lib/phpqrcode/README | 45 + lib/phpqrcode/VERSION | 2 + lib/phpqrcode/bindings/tcpdf/qrcode.php | 2875 ++++++++++++++++++ lib/phpqrcode/cache/frame_1.dat | 2 + lib/phpqrcode/cache/frame_1.png | Bin 0 -> 126 bytes lib/phpqrcode/cache/frame_10.dat | Bin 0 -> 204 bytes lib/phpqrcode/cache/frame_10.png | Bin 0 -> 202 bytes lib/phpqrcode/cache/frame_11.dat | Bin 0 -> 210 bytes lib/phpqrcode/cache/frame_11.png | Bin 0 -> 205 bytes lib/phpqrcode/cache/frame_12.dat | Bin 0 -> 222 bytes lib/phpqrcode/cache/frame_12.png | Bin 0 -> 216 bytes lib/phpqrcode/cache/frame_13.dat | Bin 0 -> 223 bytes lib/phpqrcode/cache/frame_13.png | Bin 0 -> 210 bytes lib/phpqrcode/cache/frame_14.dat | Bin 0 -> 227 bytes lib/phpqrcode/cache/frame_14.png | Bin 0 -> 213 bytes lib/phpqrcode/cache/frame_15.dat | Bin 0 -> 242 bytes lib/phpqrcode/cache/frame_15.png | Bin 0 -> 219 bytes lib/phpqrcode/cache/frame_16.dat | 1 + lib/phpqrcode/cache/frame_16.png | Bin 0 -> 211 bytes lib/phpqrcode/cache/frame_17.dat | Bin 0 -> 237 bytes lib/phpqrcode/cache/frame_17.png | Bin 0 -> 211 bytes lib/phpqrcode/cache/frame_18.dat | 2 + lib/phpqrcode/cache/frame_18.png | Bin 0 -> 228 bytes lib/phpqrcode/cache/frame_19.dat | 3 + lib/phpqrcode/cache/frame_19.png | Bin 0 -> 225 bytes lib/phpqrcode/cache/frame_2.dat | 1 + lib/phpqrcode/cache/frame_2.png | Bin 0 -> 144 bytes lib/phpqrcode/cache/frame_20.dat | Bin 0 -> 250 bytes lib/phpqrcode/cache/frame_20.png | Bin 0 -> 225 bytes lib/phpqrcode/cache/frame_21.dat | 1 + lib/phpqrcode/cache/frame_21.png | Bin 0 -> 235 bytes lib/phpqrcode/cache/frame_22.dat | 3 + lib/phpqrcode/cache/frame_22.png | Bin 0 -> 226 bytes lib/phpqrcode/cache/frame_23.dat | 3 + lib/phpqrcode/cache/frame_23.png | Bin 0 -> 220 bytes lib/phpqrcode/cache/frame_24.dat | 1 + lib/phpqrcode/cache/frame_24.png | Bin 0 -> 242 bytes lib/phpqrcode/cache/frame_25.dat | 3 + lib/phpqrcode/cache/frame_25.png | Bin 0 -> 242 bytes lib/phpqrcode/cache/frame_26.dat | 2 + lib/phpqrcode/cache/frame_26.png | Bin 0 -> 244 bytes lib/phpqrcode/cache/frame_27.dat | Bin 0 -> 284 bytes lib/phpqrcode/cache/frame_27.png | Bin 0 -> 237 bytes lib/phpqrcode/cache/frame_28.dat | Bin 0 -> 318 bytes lib/phpqrcode/cache/frame_28.png | Bin 0 -> 234 bytes lib/phpqrcode/cache/frame_29.dat | 2 + lib/phpqrcode/cache/frame_29.png | Bin 0 -> 232 bytes lib/phpqrcode/cache/frame_3.dat | 1 + lib/phpqrcode/cache/frame_3.png | Bin 0 -> 147 bytes lib/phpqrcode/cache/frame_30.dat | Bin 0 -> 324 bytes lib/phpqrcode/cache/frame_30.png | Bin 0 -> 255 bytes lib/phpqrcode/cache/frame_31.dat | 1 + lib/phpqrcode/cache/frame_31.png | Bin 0 -> 260 bytes lib/phpqrcode/cache/frame_32.dat | 2 + lib/phpqrcode/cache/frame_32.png | Bin 0 -> 262 bytes lib/phpqrcode/cache/frame_33.dat | 14 + lib/phpqrcode/cache/frame_33.png | Bin 0 -> 253 bytes lib/phpqrcode/cache/frame_34.dat | Bin 0 -> 331 bytes lib/phpqrcode/cache/frame_34.png | Bin 0 -> 256 bytes lib/phpqrcode/cache/frame_35.dat | Bin 0 -> 342 bytes lib/phpqrcode/cache/frame_35.png | Bin 0 -> 243 bytes lib/phpqrcode/cache/frame_36.dat | Bin 0 -> 370 bytes lib/phpqrcode/cache/frame_36.png | Bin 0 -> 272 bytes lib/phpqrcode/cache/frame_37.dat | Bin 0 -> 376 bytes lib/phpqrcode/cache/frame_37.png | Bin 0 -> 279 bytes lib/phpqrcode/cache/frame_38.dat | 1 + lib/phpqrcode/cache/frame_38.png | Bin 0 -> 279 bytes lib/phpqrcode/cache/frame_39.dat | Bin 0 -> 404 bytes lib/phpqrcode/cache/frame_39.png | Bin 0 -> 264 bytes lib/phpqrcode/cache/frame_4.dat | 1 + lib/phpqrcode/cache/frame_4.png | Bin 0 -> 149 bytes lib/phpqrcode/cache/frame_40.dat | 2 + lib/phpqrcode/cache/frame_40.png | Bin 0 -> 267 bytes lib/phpqrcode/cache/frame_5.dat | 1 + lib/phpqrcode/cache/frame_5.png | Bin 0 -> 150 bytes lib/phpqrcode/cache/frame_6.dat | Bin 0 -> 132 bytes lib/phpqrcode/cache/frame_6.png | Bin 0 -> 151 bytes lib/phpqrcode/cache/frame_7.dat | Bin 0 -> 196 bytes lib/phpqrcode/cache/frame_7.png | Bin 0 -> 189 bytes lib/phpqrcode/cache/frame_8.dat | Bin 0 -> 201 bytes lib/phpqrcode/cache/frame_8.png | Bin 0 -> 204 bytes lib/phpqrcode/cache/frame_9.dat | Bin 0 -> 206 bytes lib/phpqrcode/cache/frame_9.png | Bin 0 -> 199 bytes lib/phpqrcode/cache/mask_0/mask_101_0.dat | Bin 0 -> 157 bytes lib/phpqrcode/cache/mask_0/mask_105_0.dat | Bin 0 -> 162 bytes lib/phpqrcode/cache/mask_0/mask_109_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_113_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_117_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_121_0.dat | 1 + lib/phpqrcode/cache/mask_0/mask_125_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_129_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_133_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_137_0.dat | 1 + lib/phpqrcode/cache/mask_0/mask_141_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_145_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_149_0.dat | 3 + lib/phpqrcode/cache/mask_0/mask_153_0.dat | 1 + lib/phpqrcode/cache/mask_0/mask_157_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_161_0.dat | Bin 0 -> 241 bytes lib/phpqrcode/cache/mask_0/mask_165_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_169_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_173_0.dat | 1 + lib/phpqrcode/cache/mask_0/mask_177_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_21_0.dat | Bin 0 -> 48 bytes lib/phpqrcode/cache/mask_0/mask_25_0.dat | Bin 0 -> 57 bytes lib/phpqrcode/cache/mask_0/mask_29_0.dat | Bin 0 -> 59 bytes lib/phpqrcode/cache/mask_0/mask_33_0.dat | Bin 0 -> 62 bytes lib/phpqrcode/cache/mask_0/mask_37_0.dat | Bin 0 -> 65 bytes lib/phpqrcode/cache/mask_0/mask_41_0.dat | Bin 0 -> 68 bytes lib/phpqrcode/cache/mask_0/mask_45_0.dat | Bin 0 -> 106 bytes lib/phpqrcode/cache/mask_0/mask_49_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_53_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_57_0.dat | 4 + lib/phpqrcode/cache/mask_0/mask_61_0.dat | Bin 0 -> 119 bytes lib/phpqrcode/cache/mask_0/mask_65_0.dat | Bin 0 -> 123 bytes lib/phpqrcode/cache/mask_0/mask_69_0.dat | 1 + lib/phpqrcode/cache/mask_0/mask_73_0.dat | 1 + lib/phpqrcode/cache/mask_0/mask_77_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_81_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_85_0.dat | 2 + lib/phpqrcode/cache/mask_0/mask_89_0.dat | 1 + lib/phpqrcode/cache/mask_0/mask_93_0.dat | 3 + lib/phpqrcode/cache/mask_0/mask_97_0.dat | Bin 0 -> 150 bytes lib/phpqrcode/cache/mask_1/mask_101_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_105_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_109_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_113_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_117_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_121_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_125_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_129_1.dat | Bin 0 -> 164 bytes lib/phpqrcode/cache/mask_1/mask_133_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_137_1.dat | 3 + lib/phpqrcode/cache/mask_1/mask_141_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_145_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_149_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_153_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_157_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_161_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_165_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_169_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_173_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_177_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_21_1.dat | Bin 0 -> 42 bytes lib/phpqrcode/cache/mask_1/mask_25_1.dat | Bin 0 -> 48 bytes lib/phpqrcode/cache/mask_1/mask_29_1.dat | Bin 0 -> 50 bytes lib/phpqrcode/cache/mask_1/mask_33_1.dat | Bin 0 -> 53 bytes lib/phpqrcode/cache/mask_1/mask_37_1.dat | Bin 0 -> 56 bytes lib/phpqrcode/cache/mask_1/mask_41_1.dat | Bin 0 -> 58 bytes lib/phpqrcode/cache/mask_1/mask_45_1.dat | Bin 0 -> 82 bytes lib/phpqrcode/cache/mask_1/mask_49_1.dat | Bin 0 -> 84 bytes lib/phpqrcode/cache/mask_1/mask_53_1.dat | Bin 0 -> 87 bytes lib/phpqrcode/cache/mask_1/mask_57_1.dat | Bin 0 -> 92 bytes lib/phpqrcode/cache/mask_1/mask_61_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_65_1.dat | Bin 0 -> 99 bytes lib/phpqrcode/cache/mask_1/mask_69_1.dat | Bin 0 -> 102 bytes lib/phpqrcode/cache/mask_1/mask_73_1.dat | Bin 0 -> 104 bytes lib/phpqrcode/cache/mask_1/mask_77_1.dat | Bin 0 -> 110 bytes lib/phpqrcode/cache/mask_1/mask_81_1.dat | Bin 0 -> 114 bytes lib/phpqrcode/cache/mask_1/mask_85_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_89_1.dat | 1 + lib/phpqrcode/cache/mask_1/mask_93_1.dat | 2 + lib/phpqrcode/cache/mask_1/mask_97_1.dat | 2 + lib/phpqrcode/cache/mask_2/mask_101_2.dat | 3 + lib/phpqrcode/cache/mask_2/mask_105_2.dat | 1 + lib/phpqrcode/cache/mask_2/mask_109_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_113_2.dat | 1 + lib/phpqrcode/cache/mask_2/mask_117_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_121_2.dat | Bin 0 -> 127 bytes lib/phpqrcode/cache/mask_2/mask_125_2.dat | 1 + lib/phpqrcode/cache/mask_2/mask_129_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_133_2.dat | 10 + lib/phpqrcode/cache/mask_2/mask_137_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_141_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_145_2.dat | 4 + lib/phpqrcode/cache/mask_2/mask_149_2.dat | 1 + lib/phpqrcode/cache/mask_2/mask_153_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_157_2.dat | 3 + lib/phpqrcode/cache/mask_2/mask_161_2.dat | Bin 0 -> 190 bytes lib/phpqrcode/cache/mask_2/mask_165_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_169_2.dat | Bin 0 -> 196 bytes lib/phpqrcode/cache/mask_2/mask_173_2.dat | 1 + lib/phpqrcode/cache/mask_2/mask_177_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_21_2.dat | Bin 0 -> 35 bytes lib/phpqrcode/cache/mask_2/mask_25_2.dat | Bin 0 -> 41 bytes lib/phpqrcode/cache/mask_2/mask_29_2.dat | Bin 0 -> 45 bytes lib/phpqrcode/cache/mask_2/mask_33_2.dat | Bin 0 -> 47 bytes lib/phpqrcode/cache/mask_2/mask_37_2.dat | Bin 0 -> 47 bytes lib/phpqrcode/cache/mask_2/mask_41_2.dat | 1 + lib/phpqrcode/cache/mask_2/mask_45_2.dat | Bin 0 -> 68 bytes lib/phpqrcode/cache/mask_2/mask_49_2.dat | Bin 0 -> 70 bytes lib/phpqrcode/cache/mask_2/mask_53_2.dat | Bin 0 -> 73 bytes lib/phpqrcode/cache/mask_2/mask_57_2.dat | Bin 0 -> 76 bytes lib/phpqrcode/cache/mask_2/mask_61_2.dat | Bin 0 -> 78 bytes lib/phpqrcode/cache/mask_2/mask_65_2.dat | Bin 0 -> 89 bytes lib/phpqrcode/cache/mask_2/mask_69_2.dat | Bin 0 -> 88 bytes lib/phpqrcode/cache/mask_2/mask_73_2.dat | Bin 0 -> 94 bytes lib/phpqrcode/cache/mask_2/mask_77_2.dat | 1 + lib/phpqrcode/cache/mask_2/mask_81_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_85_2.dat | 2 + lib/phpqrcode/cache/mask_2/mask_89_2.dat | 1 + lib/phpqrcode/cache/mask_2/mask_93_2.dat | Bin 0 -> 103 bytes lib/phpqrcode/cache/mask_2/mask_97_2.dat | 2 + lib/phpqrcode/cache/mask_3/mask_101_3.dat | 1 + lib/phpqrcode/cache/mask_3/mask_105_3.dat | 1 + lib/phpqrcode/cache/mask_3/mask_109_3.dat | 1 + lib/phpqrcode/cache/mask_3/mask_113_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_117_3.dat | 4 + lib/phpqrcode/cache/mask_3/mask_121_3.dat | Bin 0 -> 212 bytes lib/phpqrcode/cache/mask_3/mask_125_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_129_3.dat | 8 + lib/phpqrcode/cache/mask_3/mask_133_3.dat | Bin 0 -> 216 bytes lib/phpqrcode/cache/mask_3/mask_137_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_141_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_145_3.dat | 3 + lib/phpqrcode/cache/mask_3/mask_149_3.dat | 1 + lib/phpqrcode/cache/mask_3/mask_153_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_157_3.dat | Bin 0 -> 248 bytes lib/phpqrcode/cache/mask_3/mask_161_3.dat | 3 + lib/phpqrcode/cache/mask_3/mask_165_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_169_3.dat | 1 + lib/phpqrcode/cache/mask_3/mask_173_3.dat | 1 + lib/phpqrcode/cache/mask_3/mask_177_3.dat | Bin 0 -> 312 bytes lib/phpqrcode/cache/mask_3/mask_21_3.dat | Bin 0 -> 60 bytes lib/phpqrcode/cache/mask_3/mask_25_3.dat | Bin 0 -> 75 bytes lib/phpqrcode/cache/mask_3/mask_29_3.dat | Bin 0 -> 75 bytes lib/phpqrcode/cache/mask_3/mask_33_3.dat | Bin 0 -> 79 bytes lib/phpqrcode/cache/mask_3/mask_37_3.dat | Bin 0 -> 83 bytes lib/phpqrcode/cache/mask_3/mask_41_3.dat | Bin 0 -> 85 bytes lib/phpqrcode/cache/mask_3/mask_45_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_49_3.dat | Bin 0 -> 127 bytes lib/phpqrcode/cache/mask_3/mask_53_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_57_3.dat | Bin 0 -> 126 bytes lib/phpqrcode/cache/mask_3/mask_61_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_65_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_69_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_73_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_77_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_81_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_85_3.dat | Bin 0 -> 160 bytes lib/phpqrcode/cache/mask_3/mask_89_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_93_3.dat | 2 + lib/phpqrcode/cache/mask_3/mask_97_3.dat | Bin 0 -> 175 bytes lib/phpqrcode/cache/mask_4/mask_101_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_105_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_109_4.dat | Bin 0 -> 182 bytes lib/phpqrcode/cache/mask_4/mask_113_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_117_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_121_4.dat | Bin 0 -> 208 bytes lib/phpqrcode/cache/mask_4/mask_125_4.dat | Bin 0 -> 213 bytes lib/phpqrcode/cache/mask_4/mask_129_4.dat | Bin 0 -> 220 bytes lib/phpqrcode/cache/mask_4/mask_133_4.dat | 3 + lib/phpqrcode/cache/mask_4/mask_137_4.dat | Bin 0 -> 248 bytes lib/phpqrcode/cache/mask_4/mask_141_4.dat | Bin 0 -> 254 bytes lib/phpqrcode/cache/mask_4/mask_145_4.dat | Bin 0 -> 255 bytes lib/phpqrcode/cache/mask_4/mask_149_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_153_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_157_4.dat | 1 + lib/phpqrcode/cache/mask_4/mask_161_4.dat | 1 + lib/phpqrcode/cache/mask_4/mask_165_4.dat | 3 + lib/phpqrcode/cache/mask_4/mask_169_4.dat | Bin 0 -> 297 bytes lib/phpqrcode/cache/mask_4/mask_173_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_177_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_21_4.dat | Bin 0 -> 57 bytes lib/phpqrcode/cache/mask_4/mask_25_4.dat | Bin 0 -> 76 bytes lib/phpqrcode/cache/mask_4/mask_29_4.dat | Bin 0 -> 78 bytes lib/phpqrcode/cache/mask_4/mask_33_4.dat | Bin 0 -> 89 bytes lib/phpqrcode/cache/mask_4/mask_37_4.dat | Bin 0 -> 86 bytes lib/phpqrcode/cache/mask_4/mask_41_4.dat | Bin 0 -> 89 bytes lib/phpqrcode/cache/mask_4/mask_45_4.dat | Bin 0 -> 120 bytes lib/phpqrcode/cache/mask_4/mask_49_4.dat | Bin 0 -> 124 bytes lib/phpqrcode/cache/mask_4/mask_53_4.dat | Bin 0 -> 128 bytes lib/phpqrcode/cache/mask_4/mask_57_4.dat | Bin 0 -> 130 bytes lib/phpqrcode/cache/mask_4/mask_61_4.dat | Bin 0 -> 132 bytes lib/phpqrcode/cache/mask_4/mask_65_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_69_4.dat | 1 + lib/phpqrcode/cache/mask_4/mask_73_4.dat | 3 + lib/phpqrcode/cache/mask_4/mask_77_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_81_4.dat | 3 + lib/phpqrcode/cache/mask_4/mask_85_4.dat | Bin 0 -> 154 bytes lib/phpqrcode/cache/mask_4/mask_89_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_93_4.dat | 2 + lib/phpqrcode/cache/mask_4/mask_97_4.dat | Bin 0 -> 176 bytes lib/phpqrcode/cache/mask_5/mask_101_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_105_5.dat | Bin 0 -> 224 bytes lib/phpqrcode/cache/mask_5/mask_109_5.dat | Bin 0 -> 211 bytes lib/phpqrcode/cache/mask_5/mask_113_5.dat | 9 + lib/phpqrcode/cache/mask_5/mask_117_5.dat | 1 + lib/phpqrcode/cache/mask_5/mask_121_5.dat | Bin 0 -> 256 bytes lib/phpqrcode/cache/mask_5/mask_125_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_129_5.dat | Bin 0 -> 259 bytes lib/phpqrcode/cache/mask_5/mask_133_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_137_5.dat | 3 + lib/phpqrcode/cache/mask_5/mask_141_5.dat | Bin 0 -> 297 bytes lib/phpqrcode/cache/mask_5/mask_145_5.dat | Bin 0 -> 300 bytes lib/phpqrcode/cache/mask_5/mask_149_5.dat | 3 + lib/phpqrcode/cache/mask_5/mask_153_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_157_5.dat | 1 + lib/phpqrcode/cache/mask_5/mask_161_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_165_5.dat | Bin 0 -> 332 bytes lib/phpqrcode/cache/mask_5/mask_169_5.dat | 1 + lib/phpqrcode/cache/mask_5/mask_173_5.dat | 4 + lib/phpqrcode/cache/mask_5/mask_177_5.dat | 11 + lib/phpqrcode/cache/mask_5/mask_21_5.dat | Bin 0 -> 74 bytes lib/phpqrcode/cache/mask_5/mask_25_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_29_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_33_5.dat | Bin 0 -> 106 bytes lib/phpqrcode/cache/mask_5/mask_37_5.dat | Bin 0 -> 103 bytes lib/phpqrcode/cache/mask_5/mask_41_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_45_5.dat | 1 + lib/phpqrcode/cache/mask_5/mask_49_5.dat | Bin 0 -> 146 bytes lib/phpqrcode/cache/mask_5/mask_53_5.dat | 1 + lib/phpqrcode/cache/mask_5/mask_57_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_61_5.dat | 1 + lib/phpqrcode/cache/mask_5/mask_65_5.dat | Bin 0 -> 163 bytes lib/phpqrcode/cache/mask_5/mask_69_5.dat | Bin 0 -> 167 bytes lib/phpqrcode/cache/mask_5/mask_73_5.dat | Bin 0 -> 184 bytes lib/phpqrcode/cache/mask_5/mask_77_5.dat | 1 + lib/phpqrcode/cache/mask_5/mask_81_5.dat | 3 + lib/phpqrcode/cache/mask_5/mask_85_5.dat | Bin 0 -> 186 bytes lib/phpqrcode/cache/mask_5/mask_89_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_93_5.dat | 2 + lib/phpqrcode/cache/mask_5/mask_97_5.dat | 1 + lib/phpqrcode/cache/mask_6/mask_101_6.dat | 2 + lib/phpqrcode/cache/mask_6/mask_105_6.dat | 3 + lib/phpqrcode/cache/mask_6/mask_109_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_113_6.dat | 3 + lib/phpqrcode/cache/mask_6/mask_117_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_121_6.dat | Bin 0 -> 309 bytes lib/phpqrcode/cache/mask_6/mask_125_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_129_6.dat | Bin 0 -> 310 bytes lib/phpqrcode/cache/mask_6/mask_133_6.dat | Bin 0 -> 296 bytes lib/phpqrcode/cache/mask_6/mask_137_6.dat | 2 + lib/phpqrcode/cache/mask_6/mask_141_6.dat | 10 + lib/phpqrcode/cache/mask_6/mask_145_6.dat | Bin 0 -> 357 bytes lib/phpqrcode/cache/mask_6/mask_149_6.dat | 2 + lib/phpqrcode/cache/mask_6/mask_153_6.dat | Bin 0 -> 367 bytes lib/phpqrcode/cache/mask_6/mask_157_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_161_6.dat | Bin 0 -> 399 bytes lib/phpqrcode/cache/mask_6/mask_165_6.dat | Bin 0 -> 400 bytes lib/phpqrcode/cache/mask_6/mask_169_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_173_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_177_6.dat | 14 + lib/phpqrcode/cache/mask_6/mask_21_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_25_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_29_6.dat | 3 + lib/phpqrcode/cache/mask_6/mask_33_6.dat | Bin 0 -> 124 bytes lib/phpqrcode/cache/mask_6/mask_37_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_41_6.dat | Bin 0 -> 132 bytes lib/phpqrcode/cache/mask_6/mask_45_6.dat | Bin 0 -> 189 bytes lib/phpqrcode/cache/mask_6/mask_49_6.dat | 2 + lib/phpqrcode/cache/mask_6/mask_53_6.dat | Bin 0 -> 195 bytes lib/phpqrcode/cache/mask_6/mask_57_6.dat | 2 + lib/phpqrcode/cache/mask_6/mask_61_6.dat | 2 + lib/phpqrcode/cache/mask_6/mask_65_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_69_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_73_6.dat | Bin 0 -> 230 bytes lib/phpqrcode/cache/mask_6/mask_77_6.dat | 1 + lib/phpqrcode/cache/mask_6/mask_81_6.dat | 3 + lib/phpqrcode/cache/mask_6/mask_85_6.dat | Bin 0 -> 229 bytes lib/phpqrcode/cache/mask_6/mask_89_6.dat | Bin 0 -> 263 bytes lib/phpqrcode/cache/mask_6/mask_93_6.dat | Bin 0 -> 276 bytes lib/phpqrcode/cache/mask_6/mask_97_6.dat | 2 + lib/phpqrcode/cache/mask_7/mask_101_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_105_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_109_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_113_7.dat | 11 + lib/phpqrcode/cache/mask_7/mask_117_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_121_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_125_7.dat | Bin 0 -> 288 bytes lib/phpqrcode/cache/mask_7/mask_129_7.dat | Bin 0 -> 282 bytes lib/phpqrcode/cache/mask_7/mask_133_7.dat | Bin 0 -> 281 bytes lib/phpqrcode/cache/mask_7/mask_137_7.dat | 5 + lib/phpqrcode/cache/mask_7/mask_141_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_145_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_149_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_153_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_157_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_161_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_165_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_169_7.dat | Bin 0 -> 383 bytes lib/phpqrcode/cache/mask_7/mask_173_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_177_7.dat | Bin 0 -> 407 bytes lib/phpqrcode/cache/mask_7/mask_21_7.dat | 4 + lib/phpqrcode/cache/mask_7/mask_25_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_29_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_33_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_37_7.dat | Bin 0 -> 122 bytes lib/phpqrcode/cache/mask_7/mask_41_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_45_7.dat | Bin 0 -> 173 bytes lib/phpqrcode/cache/mask_7/mask_49_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_53_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_57_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_61_7.dat | 2 + lib/phpqrcode/cache/mask_7/mask_65_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_69_7.dat | Bin 0 -> 202 bytes lib/phpqrcode/cache/mask_7/mask_73_7.dat | Bin 0 -> 221 bytes lib/phpqrcode/cache/mask_7/mask_77_7.dat | Bin 0 -> 226 bytes lib/phpqrcode/cache/mask_7/mask_81_7.dat | 1 + lib/phpqrcode/cache/mask_7/mask_85_7.dat | Bin 0 -> 213 bytes lib/phpqrcode/cache/mask_7/mask_89_7.dat | Bin 0 -> 244 bytes lib/phpqrcode/cache/mask_7/mask_93_7.dat | Bin 0 -> 248 bytes lib/phpqrcode/cache/mask_7/mask_97_7.dat | 2 + lib/phpqrcode/index.php | 94 + lib/phpqrcode/phpqrcode.php | 3312 +++++++++++++++++++++ lib/phpqrcode/qrbitstream.php | 180 ++ lib/phpqrcode/qrconfig.php | 17 + lib/phpqrcode/qrconst.php | 54 + lib/phpqrcode/qrencode.php | 502 ++++ lib/phpqrcode/qrimage.php | 95 + lib/phpqrcode/qrinput.php | 729 +++++ lib/phpqrcode/qrlib.php | 43 + lib/phpqrcode/qrmask.php | 328 ++ lib/phpqrcode/qrrscode.php | 210 ++ lib/phpqrcode/qrspec.php | 592 ++++ lib/phpqrcode/qrsplit.php | 311 ++ lib/phpqrcode/qrtools.php | 172 ++ lib/phpqrcode/tools/merge.bat | 2 + lib/phpqrcode/tools/merge.php | 70 + lib/phpqrcode/tools/merge.sh | 2 + lib/phpqrcode/tools/merged_config.php | 17 + lib/phpqrcode/tools/merged_header.php | 36 + schema/ttrss_schema_mysql.sql | 5 +- schema/ttrss_schema_pgsql.sql | 5 +- schema/versions/mysql/97.sql | 10 + schema/versions/pgsql/97.sql | 10 + 439 files changed, 11026 insertions(+), 7 deletions(-) create mode 100644 lib/otphp/LICENCE create mode 100644 lib/otphp/lib/hotp.php create mode 100644 lib/otphp/lib/otp.php create mode 100644 lib/otphp/lib/otphp.php create mode 100644 lib/otphp/lib/totp.php create mode 100644 lib/otphp/vendor/base32.php create mode 100644 lib/otphp/vendor/libs.php create mode 100644 lib/phpqrcode/CHANGELOG create mode 100644 lib/phpqrcode/INSTALL create mode 100644 lib/phpqrcode/LICENSE create mode 100644 lib/phpqrcode/README create mode 100644 lib/phpqrcode/VERSION create mode 100644 lib/phpqrcode/bindings/tcpdf/qrcode.php create mode 100644 lib/phpqrcode/cache/frame_1.dat create mode 100644 lib/phpqrcode/cache/frame_1.png create mode 100644 lib/phpqrcode/cache/frame_10.dat create mode 100644 lib/phpqrcode/cache/frame_10.png create mode 100644 lib/phpqrcode/cache/frame_11.dat create mode 100644 lib/phpqrcode/cache/frame_11.png create mode 100644 lib/phpqrcode/cache/frame_12.dat create mode 100644 lib/phpqrcode/cache/frame_12.png create mode 100644 lib/phpqrcode/cache/frame_13.dat create mode 100644 lib/phpqrcode/cache/frame_13.png create mode 100644 lib/phpqrcode/cache/frame_14.dat create mode 100644 lib/phpqrcode/cache/frame_14.png create mode 100644 lib/phpqrcode/cache/frame_15.dat create mode 100644 lib/phpqrcode/cache/frame_15.png create mode 100644 lib/phpqrcode/cache/frame_16.dat create mode 100644 lib/phpqrcode/cache/frame_16.png create mode 100644 lib/phpqrcode/cache/frame_17.dat create mode 100644 lib/phpqrcode/cache/frame_17.png create mode 100644 lib/phpqrcode/cache/frame_18.dat create mode 100644 lib/phpqrcode/cache/frame_18.png create mode 100644 lib/phpqrcode/cache/frame_19.dat create mode 100644 lib/phpqrcode/cache/frame_19.png create mode 100644 lib/phpqrcode/cache/frame_2.dat create mode 100644 lib/phpqrcode/cache/frame_2.png create mode 100644 lib/phpqrcode/cache/frame_20.dat create mode 100644 lib/phpqrcode/cache/frame_20.png create mode 100644 lib/phpqrcode/cache/frame_21.dat create mode 100644 lib/phpqrcode/cache/frame_21.png create mode 100644 lib/phpqrcode/cache/frame_22.dat create mode 100644 lib/phpqrcode/cache/frame_22.png create mode 100644 lib/phpqrcode/cache/frame_23.dat create mode 100644 lib/phpqrcode/cache/frame_23.png create mode 100644 lib/phpqrcode/cache/frame_24.dat create mode 100644 lib/phpqrcode/cache/frame_24.png create mode 100644 lib/phpqrcode/cache/frame_25.dat create mode 100644 lib/phpqrcode/cache/frame_25.png create mode 100644 lib/phpqrcode/cache/frame_26.dat create mode 100644 lib/phpqrcode/cache/frame_26.png create mode 100644 lib/phpqrcode/cache/frame_27.dat create mode 100644 lib/phpqrcode/cache/frame_27.png create mode 100644 lib/phpqrcode/cache/frame_28.dat create mode 100644 lib/phpqrcode/cache/frame_28.png create mode 100644 lib/phpqrcode/cache/frame_29.dat create mode 100644 lib/phpqrcode/cache/frame_29.png create mode 100644 lib/phpqrcode/cache/frame_3.dat create mode 100644 lib/phpqrcode/cache/frame_3.png create mode 100644 lib/phpqrcode/cache/frame_30.dat create mode 100644 lib/phpqrcode/cache/frame_30.png create mode 100644 lib/phpqrcode/cache/frame_31.dat create mode 100644 lib/phpqrcode/cache/frame_31.png create mode 100644 lib/phpqrcode/cache/frame_32.dat create mode 100644 lib/phpqrcode/cache/frame_32.png create mode 100644 lib/phpqrcode/cache/frame_33.dat create mode 100644 lib/phpqrcode/cache/frame_33.png create mode 100644 lib/phpqrcode/cache/frame_34.dat create mode 100644 lib/phpqrcode/cache/frame_34.png create mode 100644 lib/phpqrcode/cache/frame_35.dat create mode 100644 lib/phpqrcode/cache/frame_35.png create mode 100644 lib/phpqrcode/cache/frame_36.dat create mode 100644 lib/phpqrcode/cache/frame_36.png create mode 100644 lib/phpqrcode/cache/frame_37.dat create mode 100644 lib/phpqrcode/cache/frame_37.png create mode 100644 lib/phpqrcode/cache/frame_38.dat create mode 100644 lib/phpqrcode/cache/frame_38.png create mode 100644 lib/phpqrcode/cache/frame_39.dat create mode 100644 lib/phpqrcode/cache/frame_39.png create mode 100644 lib/phpqrcode/cache/frame_4.dat create mode 100644 lib/phpqrcode/cache/frame_4.png create mode 100644 lib/phpqrcode/cache/frame_40.dat create mode 100644 lib/phpqrcode/cache/frame_40.png create mode 100644 lib/phpqrcode/cache/frame_5.dat create mode 100644 lib/phpqrcode/cache/frame_5.png create mode 100644 lib/phpqrcode/cache/frame_6.dat create mode 100644 lib/phpqrcode/cache/frame_6.png create mode 100644 lib/phpqrcode/cache/frame_7.dat create mode 100644 lib/phpqrcode/cache/frame_7.png create mode 100644 lib/phpqrcode/cache/frame_8.dat create mode 100644 lib/phpqrcode/cache/frame_8.png create mode 100644 lib/phpqrcode/cache/frame_9.dat create mode 100644 lib/phpqrcode/cache/frame_9.png create mode 100644 lib/phpqrcode/cache/mask_0/mask_101_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_105_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_109_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_113_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_117_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_121_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_125_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_129_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_133_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_137_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_141_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_145_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_149_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_153_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_157_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_161_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_165_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_169_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_173_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_177_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_21_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_25_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_29_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_33_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_37_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_41_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_45_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_49_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_53_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_57_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_61_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_65_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_69_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_73_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_77_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_81_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_85_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_89_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_93_0.dat create mode 100644 lib/phpqrcode/cache/mask_0/mask_97_0.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_101_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_105_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_109_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_113_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_117_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_121_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_125_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_129_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_133_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_137_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_141_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_145_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_149_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_153_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_157_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_161_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_165_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_169_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_173_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_177_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_21_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_25_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_29_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_33_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_37_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_41_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_45_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_49_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_53_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_57_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_61_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_65_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_69_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_73_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_77_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_81_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_85_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_89_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_93_1.dat create mode 100644 lib/phpqrcode/cache/mask_1/mask_97_1.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_101_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_105_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_109_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_113_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_117_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_121_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_125_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_129_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_133_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_137_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_141_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_145_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_149_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_153_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_157_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_161_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_165_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_169_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_173_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_177_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_21_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_25_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_29_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_33_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_37_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_41_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_45_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_49_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_53_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_57_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_61_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_65_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_69_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_73_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_77_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_81_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_85_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_89_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_93_2.dat create mode 100644 lib/phpqrcode/cache/mask_2/mask_97_2.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_101_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_105_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_109_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_113_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_117_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_121_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_125_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_129_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_133_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_137_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_141_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_145_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_149_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_153_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_157_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_161_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_165_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_169_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_173_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_177_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_21_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_25_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_29_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_33_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_37_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_41_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_45_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_49_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_53_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_57_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_61_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_65_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_69_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_73_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_77_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_81_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_85_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_89_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_93_3.dat create mode 100644 lib/phpqrcode/cache/mask_3/mask_97_3.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_101_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_105_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_109_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_113_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_117_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_121_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_125_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_129_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_133_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_137_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_141_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_145_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_149_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_153_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_157_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_161_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_165_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_169_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_173_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_177_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_21_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_25_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_29_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_33_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_37_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_41_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_45_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_49_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_53_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_57_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_61_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_65_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_69_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_73_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_77_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_81_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_85_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_89_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_93_4.dat create mode 100644 lib/phpqrcode/cache/mask_4/mask_97_4.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_101_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_105_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_109_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_113_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_117_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_121_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_125_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_129_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_133_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_137_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_141_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_145_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_149_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_153_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_157_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_161_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_165_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_169_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_173_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_177_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_21_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_25_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_29_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_33_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_37_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_41_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_45_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_49_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_53_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_57_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_61_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_65_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_69_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_73_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_77_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_81_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_85_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_89_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_93_5.dat create mode 100644 lib/phpqrcode/cache/mask_5/mask_97_5.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_101_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_105_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_109_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_113_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_117_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_121_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_125_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_129_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_133_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_137_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_141_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_145_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_149_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_153_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_157_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_161_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_165_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_169_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_173_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_177_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_21_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_25_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_29_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_33_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_37_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_41_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_45_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_49_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_53_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_57_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_61_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_65_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_69_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_73_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_77_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_81_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_85_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_89_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_93_6.dat create mode 100644 lib/phpqrcode/cache/mask_6/mask_97_6.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_101_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_105_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_109_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_113_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_117_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_121_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_125_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_129_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_133_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_137_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_141_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_145_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_149_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_153_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_157_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_161_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_165_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_169_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_173_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_177_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_21_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_25_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_29_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_33_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_37_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_41_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_45_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_49_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_53_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_57_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_61_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_65_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_69_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_73_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_77_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_81_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_85_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_89_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_93_7.dat create mode 100644 lib/phpqrcode/cache/mask_7/mask_97_7.dat create mode 100644 lib/phpqrcode/index.php create mode 100644 lib/phpqrcode/phpqrcode.php create mode 100644 lib/phpqrcode/qrbitstream.php create mode 100644 lib/phpqrcode/qrconfig.php create mode 100644 lib/phpqrcode/qrconst.php create mode 100644 lib/phpqrcode/qrencode.php create mode 100644 lib/phpqrcode/qrimage.php create mode 100644 lib/phpqrcode/qrinput.php create mode 100644 lib/phpqrcode/qrlib.php create mode 100644 lib/phpqrcode/qrmask.php create mode 100644 lib/phpqrcode/qrrscode.php create mode 100644 lib/phpqrcode/qrspec.php create mode 100644 lib/phpqrcode/qrsplit.php create mode 100644 lib/phpqrcode/qrtools.php create mode 100644 lib/phpqrcode/tools/merge.bat create mode 100644 lib/phpqrcode/tools/merge.php create mode 100644 lib/phpqrcode/tools/merge.sh create mode 100644 lib/phpqrcode/tools/merged_config.php create mode 100644 lib/phpqrcode/tools/merged_header.php create mode 100644 schema/versions/mysql/97.sql create mode 100644 schema/versions/pgsql/97.sql diff --git a/classes/auth/internal.php b/classes/auth/internal.php index 8890d445..a4e8b471 100644 --- a/classes/auth/internal.php +++ b/classes/auth/internal.php @@ -6,6 +6,48 @@ class Auth_Internal extends Auth_Base { $pwd_hash1 = encrypt_password($password); $pwd_hash2 = encrypt_password($password, $login); $login = db_escape_string($login); + $otp = db_escape_string($_REQUEST["otp"]); + + if (get_schema_version($this->link) > 96) { + $result = db_query($this->link, "SELECT otp_enabled,salt FROM ttrss_users WHERE + login = '$login'"); + + require_once "lib/otphp/vendor/base32.php"; + require_once "lib/otphp/lib/otp.php"; + require_once "lib/otphp/lib/totp.php"; + + $base32 = new Base32(); + + $otp_enabled = sql_bool_to_bool(db_fetch_result($result, 0, "otp_enabled")); + $secret = $base32->encode(sha1(db_fetch_result($result, 0, "salt"))); + + $topt = new \OTPHP\TOTP($secret); + $otp_check = $topt->now(); + + if ($otp_enabled) { + if ($otp) { + if ($otp != $otp_check) { + return false; + } + } else { + ?> + Tiny Tiny RSS + +
+ + + + + + + +
+ + link) > 87) { @@ -104,7 +146,7 @@ class Auth_Internal extends Auth_Base { $new_password_hash = encrypt_password($new_password, $new_salt, true); db_query($this->link, "UPDATE ttrss_users SET - pwd_hash = '$new_password_hash', salt = '$new_salt' + pwd_hash = '$new_password_hash', salt = '$new_salt', otp_enabled = false WHERE id = '$owner_uid'"); $_SESSION["pwd_hash"] = $new_password_hash; diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php index 705b709f..c6b10987 100644 --- a/classes/pref/prefs.php +++ b/classes/pref/prefs.php @@ -154,12 +154,15 @@ class Pref_Prefs extends Handler_Protected { print ""; - $result = db_query($this->link, "SELECT email,full_name, + print "

" . __("Personal data") . "

"; + + $result = db_query($this->link, "SELECT email,full_name,otp_enabled, access_level FROM ttrss_users WHERE id = ".$_SESSION["uid"]); $email = htmlspecialchars(db_fetch_result($result, 0, "email")); $full_name = htmlspecialchars(db_fetch_result($result, 0, "full_name")); + $otp_enabled = sql_bool_to_bool(db_fetch_result($result, 0, "otp_enabled")); print ""; print "
".__('Full name')."" . __("Password") . ""; + $result = db_query($this->link, "SELECT id FROM ttrss_users WHERE id = ".$_SESSION["uid"]." AND pwd_hash = 'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8'"); @@ -249,6 +254,55 @@ class Pref_Prefs extends Handler_Protected { print ""; + if ($_SESSION["auth_module"] == "internal") { + + print "

" . __("One time passwords / Authenticator") . "

"; + + if ($otp_enabled) { + + print "

".__("One time passwords are currently enabled. Change your current password and refresh this page to reconfigure.") . "

"; + + } else { + + print "

".__("You will need a compatible Authenticator to use this. Changing your password would automatically disable OTP.") . "

"; + + print "

".__("Scan the following code by the Authenticator application:")."

"; + + $csrf_token = $_SESSION["csrf_token"]; + + print ""; + + print "
"; + + print ""; + print ""; + + print ""; + + print " "; + print ""; + + print "

"; + + print "

"; + + } + + } } print ""; #pane @@ -571,5 +625,34 @@ class Pref_Prefs extends Handler_Protected { function toggleAdvanced() { $_SESSION["prefs_show_advanced"] = !$_SESSION["prefs_show_advanced"]; } + + function otpqrcode() { + require_once "lib/otphp/vendor/base32.php"; + require_once "lib/otphp/lib/otp.php"; + require_once "lib/otphp/lib/totp.php"; + require_once "lib/phpqrcode/phpqrcode.php"; + + $result = db_query($this->link, "SELECT login,salt + FROM ttrss_users + WHERE id = ".$_SESSION["uid"]); + + $base32 = new Base32(); + + $login = db_fetch_result($result, 0, "login"); + $secret = $base32->encode(sha1(db_fetch_result($result, 0, "salt"))); + + $topt = new \OTPHP\TOTP($secret); + + print QRcode::png($topt->provisioning_uri($login)); + } + + function changeotp() { + $enable_otp = $_REQUEST["enable_otp"]; + + if ($enable_otp == "on") { + db_query($this->link, "UPDATE ttrss_users SET otp_enabled = true WHERE + id = " . $_SESSION["uid"]); + } + } } ?> diff --git a/include/functions.php b/include/functions.php index d1855e99..2924d179 100644 --- a/include/functions.php +++ b/include/functions.php @@ -1,6 +1,6 @@ generateOTP($count); + } + + + /** + * Verify if a password is valid for a specific counter value + * + * @param integer $otp the one-time password + * @param integer $counter the counter value + * @return bool true if the counter is valid, false otherwise + */ + public function verify($otp, $counter) { + return ($otp == $this->at($counter)); + } + + /** + * Returns the uri for a specific secret for hotp method. + * Can be encoded as a image for simple configuration in + * Google Authenticator. + * + * @param string $name the name of the account / profile + * @param integer $initial_count the initial counter + * @return string the uri for the hmac secret + */ + public function provisioning_uri($name, $initial_count) { + return "otpauth://hotp/".urlencode($name)."?secret={$this->secret}&counter=$initial_count"; + } + } + +} diff --git a/lib/otphp/lib/otp.php b/lib/otphp/lib/otp.php new file mode 100644 index 00000000..77bcfe97 --- /dev/null +++ b/lib/otphp/lib/otp.php @@ -0,0 +1,120 @@ +digits = isset($opt['digits']) ? $opt['digits'] : 6; + $this->digest = isset($opt['digest']) ? $opt['digest'] : 'sha1'; + $this->secret = $secret; + } + + /** + * Generate a one-time password + * + * @param integer $input : number used to seed the hmac hash function. + * This number is usually a counter (HOTP) or calculated based on the current + * timestamp (see TOTP class). + * @return integer the one-time password + */ + public function generateOTP($input) { + $hash = hash_hmac($this->digest, $this->intToBytestring($input), $this->byteSecret()); + foreach(str_split($hash, 2) as $hex) { // stupid PHP has bin2hex but no hex2bin WTF + $hmac[] = hexdec($hex); + } + $offset = $hmac[19] & 0xf; + $code = ($hmac[$offset+0] & 0x7F) << 24 | + ($hmac[$offset + 1] & 0xFF) << 16 | + ($hmac[$offset + 2] & 0xFF) << 8 | + ($hmac[$offset + 3] & 0xFF); + return $code % pow(10, $this->digits); + } + + /** + * Returns the binary value of the base32 encoded secret + * @access private + * This method should be private but was left public for + * phpunit tests to work. + * @return binary secret key + */ + public function byteSecret() { + return \Base32::decode($this->secret); + } + + /** + * Turns an integer in a OATH bytestring + * @param integer $int + * @access private + * @return string bytestring + */ + public function intToBytestring($int) { + $result = Array(); + while($int != 0) { + $result[] = chr($int & 0xFF); + $int >>= 8; + } + return str_pad(join(array_reverse($result)), 8, "\000", STR_PAD_LEFT); + } + } +} diff --git a/lib/otphp/lib/otphp.php b/lib/otphp/lib/otphp.php new file mode 100644 index 00000000..a6c6f8d6 --- /dev/null +++ b/lib/otphp/lib/otphp.php @@ -0,0 +1,27 @@ +interval = isset($opt['interval']) ? $opt['interval'] : 30; + parent::__construct($s, $opt); + } + + /** + * Get the password for a specific timestamp value + * + * @param integer $timestamp the timestamp which is timecoded and + * used to seed the hmac hash function. + * @return integer the One Time Password + */ + public function at($timestamp) { + return $this->generateOTP($this->timecode($timestamp)); + } + + /** + * Get the password for the current timestamp value + * + * @return integer the current One Time Password + */ + public function now() { + return $this->generateOTP($this->timecode(time())); + } + + /** + * Verify if a password is valid for a specific counter value + * + * @param integer $otp the one-time password + * @param integer $timestamp the timestamp for the a given time, defaults to current time. + * @return bool true if the counter is valid, false otherwise + */ + public function verify($otp, $timestamp = null) { + if($timestamp === null) + $timestamp = time(); + return ($otp == $this->at($timestamp)); + } + + /** + * Returns the uri for a specific secret for totp method. + * Can be encoded as a image for simple configuration in + * Google Authenticator. + * + * @param string $name the name of the account / profile + * @return string the uri for the hmac secret + */ + public function provisioning_uri($name) { + return "otpauth://totp/".urlencode($name)."?secret={$this->secret}"; + } + + /** + * Transform a timestamp in a counter based on specified internal + * + * @param integer $timestamp + * @return integer the timecode + */ + protected function timecode($timestamp) { + return (int)( (((int)$timestamp * 1000) / ($this->interval * 1000))); + } + } + +} diff --git a/lib/otphp/vendor/base32.php b/lib/otphp/vendor/base32.php new file mode 100644 index 00000000..99c3f1bf --- /dev/null +++ b/lib/otphp/vendor/base32.php @@ -0,0 +1,83 @@ +'0', 'B'=>'1', 'C'=>'2', 'D'=>'3', 'E'=>'4', 'F'=>'5', 'G'=>'6', 'H'=>'7', + 'I'=>'8', 'J'=>'9', 'K'=>'10', 'L'=>'11', 'M'=>'12', 'N'=>'13', 'O'=>'14', 'P'=>'15', + 'Q'=>'16', 'R'=>'17', 'S'=>'18', 'T'=>'19', 'U'=>'20', 'V'=>'21', 'W'=>'22', 'X'=>'23', + 'Y'=>'24', 'Z'=>'25', '2'=>'26', '3'=>'27', '4'=>'28', '5'=>'29', '6'=>'30', '7'=>'31' + ); + + /** + * Use padding false when encoding for urls + * + * @return base32 encoded string + * @author Bryan Ruiz + **/ + public static function encode($input, $padding = true) { + if(empty($input)) return ""; + $input = str_split($input); + $binaryString = ""; + for($i = 0; $i < count($input); $i++) { + $binaryString .= str_pad(base_convert(ord($input[$i]), 10, 2), 8, '0', STR_PAD_LEFT); + } + $fiveBitBinaryArray = str_split($binaryString, 5); + $base32 = ""; + $i=0; + while($i < count($fiveBitBinaryArray)) { + $base32 .= self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)]; + $i++; + } + if($padding && ($x = strlen($binaryString) % 40) != 0) { + if($x == 8) $base32 .= str_repeat(self::$map[32], 6); + else if($x == 16) $base32 .= str_repeat(self::$map[32], 4); + else if($x == 24) $base32 .= str_repeat(self::$map[32], 3); + else if($x == 32) $base32 .= self::$map[32]; + } + return $base32; + } + + public static function decode($input) { + if(empty($input)) return; + $paddingCharCount = substr_count($input, self::$map[32]); + $allowedValues = array(6,4,3,1,0); + if(!in_array($paddingCharCount, $allowedValues)) return false; + for($i=0; $i<4; $i++){ + if($paddingCharCount == $allowedValues[$i] && + substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i])) return false; + } + $input = str_replace('=','', $input); + $input = str_split($input); + $binaryString = ""; + for($i=0; $i < count($input); $i = $i+8) { + $x = ""; + if(!in_array($input[$i], self::$map)) return false; + for($j=0; $j < 8; $j++) { + $x .= str_pad(base_convert(@self::$flippedMap[@$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT); + } + $eightBits = str_split($x, 8); + for($z = 0; $z < count($eightBits); $z++) { + $binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:""; + } + } + return $binaryString; + } +} + diff --git a/lib/otphp/vendor/libs.php b/lib/otphp/vendor/libs.php new file mode 100644 index 00000000..742c7b98 --- /dev/null +++ b/lib/otphp/vendor/libs.php @@ -0,0 +1,26 @@ +encode('PHP QR Code :)'); +QRspec::debug($tab, true); + +== TCPDF INTEGRATION == + +Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php. +Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge) +2dbarcodes.php + +Then use similar as example #50 from TCPDF examples: + + true, + 'padding' => 4, + 'fgcolor' => array(0,0,0), + 'bgcolor' => false, //array(255,255,255) +); + +//code name: QR, specify error correction level after semicolon (L,M,Q,H) +$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N'); diff --git a/lib/phpqrcode/LICENSE b/lib/phpqrcode/LICENSE new file mode 100644 index 00000000..18833032 --- /dev/null +++ b/lib/phpqrcode/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/lib/phpqrcode/README b/lib/phpqrcode/README new file mode 100644 index 00000000..a022fb5e --- /dev/null +++ b/lib/phpqrcode/README @@ -0,0 +1,45 @@ +This is PHP implementation of QR Code 2-D barcode generator. It is pure-php +LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi. + +== LICENSING == + +Copyright (C) 2010 by Dominik Dzienia + +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file) +for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this library; if not, write to the Free Software Foundation, Inc., 51 +Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +== INSTALATION AND USAGE == + + * INSTALL file + * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page + +== CONTACT == + +Fell free to contact me via e-mail (deltalab at poczta dot fm) or using +folowing project pages: + + * http://sourceforge.net/projects/phpqrcode/ + * http://phpqrcode.sourceforge.net/ + +== ACKNOWLEDGMENTS == + +Based on C libqrencode library (ver. 3.1.1) +Copyright (C) 2006-2010 by Kentaro Fukuchi +http://megaui.net/fukuchi/works/qrencode/index.en.html + +QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other +countries. + +Reed-Solomon code encoder is written by Phil Karn, KA9Q. +Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + \ No newline at end of file diff --git a/lib/phpqrcode/VERSION b/lib/phpqrcode/VERSION new file mode 100644 index 00000000..9f99279e --- /dev/null +++ b/lib/phpqrcode/VERSION @@ -0,0 +1,2 @@ +1.1.4 +2010100721 \ No newline at end of file diff --git a/lib/phpqrcode/bindings/tcpdf/qrcode.php b/lib/phpqrcode/bindings/tcpdf/qrcode.php new file mode 100644 index 00000000..7995460b --- /dev/null +++ b/lib/phpqrcode/bindings/tcpdf/qrcode.php @@ -0,0 +1,2875 @@ + +// http://phpqrcode.sourceforge.net/ +// https://sourceforge.net/projects/phpqrcode/ +// +// The "PHP QR Code encoder" is based on +// "C libqrencode library" (ver. 3.1.1) +// License: GNU-LGPL 2.1 +// Copyright (C) 2006-2010 by Kentaro Fukuchi +// http://megaui.net/fukuchi/works/qrencode/index.en.html +// +// Reed-Solomon code encoder is written by Phil Karn, KA9Q. +// Copyright (C) 2002-2006 Phil Karn, KA9Q +// +// QR Code is registered trademark of DENSO WAVE INCORPORATED +// http://www.denso-wave.com/qrcode/index-e.html +// --------------------------------------------------------- +// +// Author: Nicola Asuni +// +// (c) Copyright 2010: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Class to create QR-code arrays for TCPDF class. + * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. + * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. + * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. + * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. + * + * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). + * Please read comments on this class source file for full copyright and license information. + * + * @package com.tecnick.tcpdf + * @abstract Class for generating QR-code array for TCPDF. + * @author Nicola Asuni + * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.002 + */ + +// definitions +if (!defined('QRCODEDEFS')) { + + /** + * Indicate that definitions for this class are set + */ + define('QRCODEDEFS', true); + + // ----------------------------------------------------- + + // Encoding modes (characters which can be encoded in QRcode) + + /** + * Encoding mode + */ + define('QR_MODE_NL', -1); + + /** + * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode. + */ + define('QR_MODE_NM', 0); + + /** + * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode. + */ + define('QR_MODE_AN', 1); + + /** + * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode. + */ + define('QR_MODE_8B', 2); + + /** + * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode. + */ + define('QR_MODE_KJ', 3); + + /** + * Encoding mode STRUCTURED (currently unsupported) + */ + define('QR_MODE_ST', 4); + + // ----------------------------------------------------- + + // Levels of error correction. + // QRcode has a function of an error correcting for miss reading that white is black. + // Error correcting is defined in 4 level as below. + + /** + * Error correction level L : About 7% or less errors can be corrected. + */ + define('QR_ECLEVEL_L', 0); + + /** + * Error correction level M : About 15% or less errors can be corrected. + */ + define('QR_ECLEVEL_M', 1); + + /** + * Error correction level Q : About 25% or less errors can be corrected. + */ + define('QR_ECLEVEL_Q', 2); + + /** + * Error correction level H : About 30% or less errors can be corrected. + */ + define('QR_ECLEVEL_H', 3); + + // ----------------------------------------------------- + + // Version. Size of QRcode is defined as version. + // Version is from 1 to 40. + // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. + // So version 40 is 177*177 matrix. + + /** + * Maximum QR Code version. + */ + define('QRSPEC_VERSION_MAX', 40); + + /** + * Maximum matrix size for maximum version (version 40 is 177*177 matrix). + */ + define('QRSPEC_WIDTH_MAX', 177); + + // ----------------------------------------------------- + + /** + * Matrix index to get width from $capacity array. + */ + define('QRCAP_WIDTH', 0); + + /** + * Matrix index to get number of words from $capacity array. + */ + define('QRCAP_WORDS', 1); + + /** + * Matrix index to get remainder from $capacity array. + */ + define('QRCAP_REMINDER', 2); + + /** + * Matrix index to get error correction level from $capacity array. + */ + define('QRCAP_EC', 3); + + // ----------------------------------------------------- + + // Structure (currently usupported) + + /** + * Number of header bits for structured mode + */ + define('STRUCTURE_HEADER_BITS', 20); + + /** + * Max number of symbols for structured mode + */ + define('MAX_STRUCTURED_SYMBOLS', 16); + + // ----------------------------------------------------- + + // Masks + + /** + * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column) + */ + define('N1', 3); + + /** + * Down point base value for case 2 mask pattern (module block of same color) + */ + define('N2', 3); + + /** + * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column) + */ + define('N3', 40); + + /** + * Down point base value for case 4 mask pattern (ration of dark modules in whole) + */ + define('N4', 10); + + // ----------------------------------------------------- + + // Optimization settings + + /** + * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code + */ + define('QR_FIND_BEST_MASK', true); + + /** + * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly + */ + define('QR_FIND_FROM_RANDOM', 2); + + /** + * when QR_FIND_BEST_MASK === false + */ + define('QR_DEFAULT_MASK', 2); + + // ----------------------------------------------------- + +} // end of definitions + +// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# + +if (!class_exists('QRcode', false)) { + + // for compaibility with PHP4 + if (!function_exists('str_split')) { + /** + * Convert a string to an array (needed for PHP4 compatibility) + * @param string $string The input string. + * @param int $split_length Maximum length of the chunk. + * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element. + */ + function str_split($string, $split_length=1) { + if ((strlen($string) > $split_length) OR (!$split_length)) { + do { + $c = strlen($string); + $parts[] = substr($string, 0, $split_length); + $string = substr($string, $split_length); + } while ($string !== false); + } else { + $parts = array($string); + } + return $parts; + } + } + + // ##################################################### + + /** + * Class to create QR-code arrays for TCPDF class. + * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. + * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. + * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. + * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. + * + * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). + * Please read comments on this class source file for full copyright and license information. + * + * @name QRcode + * @package com.tecnick.tcpdf + * @abstract Class for generating QR-code array for TCPDF. + * @author Nicola Asuni + * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.002 + */ + class QRcode { + + /** + * @var barcode array to be returned which is readable by TCPDF + * @access protected + */ + protected $barcode_array = array(); + + /** + * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix. + * @access protected + */ + protected $version = 0; + + /** + * @var Levels of error correction. See definitions for possible values. + * @access protected + */ + protected $level = QR_ECLEVEL_L; + + /** + * @var Encoding mode + * @access protected + */ + protected $hint = QR_MODE_8B; + + /** + * @var if true the input string will be converted to uppercase + * @access protected + */ + protected $casesensitive = true; + + /** + * @var structured QR code (not supported yet) + * @access protected + */ + protected $structured = 0; + + /** + * @var mask data + * @access protected + */ + protected $data; + + // FrameFiller + + /** + * @var width + * @access protected + */ + protected $width; + + /** + * @var frame + * @access protected + */ + protected $frame; + + /** + * @var X position of bit + * @access protected + */ + protected $x; + + /** + * @var Y position of bit + * @access protected + */ + protected $y; + + /** + * @var direction + * @access protected + */ + protected $dir; + + /** + * @var single bit + * @access protected + */ + protected $bit; + + // ---- QRrawcode ---- + + /** + * @var data code + * @access protected + */ + protected $datacode = array(); + + /** + * @var error correction code + * @access protected + */ + protected $ecccode = array(); + + /** + * @var blocks + * @access protected + */ + protected $blocks; + + /** + * @var Reed-Solomon blocks + * @access protected + */ + protected $rsblocks = array(); //of RSblock + + /** + * @var counter + * @access protected + */ + protected $count; + + /** + * @var data length + * @access protected + */ + protected $dataLength; + + /** + * @var error correction length + * @access protected + */ + protected $eccLength; + + /** + * @var b1 + * @access protected + */ + protected $b1; + + // ---- QRmask ---- + + /** + * @var run length + * @access protected + */ + protected $runLength = array(); + + // ---- QRsplit ---- + + /** + * @var input data string + * @access protected + */ + protected $dataStr = ''; + + /** + * @var input items + * @access protected + */ + protected $items; + + // Reed-Solomon items + + /** + * @var Reed-Solomon items + * @access protected + */ + protected $rsitems = array(); + + /** + * @var array of frames + * @access protected + */ + protected $frames = array(); + + /** + * @var alphabet-numeric convesion table + * @access protected + */ + protected $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // + ); + + /** + * @var array Table of the capacity of symbols + * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004. + * @access protected + */ + protected $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), // + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), // + array( 29, 70, 7, array( 15, 26, 36, 44)), // + array( 33, 100, 7, array( 20, 36, 52, 64)), // + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), // + array( 45, 196, 0, array( 40, 72, 108, 130)), // + array( 49, 242, 0, array( 48, 88, 132, 156)), // + array( 53, 292, 0, array( 60, 110, 160, 192)), // + array( 57, 346, 0, array( 72, 130, 192, 224)), // 10 + array( 61, 404, 0, array( 80, 150, 224, 264)), // + array( 65, 466, 0, array( 96, 176, 260, 308)), // + array( 69, 532, 0, array( 104, 198, 288, 352)), // + array( 73, 581, 3, array( 120, 216, 320, 384)), // + array( 77, 655, 3, array( 132, 240, 360, 432)), // 15 + array( 81, 733, 3, array( 144, 280, 408, 480)), // + array( 85, 815, 3, array( 168, 308, 448, 532)), // + array( 89, 901, 3, array( 180, 338, 504, 588)), // + array( 93, 991, 3, array( 196, 364, 546, 650)), // + array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20 + array(101, 1156, 4, array( 224, 442, 644, 750)), // + array(105, 1258, 4, array( 252, 476, 690, 816)), // + array(109, 1364, 4, array( 270, 504, 750, 900)), // + array(113, 1474, 4, array( 300, 560, 810, 960)), // + array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), // + array(125, 1828, 4, array( 360, 700, 1020, 1200)), // + array(129, 1921, 3, array( 390, 728, 1050, 1260)), // + array(133, 2051, 3, array( 420, 784, 1140, 1350)), // + array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), // + array(145, 2465, 3, array( 510, 924, 1350, 1620)), // + array(149, 2611, 3, array( 540, 980, 1440, 1710)), // + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), // + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), // + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), // + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), // + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), // + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40 + ); + + /** + * @var array Length indicator + * @access protected + */ + protected $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + /** + * @var array Table of the error correction code (Reed-Solomon block) + * See Table 12-16 (pp.30-36), JIS X0510:2004. + * @access protected + */ + protected $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), // + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), // + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), // + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), // + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), // + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), // + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), // + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), // + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), // + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), // + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), // + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), // + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), // + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), // + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), // + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), // + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), // + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), // + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), // + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), // + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), // + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), // + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), // + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), // + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), // + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), // + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), // + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), // + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), // + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), // + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), // + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40 + ); + + /** + * @var array Positions of alignment patterns. + * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them. + * See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + * @access protected + */ + protected $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40 + ); + + /** + * @var array Version information pattern (BCH coded). + * See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + * size: [QRSPEC_VERSION_MAX - 6] + * @access protected + */ + protected $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, // + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, // + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, // + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, // + 0x27541, 0x28c69 + ); + + /** + * @var array Format information + * @access protected + */ + protected $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), // + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), // + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), // + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) // + ); + + + // ------------------------------------------------- + // ------------------------------------------------- + + + /** + * This is the class constructor. + * Creates a QRcode object + * @param string $code code to represent using QRcode + * @param string $eclevel error level:
  • L : About 7% or less errors can be corrected.
  • M : About 15% or less errors can be corrected.
  • Q : About 25% or less errors can be corrected.
  • H : About 30% or less errors can be corrected.
+ * @access public + * @since 1.0.000 + */ + public function __construct($code, $eclevel = 'L') { + $barcode_array = array(); + if ((is_null($code)) OR ($code == '\0') OR ($code == '')) { + return false; + } + // set error correction level + $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H')); + if ($this->level === false) { + $this->level = QR_ECLEVEL_L; + } + if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) { + return false; + } + if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) { + return false; + } + $this->items = array(); + $this->encodeString($code); + $qrTab = $this->binarize($this->data); + $size = count($qrTab); + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach (str_split($line) as $char) { + $arrAdd[] = ($char=='1')?1:0; + } + $barcode_array['bcode'][] = $arrAdd; + } + $this->barcode_array = $barcode_array; + } + + /** + * Returns a barcode array which is readable by TCPDF + * @return array barcode array readable by TCPDF; + * @access public + */ + public function getBarcodeArray() { + return $this->barcode_array; + } + + /** + * Convert the frame in binary form + * @param array $frame array to binarize + * @return array frame in binary form + */ + protected function binarize($frame) { + $len = count($frame); + // the frame is square (width = height) + foreach ($frame as &$frameLine) { + for ($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + return $frame; + } + + /** + * Encode the input string to QR code + * @param string $string input string to encode + */ + protected function encodeString($string) { + $this->dataStr = $string; + if (!$this->casesensitive) { + $this->toUpper(); + } + $ret = $this->splitString(); + if ($ret < 0) { + return NULL; + } + $this->encodeMask(-1); + } + + /** + * Encode mask + * @param int $mask masking mode + */ + protected function encodeMask($mask) { + $spec = array(0, 0, 0, 0, 0); + $this->datacode = $this->getByteStream($this->items); + if (is_null($this->datacode)) { + return NULL; + } + $spec = $this->getEccSpec($this->version, $this->level, $spec); + $this->b1 = $this->rsBlockNum1($spec); + $this->dataLength = $this->rsDataLength($spec); + $this->eccLength = $this->rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = $this->rsBlockNum($spec); + $ret = $this->init($spec); + if ($ret < 0) { + return NULL; + } + $this->count = 0; + $this->width = $this->getWidth($this->version); + $this->frame = $this->newFrame($this->version); + $this->x = $this->width - 1; + $this->y = $this->width - 1; + $this->dir = -1; + $this->bit = -1; + // inteleaved data and ecc codes + for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) { + $code = $this->getCode(); + $bit = 0x80; + for ($j=0; $j<8; $j++) { + $addr = $this->getNextPosition(); + $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + // remainder bits + $j = $this->getRemainder($this->version); + for ($i=0; $i<$j; $i++) { + $addr = $this->getNextPosition(); + $this->setFrameAt($addr, 0x02); + } + // masking + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + if ($mask < 0) { + if (QR_FIND_BEST_MASK) { + $masked = $this->mask($this->width, $this->frame, $this->level); + } else { + $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level); + } + } else { + $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level); + } + if ($masked == NULL) { + return NULL; + } + $this->data = $masked; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // FrameFiller + + /** + * Set frame value at specified position + * @param array $at x,y position + * @param int $val value of the character to set + */ + protected function setFrameAt($at, $val) { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + /** + * Get frame value at specified position + * @param array $at x,y position + * @return value at specified position + */ + protected function getFrameAt($at) { + return ord($this->frame[$at['y']][$at['x']]); + } + + /** + * Return the next frame position + * @return array of x,y coordinates + */ + protected function getNextPosition() { + do { + if ($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + $x = $this->x; + $y = $this->y; + $w = $this->width; + if ($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + if ($this->dir < 0) { + if ($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if ($x == 6) { + $x--; + $y = 9; + } + } + } else { + if ($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if ($x == 6) { + $x--; + $y -= 8; + } + } + } + if (($x < 0) OR ($y < 0)) { + return NULL; + } + $this->x = $x; + $this->y = $y; + } while(ord($this->frame[$y][$x]) & 0x80); + return array('x'=>$x, 'y'=>$y); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrawcode + + /** + * Initialize code. + * @param array $spec array of ECC specification + * @return 0 in case of success, -1 in case of error + */ + protected function init($spec) { + $dl = $this->rsDataCodes1($spec); + $el = $this->rsEccCodes1($spec); + $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + $endfor = $this->rsBlockNum1($spec); + for ($i=0; $i < $endfor; ++$i) { + $ecc = array_slice($this->ecccode, $eccPos); + $this->rsblocks[$blockNo] = array(); + $this->rsblocks[$blockNo]['dataLength'] = $dl; + $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); + $this->rsblocks[$blockNo]['eccLength'] = $el; + $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); + $this->rsblocks[$blockNo]['ecc'] = $ecc; + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + if ($this->rsBlockNum2($spec) == 0) { + return 0; + } + $dl = $this->rsDataCodes2($spec); + $el = $this->rsEccCodes2($spec); + $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + if ($rs == NULL) { + return -1; + } + $endfor = $this->rsBlockNum2($spec); + for ($i=0; $i < $endfor; ++$i) { + $ecc = array_slice($this->ecccode, $eccPos); + $this->rsblocks[$blockNo] = array(); + $this->rsblocks[$blockNo]['dataLength'] = $dl; + $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); + $this->rsblocks[$blockNo]['eccLength'] = $el; + $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); + $this->rsblocks[$blockNo]['ecc'] = $ecc; + $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc); + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + return 0; + } + + /** + * Return Reed-Solomon block code. + * @return array rsblocks + */ + protected function getCode() { + if ($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if ($col >= $this->rsblocks[0]['dataLength']) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]['data'][$col]; + } elseif ($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]['ecc'][$col]; + } else { + return 0; + } + $this->count++; + return $ret; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRmask + + /** + * Write Format Information on frame and returns the number of black bits + * @param int $width frame width + * @param array $frame frame + * @param array $mask masking mode + * @param int $level error correction level + * @return int blacks + */ + protected function writeFormatInformation($width, &$frame, $mask, $level) { + $blacks = 0; + $format = $this->getFormatInfo($mask, $level); + for ($i=0; $i<8; ++$i) { + if ($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + $frame[8][$width - 1 - $i] = chr($v); + if ($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + for ($i=0; $i<7; ++$i) { + if ($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + $frame[$width - 7 + $i][8] = chr($v); + if ($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + $format = $format >> 1; + } + return $blacks; + } + + /** + * mask0 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask0($x, $y) { + return ($x + $y) & 1; + } + + /** + * mask1 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask1($x, $y) { + return ($y & 1); + } + + /** + * mask2 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask2($x, $y) { + return ($x % 3); + } + + /** + * mask3 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask3($x, $y) { + return ($x + $y) % 3; + } + + /** + * mask4 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask4($x, $y) { + return (((int)($y / 2)) + ((int)($x / 3))) & 1; + } + + /** + * mask5 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask5($x, $y) { + return (($x * $y) & 1) + ($x * $y) % 3; + } + + /** + * mask6 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask6($x, $y) { + return ((($x * $y) & 1) + ($x * $y) % 3) & 1; + } + + /** + * mask7 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask7($x, $y) { + return ((($x * $y) % 3) + (($x + $y) & 1)) & 1; + } + + /** + * Return bitmask + * @param int $maskNo mask number + * @param int $width width + * @param array $frame frame + * @return array bitmask + */ + protected function generateMaskNo($maskNo, $width, $frame) { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($y=0; $y<$width; ++$y) { + for ($x=0; $x<$width; ++$x) { + if (ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + } + } + return $bitMask; + } + + /** + * makeMaskNo + * @param int $maskNo + * @param int $width + * @param int $s + * @param int $d + * @param boolean $maskGenOnly + * @return int b + */ + protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) { + $b = 0; + $bitMask = array(); + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if ($maskGenOnly) { + return; + } + $d = $s; + for ($y=0; $y<$width; ++$y) { + for ($x=0; $x<$width; ++$x) { + if ($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + return $b; + } + + /** + * makeMask + * @param int $width + * @param array $frame + * @param int $maskNo + * @param int $level + * @return array mask + */ + protected function makeMask($width, $frame, $maskNo, $level) { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + return $masked; + } + + /** + * calcN1N3 + * @param int $length + * @return int demerit + */ + protected function calcN1N3($length) { + $demerit = 0; + for ($i=0; $i<$length; ++$i) { + if ($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if ($i & 1) { + if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if (($this->runLength[$i-2] == $fact) + AND ($this->runLength[$i-1] == $fact) + AND ($this->runLength[$i+1] == $fact) + AND ($this->runLength[$i+2] == $fact)) { + if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + /** + * evaluateSymbol + * @param int $width + * @param array $frame + * @return int demerit + */ + protected function evaluateSymbol($width, $frame) { + $head = 0; + $demerit = 0; + for ($y=0; $y<$width; ++$y) { + $head = 0; + $this->runLength[0] = 1; + $frameY = $frame[$y]; + if ($y > 0) { + $frameYM = $frame[$y-1]; + } + for ($x=0; $x<$width; ++$x) { + if (($x > 0) AND ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + if (($b22 | ($w22 ^ 1)) & 1) { + $demerit += N2; + } + } + if (($x == 0) AND (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } elseif ($x > 0) { + if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + $demerit += $this->calcN1N3($head+1); + } + for ($x=0; $x<$width; ++$x) { + $head = 0; + $this->runLength[0] = 1; + for ($y=0; $y<$width; ++$y) { + if (($y == 0) AND (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } elseif ($y > 0) { + if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + $demerit += $this->calcN1N3($head+1); + } + return $demerit; + } + + /** + * mask + * @param int $width + * @param array $frame + * @param int $level + * @return array best mask + */ + protected function mask($width, $frame, $level) { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7); + if (QR_FIND_FROM_RANDOM !== false) { + $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; ++$i) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + } + $bestMask = $frame; + foreach ($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + if ($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + return $bestMask; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRsplit + + /** + * Return true if the character at specified position is a number + * @param string $str string + * @param int $pos characted position + * @return boolean true of false + */ + protected function isdigitat($str, $pos) { + if ($pos >= strlen($str)) { + return false; + } + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + /** + * Return true if the character at specified position is an alphanumeric character + * @param string $str string + * @param int $pos characted position + * @return boolean true of false + */ + protected function isalnumat($str, $pos) { + if ($pos >= strlen($str)) { + return false; + } + return ($this->lookAnTable(ord($str[$pos])) >= 0); + } + + /** + * identifyMode + * @param int $pos + * @return int mode + */ + protected function identifyMode($pos) { + if ($pos >= strlen($this->dataStr)) { + return QR_MODE_NL; + } + $c = $this->dataStr[$pos]; + if ($this->isdigitat($this->dataStr, $pos)) { + return QR_MODE_NM; + } elseif ($this->isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } elseif ($this->hint == QR_MODE_KJ) { + if ($pos+1 < strlen($this->dataStr)) { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KJ; + } + } + } + return QR_MODE_8B; + } + + /** + * eatNum + * @return int run + */ + protected function eatNum() { + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 0; + while($this->isdigitat($this->dataStr, $p)) { + $p++; + } + $run = $p; + $mode = $this->identifyMode($p); + if ($mode == QR_MODE_8B) { + $dif = $this->estimateBitsModeNum($run) + 4 + $ln + + $this->estimateBitsMode8(1) // + 4 + l8 + - $this->estimateBitsMode8($run + 1); // - 4 - l8 + if ($dif > 0) { + return $this->eat8(); + } + } + if ($mode == QR_MODE_AN) { + $dif = $this->estimateBitsModeNum($run) + 4 + $ln + + $this->estimateBitsModeAn(1) // + 4 + la + - $this->estimateBitsModeAn($run + 1);// - 4 - la + if ($dif > 0) { + return $this->eatAn(); + } + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr)); + return $run; + } + + /** + * eatAn + * @return int run + */ + protected function eatAn() { + $la = $this->lengthIndicator(QR_MODE_AN, $this->version); + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 0; + while($this->isalnumat($this->dataStr, $p)) { + if ($this->isdigitat($this->dataStr, $p)) { + $q = $p; + while($this->isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsModeAn($p) // + 4 + la + + $this->estimateBitsModeNum($q - $p) + 4 + $ln + - $this->estimateBitsModeAn($q); // - 4 - la + if ($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + $run = $p; + if (!$this->isalnumat($this->dataStr, $p)) { + $dif = $this->estimateBitsModeAn($run) + 4 + $la + + $this->estimateBitsMode8(1) // + 4 + l8 + - $this->estimateBitsMode8($run + 1); // - 4 - l8 + if ($dif > 0) { + return $this->eat8(); + } + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr)); + return $run; + } + + /** + * eatKanji + * @return int run + */ + protected function eatKanji() { + $p = 0; + while($this->identifyMode($p) == QR_MODE_KJ) { + $p += 2; + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr)); + return $run; + } + + /** + * eat8 + * @return int run + */ + protected function eat8() { + $la = $this->lengthIndicator(QR_MODE_AN, $this->version); + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 1; + $dataStrLen = strlen($this->dataStr); + while($p < $dataStrLen) { + $mode = $this->identifyMode($p); + if ($mode == QR_MODE_KJ) { + break; + } + if ($mode == QR_MODE_NM) { + $q = $p; + while($this->isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsMode8($p) // + 4 + l8 + + $this->estimateBitsModeNum($q - $p) + 4 + $ln + - $this->estimateBitsMode8($q); // - 4 - l8 + if ($dif < 0) { + break; + } else { + $p = $q; + } + } elseif ($mode == QR_MODE_AN) { + $q = $p; + while($this->isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsMode8($p) // + 4 + l8 + + $this->estimateBitsModeAn($q - $p) + 4 + $la + - $this->estimateBitsMode8($q); // - 4 - l8 + if ($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + $run = $p; + $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr)); + return $run; + } + + /** + * splitString + */ + protected function splitString() { + while (strlen($this->dataStr) > 0) { + if ($this->dataStr == '') { + return 0; + } + $mode = $this->identifyMode(0); + switch ($mode) { + case QR_MODE_NM: { + $length = $this->eatNum(); + break; + } + case QR_MODE_AN: { + $length = $this->eatAn(); + break; + } + case QR_MODE_KJ: { + if ($hint == QR_MODE_KJ) { + $length = $this->eatKanji(); + } else { + $length = $this->eat8(); + } + break; + } + default: { + $length = $this->eat8(); + break; + } + } + if ($length == 0) { + return 0; + } + if ($length < 0) { + return -1; + } + $this->dataStr = substr($this->dataStr, $length); + } + } + + /** + * toUpper + */ + protected function toUpper() { + $stringLen = strlen($this->dataStr); + $p = 0; + while ($p < $stringLen) { + $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint); + if ($mode == QR_MODE_KJ) { + $p += 2; + } else { + if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + return $this->dataStr; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRinputItem + + /** + * newInputItem + * @param int $mode + * @param int $size + * @param array $data + * @param array $bstream + * @return array input item + */ + protected function newInputItem($mode, $size, $data, $bstream=null) { + $setData = array_slice($data, 0, $size); + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0)); + } + if (!$this->check($mode, $size, $setData)) { + return NULL; + } + $inputitem = array(); + $inputitem['mode'] = $mode; + $inputitem['size'] = $size; + $inputitem['data'] = $setData; + $inputitem['bstream'] = $bstream; + return $inputitem; + } + + /** + * encodeModeNum + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeNum($inputitem, $version) { + $words = (int)($inputitem['size'] / 3); + $inputitem['bstream'] = array(); + $val = 0x1; + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']); + for ($i=0; $i < $words; ++$i) { + $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100; + $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10; + $val += (ord($inputitem['data'][$i*3+2]) - ord('0')); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val); + } + if ($inputitem['size'] - $words * 3 == 1) { + $val = ord($inputitem['data'][$words*3]) - ord('0'); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); + } elseif (($inputitem['size'] - ($words * 3)) == 2) { + $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10; + $val += (ord($inputitem['data'][$words*3+1]) - ord('0')); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val); + } + return $inputitem; + } + + /** + * encodeModeAn + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeAn($inputitem, $version) { + $words = (int)($inputitem['size'] / 2); + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02); + $inputitem['bstream'] = $this->appendNum(v, $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']); + for ($i=0; $i < $words; ++$i) { + $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45; + $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1])); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val); + } + if ($inputitem['size'] & 1) { + $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)])); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val); + } + return $inputitem; + } + + /** + * encodeMode8 + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeMode8($inputitem, $version) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']); + for ($i=0; $i < $inputitem['size']; ++$i) { + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i])); + } + return $inputitem; + } + + /** + * encodeModeKanji + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeKanji($inputitem, $version) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2)); + for ($i=0; $i<$inputitem['size']; $i+=2) { + $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]); + if ($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val); + } + return $inputitem; + } + + /** + * encodeModeStructure + * @param array $inputitem + * @return array input item + */ + protected function encodeModeStructure($inputitem) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2])); + return $inputitem; + } + + /** + * encodeBitStream + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeBitStream($inputitem, $version) { + $inputitem['bstream'] = array(); + $words = $this->maximumWords($inputitem['mode'], $version); + if ($inputitem['size'] > $words) { + $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']); + $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words)); + $st1 = $this->encodeBitStream($st1, $version); + $st2 = $this->encodeBitStream($st2, $version); + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']); + $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']); + } else { + switch($inputitem['mode']) { + case QR_MODE_NM: { + $inputitem = $this->encodeModeNum($inputitem, $version); + break; + } + case QR_MODE_AN: { + $inputitem = $this->encodeModeAn($inputitem, $version); + break; + } + case QR_MODE_8B: { + $inputitem = $this->encodeMode8($inputitem, $version); + break; + } + case QR_MODE_KJ: { + $inputitem = $this->encodeModeKanji($inputitem, $version); + break; + } + case QR_MODE_ST: { + $inputitem = $this->encodeModeStructure($inputitem); + break; + } + default: { + break; + } + } + } + return $inputitem; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRinput + + /** + * Append data to an input object. + * The data is copied and appended to the input object. + * @param array items input items + * @param int $mode encoding mode. + * @param int $size size of data (byte). + * @param array $data array of input data. + * @return items + * + */ + protected function appendNewInputItem($items, $mode, $size, $data) { + $items[] = $this->newInputItem($mode, $size, $data); + return $items; + } + + /** + * insertStructuredAppendHeader + * @param array $items + * @param int $size + * @param int $index + * @param int $parity + * @return array items + */ + protected function insertStructuredAppendHeader($items, $size, $index, $parity) { + if ($size > MAX_STRUCTURED_SYMBOLS) { + return -1; + } + if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) { + return -1; + } + $buf = array($size, $index, $parity); + $entry = $this->newInputItem(QR_MODE_ST, 3, buf); + array_unshift($items, $entry); + return $items; + } + + /** + * calcParity + * @param array $items + * @return int parity + */ + protected function calcParity($items) { + $parity = 0; + foreach ($items as $item) { + if ($item['mode'] != QR_MODE_ST) { + for ($i=$item['size']-1; $i>=0; --$i) { + $parity ^= $item['data'][$i]; + } + } + } + return $parity; + } + + /** + * checkModeNum + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeNum($size, $data) { + for ($i=0; $i<$size; ++$i) { + if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){ + return false; + } + } + return true; + } + + /** + * estimateBitsModeNum + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeNum($size) { + $w = (int)$size / 3; + $bits = $w * 10; + switch($size - $w * 3) { + case 1: { + $bits += 4; + break; + } + case 2: { + $bits += 7; + break; + } + default: { + break; + } + } + return $bits; + } + + /** + * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19). + * @param int $c character value + * @return value + */ + protected function lookAnTable($c) { + return (($c > 127)?-1:$this->anTable[$c]); + } + + /** + * checkModeAn + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeAn($size, $data) { + for ($i=0; $i<$size; ++$i) { + if ($this->lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + return true; + } + + /** + * estimateBitsModeAn + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeAn($size) { + $w = (int)($size / 2); + $bits = $w * 11; + if ($size & 1) { + $bits += 6; + } + return $bits; + } + + /** + * estimateBitsMode8 + * @param int $size + * @return int number of bits + */ + protected function estimateBitsMode8($size) { + return $size * 8; + } + + /** + * estimateBitsModeKanji + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeKanji($size) { + return (int)(($size / 2) * 13); + } + + /** + * checkModeKanji + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeKanji($size, $data) { + if ($size & 1) { + return false; + } + for ($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) { + return false; + } + } + return true; + } + + /** + * Validate the input data. + * @param int $mode encoding mode. + * @param int $size size of data (byte). + * @param array data data to validate + * @return boolean true in case of valid data, false otherwise + */ + protected function check($mode, $size, $data) { + if ($size <= 0) { + return false; + } + switch($mode) { + case QR_MODE_NM: { + return $this->checkModeNum($size, $data); + } + case QR_MODE_AN: { + return $this->checkModeAn($size, $data); + } + case QR_MODE_KJ: { + return $this->checkModeKanji($size, $data); + } + case QR_MODE_8B: { + return true; + } + case QR_MODE_ST: { + return true; + } + default: { + break; + } + } + return false; + } + + /** + * estimateBitStreamSize + * @param array $items + * @param int $version + * @return int bits + */ + protected function estimateBitStreamSize($items, $version) { + $bits = 0; + if ($version == 0) { + $version = 1; + } + foreach ($items as $item) { + switch($item['mode']) { + case QR_MODE_NM: { + $bits = $this->estimateBitsModeNum($item['size']); + break; + } + case QR_MODE_AN: { + $bits = $this->estimateBitsModeAn($item['size']); + break; + } + case QR_MODE_8B: { + $bits = $this->estimateBitsMode8($item['size']); + break; + } + case QR_MODE_KJ: { + $bits = $this->estimateBitsModeKanji($item['size']); + break; + } + case QR_MODE_ST: { + return STRUCTURE_HEADER_BITS; + } + default: { + return 0; + } + } + $l = $this->lengthIndicator($item['mode'], $version); + $m = 1 << $l; + $num = (int)(($item['size'] + $m - 1) / $m); + $bits += $num * (4 + $l); + } + return $bits; + } + + /** + * estimateVersion + * @param array $items + * @return int version + */ + protected function estimateVersion($items) { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($items, $prev); + $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + return $version; + } + + /** + * lengthOfCode + * @param int $mode + * @param int $version + * @param int $bits + * @return int size + */ + protected function lengthOfCode($mode, $version, $bits) { + $payload = $bits - 4 - $this->lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NM: { + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if ($remain >= 7) { + $size += 2; + } elseif ($remain >= 4) { + $size += 1; + } + break; + } + case QR_MODE_AN: { + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if ($remain >= 6) { + ++$size; + } + break; + } + case QR_MODE_8B: { + $size = (int)($payload / 8); + break; + } + case QR_MODE_KJ: { + $size = (int)(($payload / 13) * 2); + break; + } + case QR_MODE_ST: { + $size = (int)($payload / 8); + break; + } + default: { + $size = 0; + break; + } + } + $maxsize = $this->maximumWords($mode, $version); + if ($size < 0) { + $size = 0; + } + if ($size > $maxsize) { + $size = $maxsize; + } + return $size; + } + + /** + * createBitStream + * @param array $items + * @return array of items and total bits + */ + protected function createBitStream($items) { + $total = 0; + foreach ($items as $key => $item) { + $items[$key] = $this->encodeBitStream($item, $this->version); + $bits = count($items[$key]['bstream']); + $total += $bits; + } + return array($items, $total); + } + + /** + * convertData + * @param array $items + * @return array items + */ + protected function convertData($items) { + $ver = $this->estimateVersion($items); + if ($ver > $this->version) { + $this->version = $ver; + } + for (;;) { + $cbs = $this->createBitStream($items); + $items = $cbs[0]; + $bits = $cbs[1]; + if ($bits < 0) { + return -1; + } + $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($ver < 0) { + return -1; + } elseif ($ver > $this->version) { + $this->version = $ver; + } else { + break; + } + } + return $items; + } + + /** + * Append Padding Bit to bitstream + * @param array $bstream + * @return array bitstream + */ + protected function appendPaddingBit($bstream) { + $bits = count($bstream); + $maxwords = $this->getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + if ($maxbits == $bits) { + return 0; + } + if ($maxbits - $bits < 5) { + return $this->appendNum($bstream, $maxbits - $bits, 0); + } + $bits += 4; + $words = (int)(($bits + 7) / 8); + $padding = array(); + $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0); + $padlen = $maxwords - $words; + if ($padlen > 0) { + $padbuf = array(); + for ($i=0; $i<$padlen; ++$i) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + $padding = $this->appendBytes($padding, $padlen, $padbuf); + } + return $this->appendBitstream($bstream, $padding); + } + + /** + * mergeBitStream + * @param array $bstream + * @return array bitstream + */ + protected function mergeBitStream($items) { + $items = $this->convertData($items); + $bstream = array(); + foreach ($items as $item) { + $bstream = $this->appendBitstream($bstream, $item['bstream']); + } + return $bstream; + } + + /** + * Returns a stream of bits. + * @param int $items + * @return array padded merged byte stream + */ + protected function getBitStream($items) { + $bstream = $this->mergeBitStream($items); + return $this->appendPaddingBit($bstream); + } + + /** + * Pack all bit streams padding bits into a byte array. + * @param int $items + * @return array padded merged byte stream + */ + protected function getByteStream($items) { + $bstream = $this->getBitStream($items); + return $this->bitstreamToByte($bstream); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRbitstream + + /** + * Return an array with zeros + * @param int $setLength array size + * @return array + */ + protected function allocate($setLength) { + return array_fill(0, $setLength, 0); + } + + /** + * Return new bitstream from number + * @param int $bits number of bits + * @param int $num number + * @return array bitstream + */ + protected function newFromNum($bits, $num) { + $bstream = $this->allocate($bits); + $mask = 1 << ($bits - 1); + for ($i=0; $i<$bits; ++$i) { + if ($num & $mask) { + $bstream[$i] = 1; + } else { + $bstream[$i] = 0; + } + $mask = $mask >> 1; + } + return $bstream; + } + + /** + * Return new bitstream from bytes + * @param int $size size + * @param array $data bytes + * @return array bitstream + */ + protected function newFromBytes($size, $data) { + $bstream = $this->allocate($size * 8); + $p=0; + for ($i=0; $i<$size; ++$i) { + $mask = 0x80; + for ($j=0; $j<8; ++$j) { + if ($data[$i] & $mask) { + $bstream[$p] = 1; + } else { + $bstream[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + return $bstream; + } + + /** + * Append one bitstream to another + * @param array $bitstream original bitstream + * @param array $append bitstream to append + * @return array bitstream + */ + protected function appendBitstream($bitstream, $append) { + if ((!is_array($append)) OR (count($append) == 0)) { + return $bitstream; + } + if (count($bitstream) == 0) { + return $append; + } + return array_values(array_merge($bitstream, $append)); + } + + /** + * Append one bitstream created from number to another + * @param array $bitstream original bitstream + * @param int $bits number of bits + * @param int $num number + * @return array bitstream + */ + protected function appendNum($bitstream, $bits, $num) { + if ($bits == 0) { + return 0; + } + $b = $this->newFromNum($bits, $num); + return $this->appendBitstream($bitstream, $b); + } + + /** + * Append one bitstream created from bytes to another + * @param array $bitstream original bitstream + * @param int $size size + * @param array $data bytes + * @return array bitstream + */ + protected function appendBytes($bitstream, $size, $data) { + if ($size == 0) { + return 0; + } + $b = $this->newFromBytes($size, $data); + return $this->appendBitstream($bitstream, $b); + } + + /** + * Convert bitstream to bytes + * @param array $bitstream original bitstream + * @return array of bytes + */ + protected function bitstreamToByte($bstream) { + $size = count($bstream); + if ($size == 0) { + return array(); + } + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + $p = 0; + for ($i=0; $i<$bytes; $i++) { + $v = 0; + for ($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $bstream[$p]; + $p++; + } + $data[$i] = $v; + } + if ($size & 7) { + $v = 0; + for ($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $bstream[$p]; + $p++; + } + $data[$bytes] = $v; + } + return $data; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRspec + + /** + * Replace a value on the array at the specified position + * @param array $srctab + * @param int $x X position + * @param int $y Y position + * @param string $repl value to replace + * @param int $replLen length of the repl string + * @return array srctab + */ + protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + return $srctab; + } + + /** + * Return maximum data code length (bytes) for the version. + * @param int $version version + * @param int $level error correction level + * @return int maximum size (bytes) + */ + protected function getDataLength($version, $level) { + return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level]; + } + + /** + * Return maximum error correction code length (bytes) for the version. + * @param int $version version + * @param int $level error correction level + * @return int ECC size (bytes) + */ + protected function getECCLength($version, $level){ + return $this->capacity[$version][QRCAP_EC][$level]; + } + + /** + * Return the width of the symbol for the version. + * @param int $version version + * @return int width + */ + protected function getWidth($version) { + return $this->capacity[$version][QRCAP_WIDTH]; + } + + /** + * Return the numer of remainder bits. + * @param int $version version + * @return int number of remainder bits + */ + protected function getRemainder($version) { + return $this->capacity[$version][QRCAP_REMINDER]; + } + + /** + * Return a version number that satisfies the input code length. + * @param int $size input code length (byte) + * @param int $level error correction level + * @return int version number + */ + protected function getMinimumVersion($size, $level) { + for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) { + $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]; + if ($words >= $size) { + return $i; + } + } + return -1; + } + + /** + * Return the size of length indicator for the mode and version. + * @param int $mode encoding mode + * @param int $version version + * @return int the size of the appropriate length indicator (bits). + */ + protected function lengthIndicator($mode, $version) { + if ($mode == QR_MODE_ST) { + return 0; + } + if ($version <= 9) { + $l = 0; + } elseif ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + return $this->lengthTableBits[$mode][$l]; + } + + /** + * Return the maximum length for the mode and version. + * @param int $mode encoding mode + * @param int $version version + * @return int the maximum length (bytes) + */ + protected function maximumWords($mode, $version) { + if ($mode == QR_MODE_ST) { + return 3; + } + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + $bits = $this->lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + if ($mode == QR_MODE_KJ) { + $words *= 2; // the number of bytes is required + } + return $words; + } + + /** + * Return an array of ECC specification. + * @param int $version version + * @param int $level error correction level + * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code} + * @return array spec + */ + protected function getEccSpec($version, $level, $spec) { + if (count($spec) < 5) { + $spec = array(0, 0, 0, 0, 0); + } + $b1 = $this->eccTable[$version][$level][0]; + $b2 = $this->eccTable[$version][$level][1]; + $data = $this->getDataLength($version, $level); + $ecc = $this->getECCLength($version, $level); + if ($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + return $spec; + } + + /** + * Put an alignment marker. + * @param array $frame frame + * @param int $width width + * @param int $ox X center coordinate of the pattern + * @param int $oy Y center coordinate of the pattern + * @return array frame + */ + protected function putAlignmentMarker($frame, $ox, $oy) { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + $yStart = $oy - 2; + $xStart = $ox - 2; + for ($y=0; $y < 5; $y++) { + $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]); + } + return $frame; + } + + /** + * Put an alignment pattern. + * @param int $version version + * @param array $fram frame + * @param int $width width + * @return array frame + */ + protected function putAlignmentPattern($version, $frame, $width) { + if ($version < 2) { + return $frame; + } + $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0]; + if ($d < 0) { + $w = 2; + } else { + $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2); + } + if ($w * $w - 3 == 1) { + $x = $this->alignmentPattern[$version][0]; + $y = $this->alignmentPattern[$version][0]; + $frame = $this->putAlignmentMarker($frame, $x, $y); + return $frame; + } + $cx = $this->alignmentPattern[$version][0]; + $wo = $w - 1; + for ($x=1; $x < $wo; ++$x) { + $frame = $this->putAlignmentMarker($frame, 6, $cx); + $frame = $this->putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + $cy = $this->alignmentPattern[$version][0]; + for ($y=0; $y < $wo; ++$y) { + $cx = $this->alignmentPattern[$version][0]; + for ($x=0; $x < $wo; ++$x) { + $frame = $this->putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + return $frame; + } + + /** + * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits. + * @param int $version version + * @return BCH encoded version information pattern + */ + protected function getVersionPattern($version) { + if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) { + return 0; + } + return $this->versionPattern[($version - 7)]; + } + + /** + * Return BCH encoded format information pattern. + * @param array $mask + * @param int $level error correction level + * @return BCH encoded format information pattern + */ + protected function getFormatInfo($mask, $level) { + if (($mask < 0) OR ($mask > 7)) { + return 0; + } + if (($level < 0) OR ($level > 3)) { + return 0; + } + return $this->formatInfo[$level][$mask]; + } + + /** + * Put a finder pattern. + * @param array $frame frame + * @param int $width width + * @param int $ox X center coordinate of the pattern + * @param int $oy Y center coordinate of the pattern + * @return array frame + */ + protected function putFinderPattern($frame, $ox, $oy) { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + for ($y=0; $y < 7; $y++) { + $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]); + } + return $frame; + } + + /** + * Return a copy of initialized frame. + * @param int $version version + * @return Array of unsigned char. + */ + protected function createFrame($version) { + $width = $this->capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + // Finder pattern + $frame = $this->putFinderPattern($frame, 0, 0); + $frame = $this->putFinderPattern($frame, $width - 7, 0); + $frame = $this->putFinderPattern($frame, 0, $width - 7); + // Separator + $yOffset = $width - 7; + for ($y=0; $y < 7; ++$y) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + ++$yOffset; + } + $setPattern = str_repeat("\xc0", 8); + $frame = $this->qrstrset($frame, 0, 7, $setPattern); + $frame = $this->qrstrset($frame, $width-8, 7, $setPattern); + $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern); + // Format info + $setPattern = str_repeat("\x84", 9); + $frame = $this->qrstrset($frame, 0, 8, $setPattern); + $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8); + $yOffset = $width - 8; + for ($y=0; $y < 8; ++$y,++$yOffset) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + // Timing pattern + $wo = $width - 15; + for ($i=1; $i < $wo; ++$i) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + // Alignment pattern + $frame = $this->putAlignmentPattern($version, $frame, $width); + // Version information + if ($version >= 7) { + $vinf = $this->getVersionPattern($version); + $v = $vinf; + for ($x=0; $x<6; ++$x) { + for ($y=0; $y<3; ++$y) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + $v = $vinf; + for ($y=0; $y<6; ++$y) { + for ($x=0; $x<3; ++$x) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + // and a little bit... + $frame[$width - 8][8] = "\x81"; + return $frame; + } + + /** + * Set new frame for the specified version. + * @param int $version version + * @return Array of unsigned char. + */ + protected function newFrame($version) { + if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) { + return NULL; + } + if (!isset($this->frames[$version])) { + $this->frames[$version] = $this->createFrame($version); + } + if (is_null($this->frames[$version])) { + return NULL; + } + return $this->frames[$version]; + } + + /** + * Return block number 0 + * @param array $spec + * @return int value + */ + protected function rsBlockNum($spec) { + return ($spec[0] + $spec[3]); + } + + /** + * Return block number 1 + * @param array $spec + * @return int value + */ + protected function rsBlockNum1($spec) { + return $spec[0]; + } + + /** + * Return data codes 1 + * @param array $spec + * @return int value + */ + protected function rsDataCodes1($spec) { + return $spec[1]; + } + + /** + * Return ecc codes 1 + * @param array $spec + * @return int value + */ + protected function rsEccCodes1($spec) { + return $spec[2]; + } + + /** + * Return block number 2 + * @param array $spec + * @return int value + */ + protected function rsBlockNum2($spec) { + return $spec[3]; + } + + /** + * Return data codes 2 + * @param array $spec + * @return int value + */ + protected function rsDataCodes2($spec) { + return $spec[4]; + } + + /** + * Return ecc codes 2 + * @param array $spec + * @return int value + */ + protected function rsEccCodes2($spec) { + return $spec[2]; + } + + /** + * Return data length + * @param array $spec + * @return int value + */ + protected function rsDataLength($spec) { + return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); + } + + /** + * Return ecc length + * @param array $spec + * @return int value + */ + protected function rsEccLength($spec) { + return ($spec[0] + $spec[3]) * $spec[2]; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrs + + /** + * Initialize a Reed-Solomon codec and add it to existing rsitems + * @param int $symsize symbol size, bits + * @param int $gfpoly Field generator polynomial coefficients + * @param int $fcr first root of RS code generator polynomial, index form + * @param int $prim primitive element to generate polynomial roots + * @param int $nroots RS code generator polynomial degree (number of roots) + * @param int $pad padding bytes at front of shortened block + * @return array Array of RS values:
  • mm = Bits per symbol;
  • nn = Symbols per block;
  • alpha_to = log lookup table array;
  • index_of = Antilog lookup table array;
  • genpoly = Generator polynomial array;
  • nroots = Number of generator;
  • roots = number of parity symbols;
  • fcr = First consecutive root, index form;
  • prim = Primitive element, index form;
  • iprim = prim-th root of 1, index form;
  • pad = Padding bytes in shortened block;
  • gfpoly
. + */ + protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { + foreach ($this->rsitems as $rs) { + if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize) + OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) { + continue; + } + return $rs; + } + $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift($this->rsitems, $rs); + return $rs; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrsItem + + /** + * modnn + * @param array RS values + * @param int $x X position + * @return int X osition + */ + protected function modnn($rs, $x) { + while ($x >= $rs['nn']) { + $x -= $rs['nn']; + $x = ($x >> $rs['mm']) + ($x & $rs['nn']); + } + return $x; + } + + /** + * Initialize a Reed-Solomon codec and returns an array of values. + * @param int $symsize symbol size, bits + * @param int $gfpoly Field generator polynomial coefficients + * @param int $fcr first root of RS code generator polynomial, index form + * @param int $prim primitive element to generate polynomial roots + * @param int $nroots RS code generator polynomial degree (number of roots) + * @param int $pad padding bytes at front of shortened block + * @return array Array of RS values:
  • mm = Bits per symbol;
  • nn = Symbols per block;
  • alpha_to = log lookup table array;
  • index_of = Antilog lookup table array;
  • genpoly = Generator polynomial array;
  • nroots = Number of generator;
  • roots = number of parity symbols;
  • fcr = First consecutive root, index form;
  • prim = Primitive element, index form;
  • iprim = prim-th root of 1, index form;
  • pad = Padding bytes in shortened block;
  • gfpoly
. + */ + protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { + // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2) + $rs = null; + // Check parameter ranges + if (($symsize < 0) OR ($symsize > 8)) { + return $rs; + } + if (($fcr < 0) OR ($fcr >= (1<<$symsize))) { + return $rs; + } + if (($prim <= 0) OR ($prim >= (1<<$symsize))) { + return $rs; + } + if (($nroots < 0) OR ($nroots >= (1<<$symsize))) { + return $rs; + } + if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) { + return $rs; + } + $rs = array(); + $rs['mm'] = $symsize; + $rs['nn'] = (1 << $symsize) - 1; + $rs['pad'] = $pad; + $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0); + $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0); + // PHP style macro replacement ;) + $NN =& $rs['nn']; + $A0 =& $NN; + // Generate Galois field lookup tables + $rs['index_of'][0] = $A0; // log(zero) = -inf + $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0 + $sr = 1; + for ($i=0; $i<$rs['nn']; ++$i) { + $rs['index_of'][$sr] = $i; + $rs['alpha_to'][$i] = $sr; + $sr <<= 1; + if ($sr & (1 << $symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs['nn']; + } + if ($sr != 1) { + // field generator polynomial is not primitive! + return NULL; + } + // Form RS code generator polynomial from its roots + $rs['genpoly'] = array_fill(0, ($nroots + 1), 0); + $rs['fcr'] = $fcr; + $rs['prim'] = $prim; + $rs['nroots'] = $nroots; + $rs['gfpoly'] = $gfpoly; + // Find prim-th root of 1, used in decoding + for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) { + ; // intentional empty-body loop! + } + $rs['iprim'] = (int)($iprim / $prim); + $rs['genpoly'][0] = 1; + + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs['genpoly'][$i+1] = 1; + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; --$j) { + if ($rs['genpoly'][$j] != 0) { + $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)]; + } else { + $rs['genpoly'][$j] = $rs['genpoly'][$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)]; + } + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; ++$i) { + $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]]; + } + return $rs; + } + + /** + * Encode a Reed-Solomon codec and returns the parity array + * @param array $rs RS values + * @param array $data data + * @param array $parity parity + * @return parity array + */ + protected function encode_rs_char($rs, $data, $parity) { + $MM =& $rs['mm']; // bits per symbol + $NN =& $rs['nn']; // the total number of symbols in a RS block + $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form + $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form + $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form + $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block + $FCR =& $rs['fcr']; // first consecutive root, index form + $PRIM =& $rs['prim']; // primitive element, index form + $IPRIM =& $rs['iprim']; // prim-th root of 1, index form + $PAD =& $rs['pad']; // the number of pad symbols in a block + $A0 =& $NN; + $parity = array_fill(0, $NROOTS, 0); + for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) { + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if ($feedback != $A0) { + // feedback term is non-zero + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback); + for ($j=1; $j < $NROOTS; ++$j) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])]; + } + } + // Shift + array_shift($parity); + if ($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + return $parity; + } + + } // end QRcode class + +} // END OF "class_exists QRcode" +?> diff --git a/lib/phpqrcode/cache/frame_1.dat b/lib/phpqrcode/cache/frame_1.dat new file mode 100644 index 00000000..be28feac --- /dev/null +++ b/lib/phpqrcode/cache/frame_1.dat @@ -0,0 +1,2 @@ +xڝÁ À E9³u`³"PńCÛ牗T!0$ +E•É²Q™Ém½úhÛ¾9{kI"› 9Ln)Ap¤åÖ¾Ë>ß^‡Õz³mënŖ;ü´mßn†ú¦Ë \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_1.png b/lib/phpqrcode/cache/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..86ce6e98d8cf7071291d5e5bb39bc3080511c8b8 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dx33?wJtG`|X@*aCb)T!Hle|NocXoPQU{GWK+F z45^rtobc!Hfq>uNnVVn7Gg`2HlysJm`1k++!4KjchA)1}^Yl3E66=VaXwbng!p`vB WU-#~W{*xdZ7(8A5T-G@yGywobm@6p& literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_10.dat b/lib/phpqrcode/cache/frame_10.dat new file mode 100644 index 0000000000000000000000000000000000000000..aff163f6882e1c842881c539160539ee97221e5b GIT binary patch literal 204 zcmV;-05ku1+U=K34ul{KMqP93Nm#TyxdGe+ZZ`bX2|6GY6RiCuCX1^|Hy)_wA3>UwXVkes{2iDcbZs(b-_ G?>v^)7G+HU literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_10.png b/lib/phpqrcode/cache/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..dbfcd70b588c9cc508d210d761ca285c962e70c7 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^mLSZ?3?#Q*6Fdf_*aCb)T!Hle|NocXoPQU{s`qqp z45^rNcH&0P1_Kcn{i)eEQ&eWabo5TEo z<(=q;l{2~SNFHOk7+K+Z++>o}0+W;js(lQ_L5J;4XHRbpJ@7EKSbjtGxs>0TanIFf yTerS?Jf(G)Wt_o(rC4{V)qPjP^(|O~A28=0dj4ToPRUb}EH+ z?=;|LU8z+!qM$&p(|BcWyT^0wyzYLMW@>oYiN^Dsz8hTJ4a-aiVeGGljlcQ?PgyF*WC@)ePT+&@l!`0?ief1~n6 zE|yl^gW5e`nKwIinOvP@sie!fPIxQBN@sPwvjzdvtR(AR7bMPLqt$5hLLY|jw(O$c@esqcjU~XWxX2%DQ}j2 Ypk>~2FWzvVWdEB3>HkBaKPQDn?w1{Br2qf` literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_12.png b/lib/phpqrcode/cache/frame_12.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba67822cdbeb547858ff6fc50cacee24a1b7d39 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^jv&m)3?#Q$MzaAawg8_HS0MfW|No^o=iddgdOckn zLn`JZC;Z`O`p;)zaHT2o|6@ssn1en08x5|_?@qWT|MUNU=7X>P-D6i`V>=dLP>_)D zgJ10T|NV^*^<88qe3j=qkQ8w3g4pi>{%_LN%!j{MZKyvjEwPU&^5g&i?aJMXS9tf# z))chnOn-VfGWh@Dzii+24R{?7GfXmbNLp7=x~^a^N0{!Mqa4YM488*Y@7T!EMuc4o**_dv29=tg%zuR9}#CwLe ZF7lm6+oM%3(p}KSMZA}4^aZ5yN}69FYBT@< literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_13.png b/lib/phpqrcode/cache/frame_13.png new file mode 100644 index 0000000000000000000000000000000000000000..6e49d35a02fdca84cbce7cbdcc4455a8f6c7a3bc GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^t{}|F3?$W@cV+=8wg8_Hkl_FS|CipJe;3GV_jGX# zshD$j(m~D!10L6U|G3>D>;fX{1#EjgrWdpJzq`==!Zpb!r-Z@r!+bgW{TFJO+!qN- zO!?Nbz~r}2caWn=<;hYT--4|xm^^H6ZOHEH)LZFp|21ezZE(M-7khSp>&l1M=G~k7 z```Ke>ZO4uStq~s?ri>iZOio6Z8x~5aew=^?BI!1D~3ap?Te2HrSt=x#Ng@b=d#Wz Gp$P!f)Kr=P literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_14.dat b/lib/phpqrcode/cache/frame_14.dat new file mode 100644 index 0000000000000000000000000000000000000000..e9ae093296aa29fab5e9902b6f08c589fb0ada98 GIT binary patch literal 227 zcmV<90382#+U=M@3dA4`MZ5Oa11^$Xy@B3DZ#HVvL77flO`r_qyJ{$pN0cm*QcbkW zOb{?`fMilEnI}OcLM9cXSrSxIB``^d*Q8K#Sp&p|blj)ly$_eQu1|D#ZtYL-`P`_v z&)r4JoKwyYFt*0oxjyAsirGHbg&iU}F_Jo|lREvc)7@EgS~DZ_@w7&yaPY@qP1;GU zPx{8yNuAV5=eW*sedFq+PER-?LOv2s0FYrKP6Y+uPUG`wUqQUsGc*0ziH*;3-ma%} dV(p*WKJj*9?cGU|IJ?7+#M);zc>`M4w|A(xa#R2S literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_14.png b/lib/phpqrcode/cache/frame_14.png new file mode 100644 index 0000000000000000000000000000000000000000..efc36c034f1a851498e5afad249adcce3d9fb04a GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^o*>M~3?#kx&YTaV*aCb)T!Hle|NocXoPQU{>hg4P z45^rNchW}Q1_K_Jxm}Srn$(yB6x19;G$JQ*YGh^#@P1G+>r7-mB7W`V*G+#Woopx# zaXH*8JW=$>j6!jp4LdeJ%jrLRbWNrUPz|e%?4;ffl``SFGrY?`?QLBi&=CD)URb+W z;hsD0-;#Cz-B}wlN7VYo-djpFrLW5Bvr5*ct<9@=upq-IF3r5?k;t7x_kgZq@O1Ta JS?83{1OWKuRWASl literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_15.dat b/lib/phpqrcode/cache/frame_15.dat new file mode 100644 index 0000000000000000000000000000000000000000..18727818d76dba4873f5993f6c9ba948ca4646af GIT binary patch literal 242 zcmV zjE0Ef4oN1(k{KEk$4bexVm9YiXdC56v{3T$rBr2ZX>#9!_g z`B^`!y7Nq9&A4060Wo%qv*Ufsu{CCYT^E&9np3604Q_DzFE?pw^~|@kYVIa#&+I*` zl@Y;Kkq??`U*qt@M8@#wp?=9QD&F@s(Gu5We?xHWW={>BMTjUwEzGB literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_15.png b/lib/phpqrcode/cache/frame_15.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f416c7cf6d12d66b42288ca30634bd231620ed GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^z97uV3?y$Jul@|A*aCb)T!Hle|NocXoPQU{n&9c; z7*a7OIpGgKW4(k#*1|KZ|Y7;q&c({geOlq6{l_|NsB~@BeOj2?=LKg_g#L z_90*X^SA8}*y`}CUV@?f(2QoEFV40{_R4EX?7Qw<^Koy}!|cERKm4zM{J-8+&^5^V zM2+FAWR7Cxrk}D0bN=>!U_F$7K!)M7p-w2XYph^ate~2LVYZ-;n}smLZ{Gt?94;j$ Q0^P>o>FVdQ&MBb@0G@4Fe*gdg literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_16.dat b/lib/phpqrcode/cache/frame_16.dat new file mode 100644 index 00000000..60af6784 --- /dev/null +++ b/lib/phpqrcode/cache/frame_16.dat @@ -0,0 +1 @@ +xÚí™A„ E]sëIX´;¸Ün6€È`‚q”êêW6ñ奚`Œ%A/3!¢°‚¢Š!g–ÈÌ¡’1N) éE¢Ï|;®—>6⸏Þ97$ëÄôëc]kköwé1Öü[·m­C͜cÊRºÄê¹>¦èµ¾šE,•hʼnp„#áxFyWÏÇVWGçòÕ3¼Õ+шþà˓úSŽâ}Ё#áG8b^c^cÏÀŽp„c&3YQ"ñŽ÷çÌvµù›…ñàÎþþ¼–¹kÞ9ŠÜ‡÷}”¹³ï×ú ¢Ä¿QäÿL—/ÝÔÀÏ \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_16.png b/lib/phpqrcode/cache/frame_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac8fe890573bd9ec52af39a315ac3ab4ea2821f GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGt3?wHw-Y5l9YymzYu0Z<#|Nl#G&c6#}b$Gfs zhE&W+PWZ#m$}S<1weXDnM;@Ma0pIRB@R(Uk#Imf`XJ1(VT~b2AdEtS^#)tMHfByex zYuj(|)!|#c1w;4Yo6V7boNcfCeZ$Lh|MkLuTKNe-qW;_ev6oobrMz06=bb#S{I8Dh zN*l`;cPanr7UAppFZhu8w7WuKxXRac9?ujuXHUG*!(qm7^gY)#$(yb3fo@{(boFyt I=akR{0Keo@^#A|> literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_17.dat b/lib/phpqrcode/cache/frame_17.dat new file mode 100644 index 0000000000000000000000000000000000000000..87f0cf593bab1049b794e2cd5af31a03aed5ae4e GIT binary patch literal 237 zcmV??y z+zk`^4Hi`JDI!!RUucn1n-C-N9Fb z^_i|y`igmlD_r3USGeLnfcpUE6|QiFD_o!A%FM(h?MeyC;;xkP+jach+JBqBM9KYfaSc^$Z&>9G^P0tbL9Kb? literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_17.png b/lib/phpqrcode/cache/frame_17.png new file mode 100644 index 0000000000000000000000000000000000000000..5b929ac736efe8f6d1985337c1177744c1269ea7 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^p&-o23?!MXtt5dITYyi9E0F&G|NqjP^X~##9iA?Z zAr*6y6aMhChD%6fCBE4#FAy~=;3R%V0whYqvPd*ASAoyV)#iDwF3O@+^;xolwc$WL45Dpax@=q3hFS3j3^ HP6ó<әÎt¦3éÌ;ïH¼#љÎt¦3ÍYœ+og©hù¶óµÙ½¬lnðûF>Øi^»#awm;gè~pÛgìNs{6z’‘»ãºïÞäp¾Ê' \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_18.png b/lib/phpqrcode/cache/frame_18.png new file mode 100644 index 0000000000000000000000000000000000000000..ee0d6a35e2e6a84e715d5eb5b4fdc9b5d2749abb GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^ks!>-3?%c9O1%M6YymzYu0Z<#|Nl#G&c6#}&Gd9} z45^rtobZRAwO&R-A}euD{dY-;n8Z2%#V16aW903$A%y{rCU=?+2?S zoD&%`Zq?5?^Z!3DPkmyQ!<_#d4AUG7+P3l-Ff2$saPI&Ek5tBsDdq+>Yyb1R)Ia|J zpWl75<3-~We~dpEEmriJ=c8wIT*8-4vt+_y-iROtCy{xt9gWtVsEV2B>-_MFQnAED a3kLr4d-pH(c*O{GB!j1`pUXO@geCyv16v^g literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_19.dat b/lib/phpqrcode/cache/frame_19.dat new file mode 100644 index 00000000..95e26adc --- /dev/null +++ b/lib/phpqrcode/cache/frame_19.dat @@ -0,0 +1,3 @@ +xÚíšA +Ä E»öÖ.ÌNo 7ћ¶iiRÚN2‹áW%ðxÁ@Úڜê'­ +u6×êˆ.*S;}˜«ÒàÏT úèÌzrt¹ï%ç,ÒÅÚâÎ}ç;“âç)¹Ÿ˜âÝZÚîLåè¹÷¬Pçç$¯×÷ÏqËgœLÂôdJ‡;Üáw¸Ãý.]z#Ÿ¾«[͝½ïOg‚­Æô"ÐË áBíî¦}Ç}‡;Üáw¸Ãî˜#1GbŽ„;Üáw¸Ãý_ÝC+w¢@Dfî÷ïç™uø2™ÅÚÉNþû9R7|pWßkïû®¿“ßßkºö¿ºú»¼ÎÓ \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_19.png b/lib/phpqrcode/cache/frame_19.png new file mode 100644 index 0000000000000000000000000000000000000000..20fddd84c87b089846e770d1f605bb2ad7f57c71 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^u^`OI3?%>V|Iq-X*aCb)T!Hle|NocXoPQU{n&#=^ z7*a9k?UaqYhYUnq&Wq-jC5YuSB#B&dnb|T?LRr=$Z_R}Tk2{2ZJNXJK?z>}STkBod zD!Ahe?+Y#-&W#RvJnw{;%)2x3`m?>pT<459AMQBAm|$4*AhL{Qjqyw_`&^NPya`bn zXJgWHCRV@tu;iM2+Sbh*zvtZi6J38hrG4+=)_Z5WUzM+1``TYoxK{mFuJ#L=ri0wm XqQq6W4|?kYUC7|+>gTe~DWM4f0svZN literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_2.dat b/lib/phpqrcode/cache/frame_2.dat new file mode 100644 index 00000000..7e42f31c --- /dev/null +++ b/lib/phpqrcode/cache/frame_2.dat @@ -0,0 +1 @@ +xÚÍ’Í À F{vë&  à&°Y+?Z1öÐSŸ'y!¢ŸÌÁa815&£•Û´ŽÙHå£Ùžc³•l«ÏFÆè1º#é6 fÊÖü©§6Äø•O7ˆ¨†C¦«›ð֏žÏ8gI®ÏöfB¦ÃÄÿæ\DÔ»( \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_2.png b/lib/phpqrcode/cache/frame_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9c150ebe3c6343f6eb7549ec855a85c65de7604d GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~;3?%=liz@&rwg8_HS0MfW|No^o=iddgTs>VJ zLn`JZC;X{zXk7U1e=Qr^_5b1%IX6fouV7|A3{)sB@vn(vQN$aEu-Zyy=Ewg(ur1JZ on5OM)8&Req;!^#!TfKm!>(UHx3vIVCg!03uy4-2eap literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_20.dat b/lib/phpqrcode/cache/frame_20.dat new file mode 100644 index 0000000000000000000000000000000000000000..d5ecc1d8a0be752c422607ca863710fb41e89f29 GIT binary patch literal 250 zcmb=p^>&so*I@;L*3I9pv5Fh-u3+BVd2h|XrM?Rygy#mlsE%yq{QN_rm3^kbraf_K zT{CJkWkNo9UY6CcnsV--^u zOJldbdLR|gckNx0zDb^tqE2c~fteS{QV^$$s-(VRP{&d+%}!k2n8hWL&;YFRNm@X@0pL0J~;%WB>pF literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_20.png b/lib/phpqrcode/cache/frame_20.png new file mode 100644 index 0000000000000000000000000000000000000000..23a061d5442e5950dc57ae4e3f754a72b18ff53a GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^i6G3#3?%=YhPDX_8iU0msvcT2m((dUcsbb;eOISnHE*Dg<1ej05g z6TelqVW*J3LxB0VBTn;T9{U-YPuzYYm+{WVu)4`tCvuk0J$+=^JinE@{pYYme)_^G zRCKb+Ysa%PrSIR~y}9%L-~0HO`-ivRxp~21a(d3@Y0=B8FU(feo3S(D-WC(-B3)aC Yhx#Rc#-1{#fi7h5boFyt=akR{0I{51asU7T literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_21.dat b/lib/phpqrcode/cache/frame_21.dat new file mode 100644 index 00000000..1974dd9d --- /dev/null +++ b/lib/phpqrcode/cache/frame_21.dat @@ -0,0 +1 @@ +xÚíšA„ E]sëIX´;¹Ün6Up‚“в™ÿ]٘þ< i-eWö‹¶˜)×äŕ¼É…H\jvqÙHL\6–šÝЅrI›¢LܹÜÕ%ÅÓ@´þ±V—vÆÂúý¤(ÏP4|ÎXnÒgɝß¼~]D¾ÉÕ×u1Us S\À°€,ÿÅ2Þ¢N§Ã?D›KºüF-:“eJ]p_À°€,˜a0Ã`†ÁÝ XÀ°`†Á ƒw,` X´]˜ˆ™‚¹‹˜°5 ‰®Y4{å±æñ2íûåvçJs†±Ûí9±˜í)õu±Û¹êÏØ,«]¸“‹Ù^_§7$ƒ_Í \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_21.png b/lib/phpqrcode/cache/frame_21.png new file mode 100644 index 0000000000000000000000000000000000000000..291598c72d21bac6548d649a4c0ae361a3f3c281 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^sUXbA3?%b5?e76nYymzYu0Z<#|Nl#G&c6#}E%0=4 z45^s&c8Ve2Ap-%H>!P`J6Rz)A#2UEl5$}@DKW0@L!ESpLCP{0HM08I+w9mQHp{3|< z#uoLvV(f=)_!nr4*yb$UIO$8w3qQFZD{qDu=PBg(==aGzoAaDygT+2UZ#}`II(`@a zTfYDFcHhw_Mf$&32ite~e#^+LRiYnGe^u zy!rp1m#1E^%JI(s6AU`tXJpwn$-ff(mztmOBd(vL_Y+&&`mg^F|356yrZelFIŸ¤Oò-Á 7Üpà 7ú$}’>É·7Üpà ·tss‰Órs §åVÍÎÜÆ÷’mýï¡Ò¹ò‡Þñ}R~7ôà&¾÷º?7ùÞýÔ¦Iïbhâ{æ»<ÀMi- \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_23.png b/lib/phpqrcode/cache/frame_23.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f16ae239dd9f4c18c18191589b0f98e896c750 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^xggBQ3?wI-)rtZswg8_HS0MfW|No^o=idcMc)B=- zRLn_E_|wl2FCmdNaYwkl!49Ruey#-t=bLuQzgozl!F}cTUb(J&bqNVPt_=cgZT~$s z{jWFp<9dnv$v=0tgvgY49MfCbML0qY4m1n4Xi4n5_TOEBC(>kZ^AY#v;4+grFO{vO z&Rv<5>-tpA?P=FPcV6u)6IiDGIq|S3riwW=Ht_4NMYDR2t#y5Bw5WhlxO>L&-&1e; Q10BcU>FVdQ&MBb@0PfXRdH?_b literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_24.dat b/lib/phpqrcode/cache/frame_24.dat new file mode 100644 index 00000000..7b92e29c --- /dev/null +++ b/lib/phpqrcode/cache/frame_24.dat @@ -0,0 +1 @@ +xÚí›Aƒ E»öÖMX0;¸ÜnVP4ÚHSS»xßU3±/O´ý LiJ4ž±Vâ JCŠ%ý‰6VR&ÃÞD‘BœHjDù‚JÏ??™¯êBl­cDZñ½§'óU­ëXïUïޏ0æÃywÍį÷j¬é똳€3ś¾ë˜cj†ù£{¨¥½:GqÄGÿÝñøŸûÚ°N†v;¹¶ç¬“J ‡ÄÐ<û‡É]ŽêëÈóˆ#Ž8âˆ#Ž8âH'§“ÓÉùÍÁGqÄGéätr:9Ï#Ž8âˆ#Ž8âؓh­ˆ¯NÔt”Œ´Ö_ÝØ>t¹eëìS­¯¦æžù^\g¯õÎQe?ùvuöÌoïÕ;ˆï>ìˆ*ïwlò×mÑ \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_24.png b/lib/phpqrcode/cache/frame_24.png new file mode 100644 index 0000000000000000000000000000000000000000..397c64f8533159fe3c792420d93cab3ec64c673c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^g&@qx3?y%CxHlO{u?6^qxB}__|Nk$&IsYz@wcOLi zF{EP7+o>CQ4;cu!o)=Bt;3dWH(5PX|Xd0Tbewt9=(giM&ioPz%uZwq_{AtYK_=L;b z-~axk|Ds~-#=Rctl_DS6E<4m{++hxOxW(*z(!L?xL2jbS`@Xaf{qGdGWmpvR5thb97@%;4$j=d#Wzp$Pzhc4tul literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_25.dat b/lib/phpqrcode/cache/frame_25.dat new file mode 100644 index 00000000..ba125182 --- /dev/null +++ b/lib/phpqrcode/cache/frame_25.dat @@ -0,0 +1,3 @@ +xÚíÛA +à …á¬s낋™]rƒx½Y51mMÈBG +ÿ¸*Sx|Ua5Ƶ‚Z—Š„-,Ž1ä²HÑPÒRj–šX5§®i†©’áG©>W¥ŽžRïöÕ/Ëâ+uT廯å Ïӯ嗴ªuæÏ¥Ú[Sía£[kví÷5•+5n§Á´JêÜ%+V¬X±bŊõ߬u'Á±þÔû SRýå÷štzZ»ì+÷+V¬X±bŊ•ÙŸÙŸÙŸûŠ+V¬X±bÅÊìÏìÏìÏ}Ŋ+V¬X±ö±ª¤¥ÖVI©¢ÖÖ‘+k«qÿ[úËtŽ·oVZÍþvoNV³wÇ}µ{³r<ýR­Þ"RÍÞ]ê W«r} \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_25.png b/lib/phpqrcode/cache/frame_25.png new file mode 100644 index 0000000000000000000000000000000000000000..25bc4454afbe21949bfd01d1a8bbab713486ae65 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^r6A163?#iy+587mYymzYu0Z<#|Nl#G&c6#}E%$VB z45^s&cB&%ZAqN51|5`cu2Qt4gsF-;4Ir?6nTp+=+Nr<&Ydrf9n!e{G{vpig`o@IAV zpT3{+yxVcXEa?kbazcxq6{lLB{}VM?`;*JP)#Y~fCz=^ŸÎí>ûmۚ·?ª•vô¹¾mg?ßÒ±Îþ³æηªd˜“Cµ¹U¦ÏIk•ÚÚE\ÕÙMs†f˜a†f˜a>œ[sӈ9쬩ެ8böËî”]ßöLgÉÝÁ›³è¾äEo‚ w1 \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_26.png b/lib/phpqrcode/cache/frame_26.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a6b393861525908d76f29c6d8a3bfc2ba4f747 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^l_1Q>3?$V}WIz&Z0X`wFK>Gjx|4VPqzYAoo^mK6y zshE?T@TZ^UpG-o+3Rkfo(&rC6=+gP1FW~!t-{pbx-~a#LB)q!sxL;FM;QZsxnjpG@X|Wc^3Whe7pc$LY4HynfX%(+id5E{n0v40R%_lqrDMPR_=K#Nbs1J=Z*FW%KHev5UH0bx zvhP3A?5`T{eKs|C?=(67e>XRlv;V$O{Jat(4^}wWvJV8GgET;O7Rx~3dn=g8x81kq zTBsYH(o>B~k(w6wdiUP<-~a4d_f^K|^b>jOg|*Ku{@y(>H?~&4sQTS6>xH+g>q>Tg S)BB(oTgzV+tiQ0S`YHfvkCqVt literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_27.png b/lib/phpqrcode/cache/frame_27.png new file mode 100644 index 0000000000000000000000000000000000000000..8419ec2301e8c0278f9f86d97417d51d3df000bb GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^wIIyM3?#Su{YwKY3Z=Ttv zWf2y7&zVY?&I!gH*lL(C<3L-FqWk?PvhJVcioOWu?Vls-VEE&Jg0;|sb157vj!F0I zoFJt8?3CA*9ZT0UM?PxZcc8vtF);OXk;vd$@?2>|KWW^(`l literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_28.dat b/lib/phpqrcode/cache/frame_28.dat new file mode 100644 index 0000000000000000000000000000000000000000..8cbaa1961bed61c3d774192448857480eb49762f GIT binary patch literal 318 zcmb=p^>&UUU$cUMYi#vvHNCX5BIcc(ch)S(P&rt#xF_>o`BhIHdwqxJ`pXR0ab3O; zyhvzU>thM$uzdDevN_u7>@yw8*(S-Z(T=tZ`1|rey6L^W%k_%NF5F|Ui=6h%{9e%d zZ;qDSdF$l&FG(-^99&vHr#0ZpbjM5kK3J?R3cg=E!9=w8_VG%C;KB!IWDhW~88k5R zBz#a~TYLY*^54yi?c%-~`hWLu-)r%Km;K+Pv$J34CnoIU-@%{2z$^h(euDc6>nEnl zMr%QcZlKHrafo2K5)VwFf<8p>oeNCgzsZd&I##GMUwz`}E2+Yy_3mfghfV%>+;#2K w_7?4#@$=nu@tm|;Z8o*f=bqOl7=Ny{aÌυãþñŽÄRõ-r­“÷n.ïꯋ\®T¿ü:Ó*)|)°À ,°À ,þÑâêóåéx_ã¬}:^R„ƒUoÉ¢‰uÁ~ÁމX`XЏЏЏЏ°_`X`XЏЏЏ°_`X`XЏЏЏЏ°wbX`¿¥PUõö)DÔÞ"cÈ{‹zçÎõ3ê›é<}¸ó¡^?b÷mÿÎÂìžƒíº°»óaûŽ´’Âê.] +³{Q6uáT,9 \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_29.png b/lib/phpqrcode/cache/frame_29.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe072c868268ea77f05f71c17088021d549090d GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^tsuP;BJn$?U}wS}0TXykDcgTe~DWM4fn*mjQ literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_3.dat b/lib/phpqrcode/cache/frame_3.dat new file mode 100644 index 00000000..188d531c --- /dev/null +++ b/lib/phpqrcode/cache/frame_3.dat @@ -0,0 +1 @@ +xÚí“Á À E{vë&  à&°Y+¢b¤öÐkŸ'yù‘¤¿ÌÁa :äÀTXlÞ¶$W+ӏvû®îœ¢9}gRæ¬@H0YPB½ÆÃEmÚÚ?ûœÍ±ísœÖ"bµìt2cnÖé†É:½ﺭë;¿Y§“ÃzÿQã«7¿Ô \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_3.png b/lib/phpqrcode/cache/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..945ee7cb993022c3ba0081cdd6b833b92395b30c GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^vLMXJ3?y@6zxn_vwg8_HS0MfW|No^o=iddgJUm?- zLn`JZC;a)}-nj7F|NHzr>;C`eQV>iqJa$2VtqrL1f5H!Lr4wnjD-wRh|KHox`0@XB rt_3F@rfGYe5mn(<%W`B5%F}Pb9F^HI>YU!D_xBYq^}BRWJ#p5u$@O~+U60g$ z^ZZ%%C&E6_>--Dp^Lw@H{+B%qvQk^Qjp5k3r)$sId8T^L{8KD*Wwpx3yDA4+gnbMS zvP`Zw$-FB!Z`b@c+Rxs&eZ4X_H(t}zN!in)_Pe(B-kBwv{Vn`0k`1A%fm#-_F9E_Q zHV6?QtI7cc&w)*Z5ts^pmI@a>n)4-LQd5VAxSF@+|0}%z9_8)t4X9Z8-TGsS+L_O` o3*N2iKjl*T?_}Zp7w1|m>#S{6FV2w-Q4O5Cykv#>|8j$;0GhIr$^ZZW literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_30.png b/lib/phpqrcode/cache/frame_30.png new file mode 100644 index 0000000000000000000000000000000000000000..75dbddd2416814ef91b71363c859c3dbe86f0802 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^ogmD}3?!9ab#?(Mwg8_HS0MfW|No^o=iddgws^WY zhE&XXJ8dKHAp-$deb!SFYn&!CY6Q4UH4Jk7sONJ?V2XzJ1%+7_{OTQ#YUCIa<5O*I z@1FcVdoow(KLw+VEhS36DYCp#b}QPnZQP#yZF5>L_wIw#N8!&ZL32x5J2SZFRNT#W zJ+d{@@YEHq?4aMP=C-7+TKmm!p0e&81)Cc7+)G|xes$W5z3%q9Wf`gZcFvkf-|8dM zyYVæ«·ù§:ñÒÒÄAš8üý-+mTíÎÎbl°Ál°ÁlèštMº&]“³l°Ál°Áº&]“®I×ä¼Ál°Ál°Áº&]“®Éyƒ 6Ø`ƒ 6Ø`ƒÍÝi¬uy´ØXWòè±Éi¬²\t†ýz•—Š>•.î”z¾kÊß t²¿7©ß7òwJõϔ¶4Òw‘ÒˆßÓÖÍ85‰ \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_31.png b/lib/phpqrcode/cache/frame_31.png new file mode 100644 index 0000000000000000000000000000000000000000..b14d1fa267f229a5b21beb06401aaea3c7ee4673 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^y&%lU3?w&9$bJT-*aCb)T!Hle|NocXoPQU{+Ue=y z7*a9k?X-=&hYSQ<^+j{d5~R!+0*%=60@{+AM5auc(!n|5PK2l6>q3RVA30i5E;U78 zzm!b-J6oUkrH>MO^Sih(w%FVJC(3=iBOLgbf7_Y;qQm^gYNmAkvubmKsBNb!r<>aC-Pn**9g*ߚ?aÊOƒ¿k±L_£<[c—ñ¶ï>Êc˘õuÔLIäÕ%Â#Œ0Â#Œ0Â#ŒÞotÑ¢šõµ}ÅÜ4Ífv_)‰ÂE¢pú¬h5R·88³1Â#Œ0Â#Œ0¢ÓÒié´tZÎ#Œ0Â#Œ0Â#Œ0¢ÓÒié´tZÎ#Œ0Â#Œ0Â#Œ0¢ÓÒié´tZÎlŒ0Â#Œ0£÷9q"¢ÉHܜH™Qþµï"ÛÕL5}-ÝÜY×¾Óê¸kì`¤â>¶z鸳®þÖ4&Òp÷á!‘Šû!«ù`¿:5 \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_32.png b/lib/phpqrcode/cache/frame_32.png new file mode 100644 index 0000000000000000000000000000000000000000..58d42db3c5b755228c7565cdf8128438559cfe1b GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^6G51f8A$#VJCOjS*aCb)T!Hle|NocXoPQU{+U@D$ z7*a9k?X-=&hYSQ<^`{N~#na9iwuURu!V?k}}KG;`at7keZ6HBO!j zPFw%CYT8codjH_FpLqjK{?_pC(kM^0-qBFEG_3wrT<*O&_g>F?-&noh_CE9X8vcLx zZ-?L5c<5S4(d*MS%jL4aFL*KcmFQoSBb$x~rEe4WKl3d;RlhCaH-pl}T98i}JYD@< J);T3K0RZV1Z(9HW literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_33.dat b/lib/phpqrcode/cache/frame_33.dat new file mode 100644 index 00000000..a2613755 --- /dev/null +++ b/lib/phpqrcode/cache/frame_33.dat @@ -0,0 +1,14 @@ +xÚíÜAƒ …a×Þº‰‹™Ü@n7+*L++Ó柮óò‰ÌbbÜ*LCï‘°‡‰c k™H¥rš”j•²J5Yíi~0•_«òŒû×TÊTõ}å—e©>ýö5‘b_åwÐ͟?¿¤ßìæ§ÖÜù†\ý­RaÆi+7õßW©¦\ãþwLUNåL¦Â ++¬°Â ++¬°Âêÿ­jßÒO·ŸkcëÞñôç\Ë©|%•o<á‹k–­Lî+Î+Îv¬°Â ++¬°Â ++¬°ÂŠ>}ú ô8¯°Â ++¬°Â ++¬°Â ++ú ôè3Ðgà¼Â ++¬°Â ++¬°Â ++¬è3Ðg Ï@Ÿó ++¬°Â ++¬°Â ++¬°:R‰¨ªX³ÚB‰9«”IÔ=çkޏ±o/Swçؘ™Ù¯Ï`g¶áÅÊÌÈr_ٙ™Y¾ƒVSY™ÅzIefnmQoz >á \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_33.png b/lib/phpqrcode/cache/frame_33.png new file mode 100644 index 0000000000000000000000000000000000000000..924c728e0aa0b3c22b7537d833d53f072a923640 GIT binary patch literal 253 zcmV7LUZoG!D=_b+G>~XohCiGYUA3?`$qlQw=oFH)|?GM%W=ZP z?o-WP`{JCI-1j+kVd;lds9Q_l#)_e*e%!H*n2YxP(|eQ4yd?KKF7uLH<|VmLxpSZ$ z1MOt{Gd*JG7)eOIdQ#d>d~xt^_>>*JiBA`^i7E%w2i00000NkvXXu0mjf DAwYG& literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_34.dat b/lib/phpqrcode/cache/frame_34.dat new file mode 100644 index 0000000000000000000000000000000000000000..7ceb0259d4a6f14ad6d9e5d76eb87c07b034c711 GIT binary patch literal 331 zcmb=p_4bZoU$cP#>xCNzb)OE=JWTSu!=w6LqU*^gyy-W?Z;@;Fg>L`1=l-EkZ?iVvV?C0_X=i2_ zCW9G)ljhbgx7l(nwvgX`%e6^Q_5bh5(A^bzqxMK4)(Kt#i%i{@a^9b964fc@euQ;PW=~uiO$9&bgnPb zQZeW4^o^WMjsmX#U8f~jtBEBjv`tG?seT)Aq*3=qXXlI+_hnO3Z`!AqXdKG<^zh@1 z$2a89EJ`kxb5FQ`=(boyS7nhxxW0w*`IRj*&5GUQE?a*(lXrI>tApXq$M?>eXvpg? zJ7Dnt${M{rF8!;dRI6f&a!y#e`IJAq{!imf{LG6>4VD`%_D=Lmb(?#S3j3^P65% literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_35.dat b/lib/phpqrcode/cache/frame_35.dat new file mode 100644 index 0000000000000000000000000000000000000000..56bc3e28ee83b24767b00391773560ca842f0b44 GIT binary patch literal 342 zcmb=p_4e+@yk-Lt)(dC;l&Z2-bJsJ}Gu4L)&k?(_Yz24S#B<8tYk0!l*-FIIBjt?0 zZ`YVyJa2n|_x3Zdk9bXgHfz^qygTh2XweY|A-_q!&2k4t`5 zdHt-uf3>=7$NxRcHpcK?YhPbowodr?x--Th*X`3@Jbts=sCI7N@2dT+b7tjn%l`^M?L^?B>}TrgGEWxv+gtv>&1 z^SpAXK9B(~H-km1?tx8$7`Ys%2q^kG_8{C6zxh|wzed(x`wSQ9yIX(x>6}yP9JAN? zaAi*~^7>i6``g|}l``+#Pxx*7Q>a$?+fMp@&Wq;Q9mQL}|JJ)V^U3dOv#MPg=?~>E Qwf>fGyj#QM-^sTe06Gf6oB#j- literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_35.png b/lib/phpqrcode/cache/frame_35.png new file mode 100644 index 0000000000000000000000000000000000000000..d29806c6037dea38b05d8211a0a45c2e0c1ff1d0 GIT binary patch literal 243 zcmV69g+8T9FaOlD5lXr@5A{4g21 z`3F-KR1%=7ED2boeU%@kIrD;Vui5n8>omRhI!*7rPSbn8llib6 tcmDZ{$vZ*}#x^0hn~*mYfxOG)^abWznpY06{Y3x(002ovPDHLkV1fp`ZrcC= literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_36.dat b/lib/phpqrcode/cache/frame_36.dat new file mode 100644 index 0000000000000000000000000000000000000000..282c60d23bca6a7c3ac2c3da0744992f3415d8d0 GIT binary patch literal 370 zcmb=p_4ck~UbBG!>xDHtOI5|b@#Qg?H_pDw$;Z^XB}m*L@cxD_oki=_lM}=$=E<9G z-R?29c-FLpVq^dBT+!v^g&NTH_@wd)yXEcGyBzK-j`OqvsA7=ytvYW@9>9b z_WqKQLf0xI)<4~MTkdf{-#UAXb5bv_XIHKgJ-y+Ial~c2Rr$$h4+rJ0P5XKC?x8T> z8}0rlCMY_$@kss?KYU%i=k@&DYZIUS(0u#r`Qg$fYBKRcefj5YDxU=N96s;-dSNve zNU2c@M9){5FJQQ)9U&%Zbfx$L7;cb*sRL;UIPVCC2diGpI|Q*2B5lhKfv>@?fNH7t zol$&B)74DpqnE3hkLL7O>+2T(ei-}yr{??h8{VJ({BR!k#40|+{iXYjd3MGhD3d#O cr#P`%x8CVcM|J%hp|(5rsloS;^$2?d0KeI-=l}o! literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_36.png b/lib/phpqrcode/cache/frame_36.png new file mode 100644 index 0000000000000000000000000000000000000000..96ecb421354bec386b535fe1e2cf4fd753142013 GIT binary patch literal 272 zcmV+r0q_2aP)#C@Z9i(!~1M zrir*qV+k70-90^>68kqFj-O|}12;kA2%H6FtI=5KdLSEeASYjjHt&ri*^^Il@nz@$ zcM<0VP`V6=a&MyY!``k&|IeMgxU(i;@#22_fZ4~6ypj)cPBagDuD;9QQOl0fagwX_p(bdJihERcvP@-vOY{Y; W&Oa>B-?9<_0000W;+CoZ{7==byZrmTWaR#jx=*j}d9!=n z?jLue-7XczO-tXCTNhVr9_xF%CU42z`5zaC*qmOutsr!7Nc8d9(}S-rUG+8hGgqu? z>hF#zI+2@FPEJzwo~AQDvGQO3&(Hs_exLZN>iNf?wdd`Eg1#-+{C#?NzFg&`r^?Tk ze!Y~>4^#=)^407M7_OO)5CclC+`bSD6Zb-m25VS)uMGyjf-Qs@QzZ?7*Sz=JBAN4V zs?k%Ey^Est6oX4n+Z;cW+cNi&e)WmBGn&?4`2F$Yr!zA>_V(^buig{cW~=_xLjUnR b%i@}2^Cua-iuB0WJUmakbVYvd1M%+wXsyHf literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_37.png b/lib/phpqrcode/cache/frame_37.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc51627d75b1195d79e915e5ba5a26accff30b6 GIT binary patch literal 279 zcmV+y0qFjTP)Q+l9uWqZrGW15EmmL1Za)FnMD)vS~08#pCh dPbukz=wHCg@a-IQ|2+Tz002ovPDHLkV1gG4c{u<8 literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_38.dat b/lib/phpqrcode/cache/frame_38.dat new file mode 100644 index 00000000..71cf53eb --- /dev/null +++ b/lib/phpqrcode/cache/frame_38.dat @@ -0,0 +1 @@ +xÚíÝAªƒ0ЎÝuÁA2«;НèÎkü(üg¾Ày•tp9Äï$Ëò™¹Dœ”ò¼\ºe^'tÒ-aIºŠFMšSškÂðIóŤÓ:7®¤|LúkŸNã8N7®œöi}ö‡×Ÿi,Ÿ[W†¿g®Ó´Ì°ë?3ô1÷i™¾N·}}=ÂOM:4“”)S¦L™2eʔ)S¦L#$½ÿ ôÂJã­þÂJM:}ý]˜•ÖL›Ù§ÎSÿQL™2eʔ)S¦L™2Õ¡èPt(:Šó”)S¦L™2eʔ)S¦:ŠE‡¢Cqž2eʔ)S¦L™2eʔ©E‡¢CÑ¡8O™2eʔ)S¦L™2eÊT‡¢CÑ¡èPœ§L™2eʔ)S¦L™2ݓ¦”sJCIKÖԂiÍ93ônº_Ñò ÿ¾¿ü¼“+R‡û®£“ièû£Žû4ö\Çg¿¥¤‘ïŽ;% }ßaÞnŽ£ \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_38.png b/lib/phpqrcode/cache/frame_38.png new file mode 100644 index 0000000000000000000000000000000000000000..89238f3c5bd6d3fa6aea44d2037dfd3bc0a34723 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^D?yl%8AxVH_vZj9wg8_HS0MfW|No^o=iddg&Um^w zhE&XXJKd1$kb{7$dT5{Gy(7n%mk6AeQJ$Kzej0N`L_}BkhKVNY?%zz+J@k*Y+f^`a z^_k}%XBzDPc}byOdLr}0>WR7QehE+CtzjSL!0mG&m*?>2?tA~Zcn+}6IBv0`eDmq~ zc}z}+JJ0WJ_POR~GP(Dkvz2Uh;m>QHUB{HvnxDHtOI5|b@#Qg?H_jFnQdbgP@~WvsW^bbC&dz=Fbh`ibKL2SI zT-|A9x%8!2QQou6xhFC&&-ym4$aD9pW82OKdqz6mnsRx4=J8U#egE%mowI%0@84xI zZ4W<8zrSnRI_rgRZWpP2x%=6e@AT!byU*{w{_FTmgQ=a_yU*CBT#j3w|M=bQ)LTYp z-zJx@O!B(5Z`GEZo10QkPt%RwHa}ta_dLm$f4^*>CH-=s6v(7v&e*fR{ ztx~zGZ*4yp{T!$et^>&Eoe;)fc50TK5C1au;(Jh&pbBm$WPVLpzUJk@F9}r!=o)#a zk*D#WWv<`r;O<;6&F5D_CzowJTRZ36gVgy2`}e(i{XD+qP1dt!Yu@B<2_N6LRd3?0 je}Av+{;~a+3#!$wOf&lxJI6os@crUlGxJ^MEBXTf`CjAm literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_39.png b/lib/phpqrcode/cache/frame_39.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc9cd1bc53a2e27ad5b61791c7a76cdab408123 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^YeATi8A$#}%mtDRYymzYu0Z<#|Nl#G&c6#}?e%nV z45^s&cKSvxCPM)i^QmwDPN{$JaQO_kPo;GYt#kKIo$zc&c3+{t4%5trR)KEM%_$W+ zC*PSQGk)DUdv52RwA;cz%>sV@oL27Om%5WD`n|Bh@=ZQB4@JyxmgML?8g}V+>Zb|( zXHzc5U$%Rcbzopr09yKW761SM literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_4.dat b/lib/phpqrcode/cache/frame_4.dat new file mode 100644 index 00000000..67b30e82 --- /dev/null +++ b/lib/phpqrcode/cache/frame_4.dat @@ -0,0 +1 @@ +xÚí”Á À E=»uÐ pجQ•ØCOMŸ'Ãˏ$ ³@à¨Ø3e–F©\FNXRyÉؾC{‰a8­Ræ Ńa2@ñ圉qküßÉH1ê(£ˆÅ`cç¦j³~Ë0ö¥¿ÃܨÖËÃعnXÿGåÿÄ€ \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_4.png b/lib/phpqrcode/cache/frame_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b72f9e70d374741d1d4ec4537b7a379088325669 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^iXhC$3?y^40(5{BTYyi9E0F&G|NqjP^X~##UY;(F zAr*6y6aM`F&%o^b_W%Fyk`gih|L^bcaylaE>?|uG@sHV&`Ea~}XRw*|gxLT4_cSuT v*!F>Kf^¦ÀÚôã°<]ßÕÐëß³bZ«nã¥^A›öQ}[÷9^ª]«yþìnajM܇K̘1cƌ3f̘1ã¸Æ{ßW5}ç½{ÍÑ7lMßÒïޚxÜI<¼áK½¨Æáαyl3f̘1cƌ3f̘1ã«Û»Ù»={·“αyl3f̘1cƌ3f̘1ã«Û»Ù»={·“αyl3f̘1cƌ3f̘1ã«Û»Ù»={·“αyl3f̘1cƌ3f̘1ã«Û»Ù»={·“αyl3f̘1cƌ3f̘ñ÷çœSʑŒÓ’7¥HÆKÞ¼g\ç¾âuõßÏ_ÿªr'4Ü[çÞ-Æ]›…qˆûL·ç8Ɲ±ÛY1q„»‹Ä!î—ÞÔ/(%û \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_40.png b/lib/phpqrcode/cache/frame_40.png new file mode 100644 index 0000000000000000000000000000000000000000..8034d862d60aed55180914d323aa4557f39c036f GIT binary patch literal 267 zcmV+m0rdWfP)xUy&%?@Zqe$Lt^IHF*f5Ycy_0y589U#OP zDOgy2<>WYTpYrhA^tGLJe{+Ghzs|!@a34iK>1DI|zE}TO_YMEQ{K#kcE&Gwr@LTpH zpW(OcM?S;hKGje=R>w-jeWqvU%KmI=|;a=Y2bm$Ju*=arXY8`~`*2(t2@u R+XVms002ovPDHLkV1jNhe*XXf literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_5.dat b/lib/phpqrcode/cache/frame_5.dat new file mode 100644 index 00000000..d5dafe18 --- /dev/null +++ b/lib/phpqrcode/cache/frame_5.dat @@ -0,0 +1 @@ +xÚí”1À E½u 7ЛÀÍZµ‡|N†—üD B0@R$l,-™>VKZ[<ýØÚz—qƎ¨ØYJ&ƒi嚂‹ZyË:Y'ë¯YµÁVÿ&—e•RÄ"§sj©Ýrþö+Ëé‰ù.·MƎ»–Ó9ÓòzµsŽ”É, \ No newline at end of file diff --git a/lib/phpqrcode/cache/frame_5.png b/lib/phpqrcode/cache/frame_5.png new file mode 100644 index 0000000000000000000000000000000000000000..96b6494f35ba71741f72bc32599a359f5ff9798e GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^svykB3?%;tY;pinYymzYt|0FJ|4VPqzYAn}d%8G= zRLn_E`1AiiKeO}O|Nral4R$bjGKvT(os*D~I&|QJJV%|uAJ)mthyDc|{ILJu|LIo+o1yT37=P9COrj~W-G?9JF6VLpcd literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_6.png b/lib/phpqrcode/cache/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..05ca358b0ebc0c3a0b76df7bc0411af2d596f586 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^njp-`3?wJ5o3s^3u?6^qxB}__|Nk$&IsYz@<>Tq% z7*a7OIpGgbjFGJ^N}+Uq<3Ul6SeNAsih33jb6-tP*oFY|>b2SQ8z)uR?vtd#dj@Cr|apornv1)El=m yfE)D&wC=s-ob2oKGnB!6a?|8|>$jotR__k)Tfb?1CbP75iyKQ(;+|ur1|Lo4=9^M0XYLiuS90INiM|3P! zl1w_Dw_=lP*>oFG#pgDRUYDi$t)1S^DCLO~UG_j|*#gebx3BZ+nH+yL4#Xe`MZ5Oaleo}by@B3DZ#Iau!Ks7Twck}KFFz0sl!D6kkmQ`t zEwPxAt7e4vK(tICs>9R+3CvUzZbGE0t`1I&>PRt0PIx4!4(e4n`AHE@7YTQ-GD-FT zU5Un`f|ct4S(0g==b;u6VVT$-+hayNZ>kV6cem$hSdySrt`hAq)&LF)(-K_0ARP&tIq1zdFuig-v-KQf|`xVm{I3hDX Dr=(<@ literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_8.png b/lib/phpqrcode/cache/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..db1f1877ab3aa0f221156a6c8ab461cf548b7c22 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^h9Jzy3?w~+F2@5Ywg8_HS0MfW|No^o=iddg8a-Vc zLn`KMov@L&*+9hQeCRTV$kt=bOB^&Mo4IaE8~7hfU-_hp z>GjwD9k;ZU{x$DC`?c>k>SwyYUwnVQ%-n^a7#d|n|4z96z#8Zn22WQ%mvv4FO#qqh BQ^o)Q literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_9.dat b/lib/phpqrcode/cache/frame_9.dat new file mode 100644 index 0000000000000000000000000000000000000000..d79295ee0f93bf3b101c220b436cc0d302b3dd72 GIT binary patch literal 206 zcmV;<05Sh~+U=G>4ul{KMO}02Nm#TyxdGe+ZZ;LFff1oFD-%8|o4)*%Sp6YHdA;?7 z06sMb75pI)g+!%pq7Eks1(Ax~0~7*wDR<~T*G1Lma@N`!#dGl;n!P;E()p>G>kd7u z??pPBm5wsHKNm@}RC?UEAu(m9sO7c1-s)A`rDjb%?QOHhl&f?!YX5jm&9&Z*<@HW4 z${vU~>O~9yjCv75*xjqWU*~WAGqlU$A+xo=8}e*Zc!_gVK9@YR<##wsNwa7{iF0qJ IFSFt|>Yb-#$p8QV literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/frame_9.png b/lib/phpqrcode/cache/frame_9.png new file mode 100644 index 0000000000000000000000000000000000000000..74ddf08da2f671de67f1fed645afe705662e8424 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^rXbA73?y%B7#ag9wg8_HS0MfW|No^o=iddgYCK&W zLn`L%ov@L!AwagA1{7>@m-%iy`qAdx51;UBica)=ne)?S3j3^P6=xt5c>OY+~gW)7igeMcUJuTaR$o&p-O;5+hmJG|D H^z#4!b%aZc literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_0/mask_105_0.dat b/lib/phpqrcode/cache/mask_0/mask_105_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..97e9e5dfff667572d9451add45a3a5e05c157625 GIT binary patch literal 162 zcmb=p_4bw{SAzlr%YohNFaEDz7aTYx-~rdw7iUi!E!oMQ9qZ10=B~!Y1!Xh8FbC`Z zyZK8u`25eDzn4VhGJ|J-om&>Dy5;$~&1-gk)KCM0Wh*o*?Q>r*t&Z>8Q#|w7j5+Ec zQ8l$%fAdS<5uE#%zyDF50RnO9r|hm-%}`_g>f0!1_?Y+V!H}75vy!UUpR@9hH`4Vh H(~brJDN;^O literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_0/mask_109_0.dat b/lib/phpqrcode/cache/mask_0/mask_109_0.dat new file mode 100644 index 00000000..eadf83a2 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_109_0.dat @@ -0,0 +1,2 @@ +xÚíÚ= +€0 н§iï9'Åb‡$ ¾tËýáÚû^#iª¥Ëi?³ÅôÛbúK[AUØF徝Ƶijx]mŸ]2Ž-ĖKŽ~ ÏVw}¶X›ûÆÆÆÆÆÆÆ&O²É“Þ666666yRž”'½%lllll/´åhœl…Ãîm ¹¤êádël™¶´3Ù+ïÛmÍ« \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_113_0.dat b/lib/phpqrcode/cache/mask_0/mask_113_0.dat new file mode 100644 index 00000000..5eb7f5de --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_113_0.dat @@ -0,0 +1,2 @@ +xÚíÚ; +…0Ð>«Iö¿9+Eñƒ‚sá=ϤL1̄[¤÷¹FáZU‹4‡?i<ÿç;7çòç;‡ÆP¥Œ#ýW-[ñݯ6÷µddddddüc",;í"¼Ÿskæ‘‘‘‘‘‘‘‘Q&—Éerw######£L.¯Êä摑‘‘‘‘‘±Ð˜y¼1†^˲\òîÆØ3Æâ³ÚÓóøÏÆ ‘Ñv \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_117_0.dat b/lib/phpqrcode/cache/mask_0/mask_117_0.dat new file mode 100644 index 00000000..781c7f87 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_117_0.dat @@ -0,0 +1,2 @@ +xÚíÚA +„0 Ð}OÓÞÿr³R,#3öñ¥Ë,âÃþ¢½o5ŸCµØÐq:õõÖ;;¬wvN­ÁJZGÅ=Œm»û}Úö ѱ¬¬¬¬¬¬¬¬µ¦2âÞi‹RïïkÆj_YYYYYYYYeÙ_ö·¯¬¬¬¬¬¬¬¬²¿ì/ûÛWVVVVVVÖkîáýd-úϺ,#¦ßÀOÖÎZc]|‡{ž¾Áúˆ­$™ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_121_0.dat b/lib/phpqrcode/cache/mask_0/mask_121_0.dat new file mode 100644 index 00000000..68810c34 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_121_0.dat @@ -0,0 +1 @@ +xÚíÛ1„ ОÓÀý/·•w YMüSø Ä8>2SÐûÖF O­EÓÈÌÓc«W\ûÛ¼š‹{c§æpK›GÕžB·ÐšþímûŽxhfffffffæ/s2ÛÇÚ2W|*÷d®1ÛÏÌÌÌÌÌÌÌÌÌê*5³ºÊÆÌÌÌÌÌÌÌ̬®RW©«œaÌÌÌÌÌÌÌÌsöòËÁ\xm~8ß®¸ƒr0wæjsdm÷ªýü&óâyÙ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_125_0.dat b/lib/phpqrcode/cache/mask_0/mask_125_0.dat new file mode 100644 index 00000000..2c73ef1a --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_125_0.dat @@ -0,0 +1,2 @@ +xÚíÛA +€ н§Ñû_®•‘TH`3AO—L4ü kí£ÍÃ(áÍÛewö›GWÖÙ××.í #ÃÞ2¿û¡} \ëçYú»¤´gggggggggg_d>Ïïµòj^™ÕØsíö;;;;;;;;;;»'ÇÉqö;;;;;;;;;»'Ë°ËqþuììììììììµÇ_Pì‰Íçö—ÏóYwÄ{eÿš=dÍ×ÌýþGû/ý“¸ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_129_0.dat b/lib/phpqrcode/cache/mask_0/mask_129_0.dat new file mode 100644 index 00000000..812ee8a6 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_129_0.dat @@ -0,0 +1,2 @@ +xÚíÛ1 +Å ÀÞÓèý/—*Ÿ„DøEØ'ÉhgõtÙ-ì}_£pV‹· \"Ìb=sþ—ÁÌå™ó[ƒÐJŒô=8DhÅoàºÛž' 0XÐ ÑüÎÛ´©è‘¬e 0`À€ ˜ôÊ Ì j" 0`ÀÀ¼ Wf`^P0`À€æ½2ó‚šÈ€ ¼Ò óÉôd07(ì“Y‹/XLÿGb…yÁ"êpT \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_137_0.dat b/lib/phpqrcode/cache/mask_0/mask_137_0.dat new file mode 100644 index 00000000..f6d993b0 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_137_0.dat @@ -0,0 +1 @@ +xÚíÜ1„ ОÓÀý/·•+FÉZ?®JšÉ Læ7Ôº¬ØÝ*ÑBÚa%L~šŒË»òä”ÉØéʓC“ðJ›´YîIWJ ½™ý.K]ñR˜0a„ “›$ç“ïINTwÎlLža¢Ÿè±L˜0a„ &Ld@PÔO˜0a„ &L˜0‘e@P?a„ &L˜0aÂD”e@ý„ &L˜0aÂäÏM²ŸIlL&)dl˜ígøÃacR™<É$övê,ý„ɺ?U2ç] \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_141_0.dat b/lib/phpqrcode/cache/mask_0/mask_141_0.dat new file mode 100644 index 00000000..8c685c8e --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_141_0.dat @@ -0,0 +1,2 @@ +xÚíÜ= +€0 н§iï9'EÑúÖDx͘%«Iö¿9+EñÇ{ˆõ$åm†ƒ^˜&µŽ§u¼³S"µÍDŒþ6ڟ]9ùÉè8ìU“M£“bÔÒ¾£Y¤Òù[ß2拉Ĉ#FŒ1bĈ£Ï%ôµiRNšæ½–ѳì#;›#FŒ1bĈ‘N«¯1Òií#FŒ1bĈ#FŒtZ}‘Nk1bĈ#FŒ1b¤ÓêkŒtZ;›#FŒ1bÄèõFV-ŒÂuè"IoD-Œ*£7uû×jÚ>b´MV“+ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_149_0.dat b/lib/phpqrcode/cache/mask_0/mask_149_0.dat new file mode 100644 index 00000000..d2583502 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_149_0.dat @@ -0,0 +1,3 @@ +xÚíÜA +€ н§Ñû_®MEQXP৞.Ý|94³°ÖeµÁ{³JL¨všŠÕ#«^Ü÷Ïn[õ ß?;µ +ZIV-ñ»ÚÄ*wï¸Ë’1*+V¬X±bŊ«ßX¥ü·¯g¥ÛwŒèqX}ÇJ½RÛY±bŊ+V¬X±beΠwfeΠ^±bŊ+V¬X±bÅʜAïÌʜA½bŊ+V¬X±bŊ•9ƒÞٜÁœA½bŊ+V¬X±bŊÕl•ó0ÞÎ*0Tßj`?˜öÝΪ²ú¢Õð;Xë«ë=zZr* \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_153_0.dat b/lib/phpqrcode/cache/mask_0/mask_153_0.dat new file mode 100644 index 00000000..fc79e9ed --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_153_0.dat @@ -0,0 +1 @@ +xÚíÜ1€ НÓÀý/礑h¢&F¾ú`ìÒ¼@I;Pë¼ZÀ^­•XÛ͌ÙmfÏÆ.™=Û5 [if-õœ­R+!wr»Ëœg\j̘1cƌ3f̘1cf–Ôo.±2¬?Š1ûž™zæ `ƌ3f̘1cƌ™¹†™¹†zƌ3f̘1cƌ3fæztfæê3f̘1cƌ3f̘™k˜k03×ð0cƌ3f̘1cö³¬Ï9;³ÐĎÍö›‰`vf•Ù̆ß͚ZϘß¶W9 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_157_0.dat b/lib/phpqrcode/cache/mask_0/mask_157_0.dat new file mode 100644 index 00000000..ad749f30 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_157_0.dat @@ -0,0 +1,2 @@ +xÚíÜA +€ н§Ñû_®•QRù©§»Y ùkí«…ìÍ*q͵ÓîØ=j7§~ÙnNýÔ.p%Úµäs·i¯ÝÕã.½×Èöرcǎ;vìر{Ù.-W¬õ2={êì¾mgÞy+رcǎ;vìØɳ2;yÖ¼cǎ;vìرcÇNž•ÉØɳæ;vìرcǎ;v2™<ËNžõV°cǎ;vìر“ge2vò¬yǎ;vìرcÇî¦]ÞÂ;»àæÆv¹"õÞ]e÷'»˜;[“ç»û{¾|Aµ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_161_0.dat b/lib/phpqrcode/cache/mask_0/mask_161_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..4bdc5fdd3fd5b8d7ec11a534cb9a2cb1f58b87f9 GIT binary patch literal 241 zcmb=p_4bYxI3`FaC~S7rJnYfY8T-%e~DHFIIc5zv^p@ZbtcP7qJ_1+9^La zKHT%7-Y-t#T{NC)k=gd2o zjNY~Ld^ftnUmGj|mU3?60jkj`HqbYoV)>#S!~tpmi%zkeFHURTr~Ks{-QatqS5&9ib(yR@{gMnQ+Lcye6Ty_ Q@^8h%UuzjeUK>3D05K(RC;$Ke literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_0/mask_165_0.dat b/lib/phpqrcode/cache/mask_0/mask_165_0.dat new file mode 100644 index 00000000..3a17a051 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_165_0.dat @@ -0,0 +1,2 @@ +xÚíÝ; +€0À>§Iî9+ÅàDyÁIÊ4Ë ÷5Ö:¯¶W«ÄÙv«dù¢åqñߜܴ<þæd×2x%[¶žËU™%ðÝÞî2×]&K–,Y²dɒ%Ë¡,S¿Õ—“r2ydÌ=,ÿk©_º{X²dɒ%K–,Y²d)Û0³”mè—,Y²dɒ%K–,Y²d)Û0³”mè—,Y²dɒ%K–,Y²”m˜Çe,eú%K–,Y²dɒ%K–,eæq–² ýÒÝÒ%K–,Y²dɒå…eî:ËŠ<³Œš!Óÿ¡ÐYV–,ßñ:B¿dù|O¨$*# \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_169_0.dat b/lib/phpqrcode/cache/mask_0/mask_169_0.dat new file mode 100644 index 00000000..c4787d9d --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_169_0.dat @@ -0,0 +1,2 @@ +xÚíÝ1 +€0À>¯Iþÿ9EQÑ=˜¤Ls æä¶Iïˁ{³Zt¡ã´R¦™þ}òÀôï“SÓð•n:ª|§›R[è?î¶Ô_*S¦L™2eʔ)S¦L™™&ϦëI šê¯O˜2ÕOý£˜2eʔ)S¦L™2e*C1ïËP˜ÊPôS¦L™2eʔ)S¦L™ÊPÌû2¦2ý”)S¦L™2eʔ)S¦Le(æ}¦2ý”)S¦L™2eʔ)S¦Le(æ}¦2ý”)S¦L™2eʔ)S¦³iöc7;Ó"…Þ™Fͦސٙv¦L Üý^¥Ÿ2}oOäß'r \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_173_0.dat b/lib/phpqrcode/cache/mask_0/mask_173_0.dat new file mode 100644 index 00000000..5ef85e7a --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_173_0.dat @@ -0,0 +1 @@ +xÚíÝ1ƒ0ÀÞ¯±ÿÿ¹T ¥ˆ¬[4véæ2ŠØƽok݇ÕÊ;¦Ó²]fûô֞ýdûä½ölj°lGÒÿö0n+œß»m³GŒË–-[¶lÙ²eû"Ûêï·ûY»}o¯öíÀ–íÕVÞÊ[¶lÙ²e˖-[¶lÙ²e«ÓհՃÉ[Ï2¶lÙ²e˖-[¶lÙ²e«ÓհՃÉ[Ï2¶lÙ²e˖-[¶lÙ²e«ÓհՃÉ[¶lÙ²e˖-[¶lÙ²eËV¦«a«“·lÙ²e˖-[¶lÙ²ef[ÿB°“mа÷¶Eû„”;¶N¶-ۜT¸/r’·lÿ¿?ØÔ*Ñ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_177_0.dat b/lib/phpqrcode/cache/mask_0/mask_177_0.dat new file mode 100644 index 00000000..78a26a77 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_177_0.dat @@ -0,0 +1,2 @@ +xÚíÝ1 +…0Ð>§Iî9+?Š²Øè߁—”iև dšÌ¹¯ÕxֈxÝNÌø/ÆÕ§|{öظ²ÿöìÖ8d¥¯´ÿø0òhž×=öùcFf̘1cƌ3f̘q¼qÂ=ïw6Ê;l·»4cƕ±<–ÇŒ3f̘1cƌ3fÌXï¦Ò»1Ö»Écƌ3f̘1cƌ3fÌXï¦b¬w“ÇŒ3f̘1cƌ3f̘±ÞM'ÄXï&å1cƌ3f̘1cƌ3Ö»é„ônŒõnò˜1cƌ3f̘1cƌÍ3U<‡ \7í+’Þ(<OƌŸ·ÎŠ™–ÇŒßÛÕä4@ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_21_0.dat b/lib/phpqrcode/cache/mask_0/mask_21_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..368c9941fd09f695d58934eb0de062a54fd74c02 GIT binary patch literal 48 zcmb=pWo*#E=&aDfq?gm=vB)I2o5jQUx&ZeRqn1^Uf@;3Hn^Ft5vfXH5Z;oPEP!;?T E0GJaIuK)l5 literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_0/mask_25_0.dat b/lib/phpqrcode/cache/mask_0/mask_25_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..e4a5b6d8afc4516779d7d246ebfcf7ced36029d4 GIT binary patch literal 57 zcmV-90LK4#+A}bK0YfN+0xnzV>=60G~7^dI6e8pX8D%7wG^1 literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_0/mask_33_0.dat b/lib/phpqrcode/cache/mask_0/mask_33_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..2ec712a7adcd6edf1ce2c785adf00e3ca7c5b729 GIT binary patch literal 62 zcmV-E0Kxxw+A}bK0Yfwh1zdy_AgLHMX5awSafcxR$OTi6Q^}|q!_EwNn!%sOz-Hh| UV{|eD?iT|>N~mE50E^|%1m89on*aa+ literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_0/mask_37_0.dat b/lib/phpqrcode/cache/mask_0/mask_37_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..1588cfce1318608538dbde89fa7f04d05ff574e4 GIT binary patch literal 65 zcmV-H0KWft+A}bK0YfYh3b=?-grsWFnuP~Y*IkB0KrWabyvjz+8Z~Q>n+4Agg!2&C XEPQ!r0L+5>(SR6b)HDkKY5W93c-0$f literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_0/mask_41_0.dat b/lib/phpqrcode/cache/mask_0/mask_41_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..e369027e3831ce2d9ac858eaa2cdfa5e5498df07 GIT binary patch literal 68 zcmV-K0K5Nq+A}bK0Ye-R3b=?>h@^7Jm`MQ8#+`;lLN1s-f=Wlt95r*)%t2))yeuHD a3;~--s0Çæ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_53_0.dat b/lib/phpqrcode/cache/mask_0/mask_53_0.dat new file mode 100644 index 00000000..572d279e --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_53_0.dat @@ -0,0 +1,2 @@ +xÚíÖK +@!й«Ñýo®QÑϺ:(m&ܯžs-¹¬®É6õÑZ{¥m4Y†²Xâù®.FÀÙ­‹ê¦XZi·Ðùj=:έ֋b忑VH 8 –#¤[—ù²¾‹ãYвç¾^XÔ÷e \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_57_0.dat b/lib/phpqrcode/cache/mask_0/mask_57_0.dat new file mode 100644 index 00000000..ea81e6dc --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_57_0.dat @@ -0,0 +1,4 @@ +xÚíÖA +À À{^“üÿs=YL՚ ( +ou¨– j) ¬ª +Z7y„ÙëÍñv,Ô´ìwVQ ži»¤ìGiÒ¤¹ÅDfÂەÉÄwo4ùѤ¹ÐÄoÎLÿÌéLȼÁœ©·›Á³Õì}î4 hå \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_61_0.dat b/lib/phpqrcode/cache/mask_0/mask_61_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..93d2444d8249bf3c534223bc1bb339d54f7af957 GIT binary patch literal 119 zcmV--0Eqv1+U?dk3IHJt1<*dHN$!6+E5(hNrI=BE>;m7%=n!PCCC1eixx=ze|IFU^ z&9=7bWCto@OXj<~I62OGT~zl9#bLvS4O_9jbFKC1I6Jle?Kb{3*sx(Qw*P@W*om-i Z8|GT{jXc==mTf+B&fNDGb^()u!gb2GK0EGW|+U?gt4!|G?1i(A5f&YK5CmXS?mE~YV7mp;Hi4u*ftt_y*5-7lK6FzHr z>I4k)=)nLMYOw4+bP*CfgX@x(2S?CA0}V9%z<}J֞!ÅŠ+V¬å¬ª½õöí÷.Ýõ±2¯X±bŊ•ÿ¬Ì+V¬X±–²ê.ökBèÞz±·ÔwðƒÕ±¦Ì€gÌkë¡YZý \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_89_0.dat b/lib/phpqrcode/cache/mask_0/mask_89_0.dat new file mode 100644 index 00000000..aaa4c526 --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_89_0.dat @@ -0,0 +1 @@ +xÚíÙ1€ …ὧiï9'Œˆ€Ñ×ýËHl?Lšà^"ë&M—™?bî—qÃÜ?˸äÉ,µ9²þó!µ‰z¢]VêÈScƌ3æ_š•÷à¾cÓé!î`nÍô3f̘1cÆ̌„™ 3f̘1/fÖ>.Uæ¤ÄcóË»;ã ¨2;æ™YÒžÕÏ+™7Þý \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_93_0.dat b/lib/phpqrcode/cache/mask_0/mask_93_0.dat new file mode 100644 index 00000000..e218fa0e --- /dev/null +++ b/lib/phpqrcode/cache/mask_0/mask_93_0.dat @@ -0,0 +1,3 @@ +xÚíÙK +À EÑyV÷¿¹Ž,ÚO¬mÞ rãPHŽ0 {’´š°ôäå2ûbö¨ìýÞc{t¦Qáƒ] +{QÞ{“Þ{弬֒¤ÇŽ;vìØ_Ú³ßÕ}ÏÂ÷ýËL€}l§ß±cǎ;vì̑̑̑رcǎû¢öüÐÎ.LÛæÕegwì3ö´žqe¿ÿѾ@i \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_0/mask_97_0.dat b/lib/phpqrcode/cache/mask_0/mask_97_0.dat new file mode 100644 index 0000000000000000000000000000000000000000..74ac719d06e7ba35f7b749e668c884f291daefb7 GIT binary patch literal 150 zcmb=p_4cMC*8v3{my5N2lkfa5ijADYwQUyT?SDJYDA|}8ET~@TVG}wt#i2yK=7z!b z>XaF;OL-RsNjlZ?U*+(wbH1LOIxmNXjYq;D;XuQ~?`*DdR@K|)ymqtY`Of=>87kg* z$16{D`=-laMU02Hv7J?~OBUdlkQVwh=~Mq+LyI<1=UdT5U+wnXEMO=-^wS0a*1Әý—Kƒ€°•À}“ˆÆ:!£èiY‰™'*3§]fÛsþÛÉÓÒîm¹ºb[ÞJÂÆÆÆÆÆƶŖÝKÆ9›}ccccccÓ'u.6ûÆÆÆÆÆÆƦs±é“Þ6666¶R[ÿ^gû{/lÇØÙ·Û Þ7͂ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_113_1.dat b/lib/phpqrcode/cache/mask_1/mask_113_1.dat new file mode 100644 index 00000000..1dd666d9 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_113_1.dat @@ -0,0 +1 @@ +xÚíÖ1€ ÀÞ×ÿÿœ -8fL(pBŽlDM™è9";ýÄ-÷ò÷;?1îpâÐ{¼\åÆú%-ŒŒŒŒŒŒ“3:@Ûad4ŒŒŒŒŒŒŒŒú*£NîÍaddddddÔÉÍ#######ã#c]75®ÓåÚã¢Æåæ1ÏxYuñ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_117_1.dat b/lib/phpqrcode/cache/mask_1/mask_117_1.dat new file mode 100644 index 00000000..8921f643 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_117_1.dat @@ -0,0 +1,2 @@ +xÚíÖ» À À>Әý—Kƒ€ø$ø^’ 8Y–QSV'zž8‘þjzëÌʇ¬™^]Þסµ‡¬õekXYYYYYYYjݵ#¶ ++«yeeeeeeeeµ#²²šWVVVVVVVV;"+«yeeeeeeel­'ëe;b»±&²^9¯{­/ÊJ$p \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_121_1.dat b/lib/phpqrcode/cache/mask_1/mask_121_1.dat new file mode 100644 index 00000000..64bd8ba0 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_121_1.dat @@ -0,0 +1,2 @@ +xÚí×1 +À н§‰÷¿\— ¥C¡PbїEÁÁ$’DdÆ©ÄÊ•Y»³ÿŸtëڅöλ»÷ÏÕÛó0£$ìììììììììì›ì§ûù¹ÆήÞÙÙÙÙÙÙÙÙÙÙõóììꝝÝg–a7ÇyëØÙÙÙÙÙÙÙ¯³ç—½Y??ÿØÙ{Õ{ý¾D“ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_129_1.dat b/lib/phpqrcode/cache/mask_1/mask_129_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..62cd1c9a18c2367d1c2c4a125b0c7bfb7647cd07 GIT binary patch literal 164 zcmb=p_4c+Q*8v3{)(d-=d%mmRskg|fP}}X+^rc5NZJtc#aociguIS=*E7o0PY;Hez z>gn9i&b%cXe#-fTKV)dW7BEeenT¯9ÿÿ¹4¢6)ƒ3×$`s ²¸uÊ®‰>Wdš¾ ›)›g³•'°±MÂ{3\d6u¹’bØ°aÆ 6lؼn³û]ÜNØ°9ÄFÞ°aÆ 6lØ°a£3°a#oØ°aÆ 6lØ°ÑØ°Ñ5e16lØ°aÆ ]SŸb£kÊ6lØ°aÆ ›mê—ͤÍß;CûcÃf‘¼IdsG¹ÿ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_145_1.dat b/lib/phpqrcode/cache/mask_1/mask_145_1.dat new file mode 100644 index 00000000..6a9950f7 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_145_1.dat @@ -0,0 +1 @@ +xÚíÜ!€0@Ïk®ÿÿ¦¡ 4a)³qæ2i.YCUO{35²UZÆFŒn]ÏfN>bd£ðwtzJF}ÁFŒ1bĈ#FŒýÆ(¡¯FŒ6r1bĈ#FŒ1ÒE1ÒiÝlFŒ1bĈ#FŒtFŒÜ#FŒ1bĈ#FŒtZ}#÷ˆ#FŒ1bĈÑl£þeôÀHÉùG£µÜ£@£ٝ’î \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_149_1.dat b/lib/phpqrcode/cache/mask_1/mask_149_1.dat new file mode 100644 index 00000000..02a3cdc6 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_149_1.dat @@ -0,0 +1 @@ +xÚíØ1€ ÐÝӔû_΅ˆƒqÁHÞ_Xšòc‰èi«#Gd̘ŠÕ”Õ›á÷g…¬LUè^Ý®VR«>dKV¬X±bŊ+VÛXeùo¿ÎX±ÚÌJ_±bŊ+V¬X±bÅÊ;ƒÝ™+}Ŋ+V¬X±bŊ+VöAV¬ô•ngŊ+V¬X±bŊ•}+ï úŠ+V¬X±bŊ«VýËjÒÊ>øhewfõ›•¾*`uTqí \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_153_1.dat b/lib/phpqrcode/cache/mask_1/mask_153_1.dat new file mode 100644 index 00000000..2abfca20 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_153_1.dat @@ -0,0 +1,2 @@ +xÚíØ1 +€0ÀÞ×\þÿ9›Ãbt³Ešc'›ªÎHHÍ•š9³efߞmff²MïÙíª›õ #.̘1cƌ3f̘1cf–Ô7¯3f̘Ùg̘1cƌ3f̘1c¦o2cæ]Ã?€3f̘1cƌ3fÞ5ôMfÌì3f̘1cƌ3f̘1Ó7utfÌì3f̘1cƌ3f̘=ÌúËl¡™¾ùj¦£3ûÕÌ>ÛÈì¤ÐVü \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_157_1.dat b/lib/phpqrcode/cache/mask_1/mask_157_1.dat new file mode 100644 index 00000000..17344b89 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_157_1.dat @@ -0,0 +1,2 @@ +xÚí×1 +À À>¯9ÿÿ¹4S¦d/Ì5‚Õ1ÈÊVÍ)SkŽJžµ»­vßÜ7´³ÝÞÝíé…ÛÍeGä°cǎ;vìرc÷²]Z¯¸îÙ±c'ïرcǎ;vìرÓ+رÓgå;vìرcǎ;}V¯`ÇNÞù+رcǎ;vìØé:;vòŽ;vìرcǎ;½‚;}VÞ±cǎ;vìص±›'»ÍvzÅ#;Œ]Œ¼klw¯oA` \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_161_1.dat b/lib/phpqrcode/cache/mask_1/mask_161_1.dat new file mode 100644 index 00000000..669ade1b --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_161_1.dat @@ -0,0 +1 @@ +xÚíØ1€0ÐÝÓÐû_΅XÓ¨Å¡ yi~…ˆ¬Q©bÖÕkvÈp±á³ê7'M u¸Ù=¼]ņÙð([ 2dȐáÏ +þÛ\' 2”‡ 2dȐ!C† 2´s0/3d(½) 2dȐ!C† 24ë1dhç 2dȐ!C† 2dhÖcȐ¡ÊS¦L™2eʔ)S¦L™2­œMç S¦LÍS¦L™2eʔ)S¦L™2•Må}¦LÍSS¦L™2eʔ)S¦LeSyŸ)SóÔŔ)S¦L™2eʔ)S;ٔ)S;ó”)S¦L™2eʔ)S¦v(²)S¦v(æ)S¦L™2eʔ)S¦íLódºÍT6}a*ï3mljžmzC' \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_173_1.dat b/lib/phpqrcode/cache/mask_1/mask_173_1.dat new file mode 100644 index 00000000..436918c0 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_173_1.dat @@ -0,0 +1 @@ +xÚíØ1€ ÐÝӔû_Î¥''Ó@y]Xšò1?"g¬:1犝fn˶ÌöË»ö¬­m¼·¯«»™m.?¶¶lÙ²e˖-ÛF¶«ÿß>glÙ²•·Þ2¶lÙ²e˖-[¶lÙ²e«O`˖­¼e˖-[¶lÙ²e˖-[¶lõ lÙ²•·lÙ²e˖-[¶lÙ²eËV¦O`˖­¼e˖-[¶lÙ²e˖-[¶z0}[¶z0y˖-[¶lÙ²e˖-[¶E¶ùe[h«OøÍVWö…­¼=Ìötÿ*| \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_177_1.dat b/lib/phpqrcode/cache/mask_1/mask_177_1.dat new file mode 100644 index 00000000..12e2e522 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_177_1.dat @@ -0,0 +1 @@ +xÚíØ1€ ÀÞ×ÿÿœÍE¨¬Œp0×XÐà„,a#rÚÊ}®¨6}nj§¿Ùÿ»¶‰±~Ž‡£\Ð8 •ƌ3f̘1cƌ—7®ðÎ{Ö3f,ÝyŒ3f̘1cƌ3fÌX_¡¯`ÌXï&3f̘1cƌ3f̘±ÞM_Á˜1cy̘1cƌ3f̘1cƌë+3f,ÝyŒ3f̘1cƌ3fÌX_¡bÌXï&3f̘1cƌ3fÌxãü2žd¬¯øÔX'Äx[cy|¨ñ ¸•3ë \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_21_1.dat b/lib/phpqrcode/cache/mask_1/mask_21_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..f87e0a11227bb4e1e6f46a1dbb133ca9b1cc8109 GIT binary patch literal 42 ycmb=pWo*#E^%B$z4|g)+XrS~G>tDQj I0gJJp;@7?u-2eap literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_33_1.dat b/lib/phpqrcode/cache/mask_1/mask_33_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..318949df07745528a680a428ac74ea85f016c2aa GIT binary patch literal 53 zcmb=pWo*#E(KTk=YPW25x~DW1ZnK;yQ#k{?W*9i^mo(k2MWv7BXK JDEWV$2>`Yr5WxTd literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_37_1.dat b/lib/phpqrcode/cache/mask_1/mask_37_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..5bd9e3aa0d08230508938e61404749c9ae72e32d GIT binary patch literal 56 zcmb=pWo*#Ec0ARA$6JzFue`IJvZq{C68loc~P O{VIfV)fhyX>>B}kGZlIO literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_45_1.dat b/lib/phpqrcode/cache/mask_1/mask_45_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..b35c567dca6aa84fbd8758e1fba4ba2feb397de2 GIT binary patch literal 82 zcmV-Y0ImOc+A}bK0z+KD00FoRNC61dbTS*2PX)7SsT!xdk(^GV*-*`fM1fJW2ff*Z o(g~bDg3KOGC-gI$Q0Yx=v#FI%h$&--irG{SZ{o}b0N2uhd5F*?p8x;= literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_49_1.dat b/lib/phpqrcode/cache/mask_1/mask_49_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..d20d71710eecee1842e3fc1535a09df5a9bc8761 GIT binary patch literal 84 zcmV-a0IUCa+A}bK0z-Vj00FoRNCgNTbhiUtgi3bMLkC`eAbEuhJD>&_5)DS}7`1~) qJBUfUaFG#i$7s45S#}Up3)038>ZV;{>!_h=2TkIGcsl^2!^he0dm&5! literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_53_1.dat b/lib/phpqrcode/cache/mask_1/mask_53_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..a676d7dfa2092a94b7a81322980eb4def98fba74 GIT binary patch literal 87 zcmV-d0I2_X+A}bK0z*Q;00FoR$N>ml185hf7!~cJr!Ip2Lh>4!c0mm>Bngb#HEP!o tw~N^P1s5B&Ycw5>+BN9xBDS?bOS@>1zes5V31pqmJ6B4Gdk literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_57_1.dat b/lib/phpqrcode/cache/mask_1/mask_57_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..896ed43575bbcdf0ad49fbfabe490f0645a69df4 GIT binary patch literal 92 zcmV-i0HgnS+A}bK0z+be0RnItkP8qx2Zf#3M5%1&K=cx?F0b9ifGvGnJH}m literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_61_1.dat b/lib/phpqrcode/cache/mask_1/mask_61_1.dat new file mode 100644 index 00000000..4165a4bd --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_61_1.dat @@ -0,0 +1 @@ +xÚ30€CbpPº™ÝØÅi`÷@ê&ÚßH^§Ðn¨a†dQ»Gíµ{ÔnF3s~{gDf@VF{6Pqb^n%N<(VOM!% z$k4$xhh-EO4838Mg8>5u3?CSjTRkcmt{T`$3>YwEH7H+JtRd!Bt3S?PhR}V`4GpQu FA{XR~DnI}L literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_69_1.dat b/lib/phpqrcode/cache/mask_1/mask_69_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..03bba657f6d0df2a65ab63bc13715660ffc4ba1b GIT binary patch literal 102 zcmV-s0Ga=I+U?gd3IHGoh2g!^*!?fpBGuB6Ru=tl734z%QACqxBP~f*q;+|~GOlg3 z+|*@yF5PGrS+r?(1q&7|Sg<^6vEHLv!?NAN?qb1$1ZaPm@r{VZ}QxyUc>an#ExUago&HU9mj+T)Arjuh3Vye^8R7`ZVIqZ Kep3TS=JO^`WH?p; literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_77_1.dat b/lib/phpqrcode/cache/mask_1/mask_77_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..0fe0b03e868a00c5cc8f97a40528a7873b189a78 GIT binary patch literal 110 zcmV-!0FnQA+U?je4ge4gh2h<4>i(Cr2nH6ODE>E!G+%@^VU`nTV>Q8)snssB^}WNL zdu^VpO`ltHbYfdB9wots4cnKt)&5pivAMDF7O-K%#>`?aFte~>!}hvu_4ni(Cr2nG^~hc@}&Xs9m@nlP)$C$XMn>hy{MjVt$j z{gE+3#iKqBt-N5Y8)R89V#J7X)2MhK+d4+qM(zwoj2JO8ubJ1(Ym68%VvJ~1{NnyH UdYUt;KT?e16B)r+06TKr<%ttFF8}}l literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_1/mask_85_1.dat b/lib/phpqrcode/cache/mask_1/mask_85_1.dat new file mode 100644 index 00000000..b8a20c75 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_85_1.dat @@ -0,0 +1,2 @@ +xÚíÙ1 +À н§‰÷¿\©]‹‰4ðþ˜AA hÄÌØM¬\Q‘µjsë·úAk§U·ûújm‘un2RÃÊÊÊÊÚΚ5·ž:k;«»ÅÊÊÊÊjƲº[¬¬¬¬eoÅí­›[™oð¬ÿ[ÇÎk®õ¨ðZä \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_89_1.dat b/lib/phpqrcode/cache/mask_1/mask_89_1.dat new file mode 100644 index 00000000..e9d226f3 --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_89_1.dat @@ -0,0 +1 @@ +xÚíÙ1€ ÐÝӔû_΅‹N…h}%Àƒ@ iDOËHŒ±*cä"æûµ<öØgþâÈ)û§Ñû_.Ä4I‘ìâ‡y킎¢¸`)-5*¥ç(™é£of[Ósm€}åÑÃöý¶õÉö6YM ;;;;;ûG{ô»zÕØ·µ»«ìììììììz1vw•}œ=úwuûìýLÆ%û?û"ç=Ç~e—i \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_1/mask_97_1.dat b/lib/phpqrcode/cache/mask_1/mask_97_1.dat new file mode 100644 index 00000000..24fa60fc --- /dev/null +++ b/lib/phpqrcode/cache/mask_1/mask_97_1.dat @@ -0,0 +1,2 @@ +xÚíÙ1 +À0н§1÷¿\—ÐtncKÌû«ƒ‰D"‘H$ÊäD™œH$‰D"Q&—WerûH$‰D"ñ±ç*x[±(Ë?/ÚÇ÷ˆ'ŸŠnd \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_117_2.dat b/lib/phpqrcode/cache/mask_2/mask_117_2.dat new file mode 100644 index 00000000..b4dcce46 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_117_2.dat @@ -0,0 +1,2 @@ +xÚíÚ1 +À À>¯9ÿÿ¹4!m dOƒs\§0X,laÕ5#¿÷Eª¾>Z[íœÖ·ŽÉêã½ÄR©T*•J¥R?Q-œº«*¯T*•J¥R©º?U÷—W*•J¥R©TݟªûË+•J¥R©Ô¤Úùó~m5Õ©;ªòúSõ&+ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_121_2.dat b/lib/phpqrcode/cache/mask_2/mask_121_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..a2a0097b1fd803424ccf0a741277066f44b04dae GIT binary patch literal 127 zcmb=p_4c+Q7lR@X%YlD!!vFtUN&Z3X+ Wr*l6!Q#;$o?ELu?!b)#0qyqpqZ94e? literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_125_2.dat b/lib/phpqrcode/cache/mask_2/mask_125_2.dat new file mode 100644 index 00000000..0ea40fda --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_125_2.dat @@ -0,0 +1 @@ +xÚíÛ!À P¿Ó”û_ƒ@ U(Ûkp@^Mú£Ú®5ÕôªúËîòâ-ú‰:ðöVF_žÌ\t:N§Óétú÷õ¼yžN×qt:N§ÓétºG—ãô;N§Óét:.ËÐå8:N§ÓétzA}ÿµ‹ôÔyžN×q¿Ñ;+nŠ& \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_129_2.dat b/lib/phpqrcode/cache/mask_2/mask_129_2.dat new file mode 100644 index 00000000..bf048394 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_129_2.dat @@ -0,0 +1,2 @@ +xÚíÛ1 +À0н§Ñû_®KÈVÚ¡¨'.Éôþ!«²¶w]A0XðÄú÷~˜ «ÚÞ  ö!›š€€€€€€à£ fK# x˜Fy€À4È vey€€€€€€€@^°+È ç º~™ž ¨Û L#ÁêveI \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_133_2.dat b/lib/phpqrcode/cache/mask_2/mask_133_2.dat new file mode 100644 index 00000000..9e78b6de --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_133_2.dat @@ -0,0 +1,10 @@ +xÚíÛ1 +À н§‰÷¿œ‹à&´`¢ô…Lâð”üÁˆQ-½g=Aq•bëú¹ŠÊª<‹všb½+©)((((((((ÊIën*…÷­lš ††fŽÆ„ÓÐÐÐÐÐÐÐÐÐȚ44²& ¬)OÑȚÞY“FÖ4á444444444c4~œ9S³:3ÐЌטpšÇ®>® \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_145_2.dat b/lib/phpqrcode/cache/mask_2/mask_145_2.dat new file mode 100644 index 00000000..9ff2bbf3 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_145_2.dat @@ -0,0 +1,4 @@ +xÚíÜ1 +À н§ùÞÿr] +Ý,tˆQ^È&ÊCˆð“§ÆÒ~ë +щ¢Éj~mɾ¢.ÕåŽFgÑüìMDDDDDDDDDDDÔST™×ˆˆêD¦ŸˆˆˆˆˆˆˆˆˆH¦•ŽˆdZï‘L+¯É´DDDDDDDDDDD2-‘é'"""""""":BÔäת½EåY„ˆ¨Ddú‰¾û† †Š \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_149_2.dat b/lib/phpqrcode/cache/mask_2/mask_149_2.dat new file mode 100644 index 00000000..d52e0484 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_149_2.dat @@ -0,0 +1 @@ +xÚíÜ;€@ÀÞÓÀý/gcaGÖBXBç'“-ˆ¼Âˆ«²»ouÕ§UQ½dõRVOm¡šTƒÎ*Ç«Ê;;šŠŠŠŠŠŠŠŠŠj¨ªå»ŠªEe2PQQQQQQQQQQQɨ¨ä TTTTTTTTTTTTr»3•œÁ¼¢¢¢¢¢¢¢¢¢¢¢’3ØR©ä &ÕßTsþŒ·»ªk¤¢z_e2P=ê ïd™ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_153_2.dat b/lib/phpqrcode/cache/mask_2/mask_153_2.dat new file mode 100644 index 00000000..3b060410 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_153_2.dat @@ -0,0 +1,2 @@ +xÚíÜ1 +€0 ÐÝÓ¤÷¿œ‹8ZP!¿úB¶ÒòèèZuÔÈ賶"û“ìbuºñö™‹ÈÒ*îÎƲé)]MFFFFFFFFFFFFö†¬%= #‹‘™ddddddddddddr ot2¹†yFFFFFFFFFFFF&× #“k‘‘‘‘‘‘‘‘‘‘‘‘É5ÈÈL 2222222222²(YÚµ½7ÉÈ"d¦ÙóÞ@H— \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_157_2.dat b/lib/phpqrcode/cache/mask_2/mask_157_2.dat new file mode 100644 index 00000000..2baf535e --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_157_2.dat @@ -0,0 +1,3 @@ +xÚíÜ1 +€0À>¯¹üÿs6‚M¹ÎqUH1¤XØ&Uç̘½fÝ/u-çûé'ñíæ.ºû[ÍKGGGGGGGGGG÷H×|NG¨“(ttttttttttú¬NF§ÏÊ;::::::::::}–ŽNŸ¥££££££££££Ózèè$ +>«“Ñé³…ŽŽŽŽŽŽŽŽn­ üAø#ºî^AG—§“(t¯ì =3{ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_161_2.dat b/lib/phpqrcode/cache/mask_2/mask_161_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..d2df7594eafccef2dacee35dfd7b2fa20d22e1dc GIT binary patch literal 190 zcmb=p_4bY;UxNV;Yry%;UBBb`j2ojEHvT!3{p!RC?nRON7i3-Yc;zkY`Xf0}_x!$! zFE2cT6SG?D4qx=zQRnO+ECdE-0&RD4IXDluF5^{1fQ4roCj>lm@IU~K;tl%3r)17J zJ0ZZ#=G-X(&k}A4K#T&Dr(`%dQ~6pDpuA;fz2pBjgY@glDn4Sf%vz*>v-~PkmIDA9 Cq)A-> literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_165_2.dat b/lib/phpqrcode/cache/mask_2/mask_165_2.dat new file mode 100644 index 00000000..2e6cd7c6 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_165_2.dat @@ -0,0 +1,2 @@ +xÚíÝ1 +€0 ÐÝÓ¤÷¿œ‹Šè ?òBÆVü¥UG¼žµ%åùÐêþ¸åÙ×*“+ú_ŽfÊËs MIIIIIIIIIù–2d;£¤l¨4‰()))))))))))eöqJنIDIIIIIIIIIII)Û ¤”mPRRRRRRRRRRRÊ6lº””² JJJJJJJJJJJJن}œR¶aQRRRRRRRRRRNeòK?R퐔”Í”&åW½3U \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_169_2.dat b/lib/phpqrcode/cache/mask_2/mask_169_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..4052062b8db42699eecf910b9792afd64d0db84b GIT binary patch literal 196 zcmb=p_4ckI*8v3{)(d-=cYfa=BffC9bK#GR;+rC$JQO$)A7z^D@-5td;v_x$KZRRf zZ@YKti&y>Si-EiLS+DR!2HU-y%YuV0IWJizqKN=2d5((tdS!V{oP+?U0&*@cSz;s- xgbbohG*|MpPC)`8ZBAZV&W8R7OY$eT{eSz+A@fq6m)EU$prLMGxEX}SGyvz^RrCM= literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_173_2.dat b/lib/phpqrcode/cache/mask_2/mask_173_2.dat new file mode 100644 index 00000000..0a30ba53 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_173_2.dat @@ -0,0 +1 @@ +xÚíÝ+€@ PÏiº÷¿ÚfÝtóš:>y &d U߬ÔýÍS´´[íþª»ùé¡Õ]5Z;a¼Û5V۞™´´´´´´´´´´AÚÀï[ZÚË´Œ–––––––––––––V¦«¡ÕƒI0ZZZZZZZZZZZZZZ=-­L‚ÑÒÒÒÒÒÒÒÒÒÒÒÒÒêÁhiõ`Œ–––––––––––––VFK«“·´´´´´´´´´´´´ÉÚü?‚ݧÍìhioÒJ0Úà}³¢o \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_177_2.dat b/lib/phpqrcode/cache/mask_2/mask_177_2.dat new file mode 100644 index 00000000..d2c52f99 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_177_2.dat @@ -0,0 +1,2 @@ +xÚíÝ1 +À EÁ>§Yï¹4’V$Í~± ,CŠ…¼&UóŒÞ÷;OoŠk5b÷Ñϙáâ”óŽG°x9¥Û%&&&&&&&&&&&n$îöõOL|‡Øv#&&&&&&&&&&&&&ÖÝbbݍ˜˜˜˜˜˜˜˜˜˜˜˜˜˜Xw#&ÖÝl7bbbbbbbbbbbbbbÝM"ÖÝl7bbbbbbbbbbbbbbÝMa!&Ö݈‰‰‰‰‰‰‰‰‰‰‰‰3Ä)U0}qMK$nTp4?}1s?+4l5MclS literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_29_2.dat b/lib/phpqrcode/cache/mask_2/mask_29_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..5112d11eff0ce0631ba1000e8823e0592ee3230e GIT binary patch literal 45 zcmb=pWo*#EnW&mR* B5Pkpv literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_33_2.dat b/lib/phpqrcode/cache/mask_2/mask_33_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..5bac0c80d2fd997d753427178c6294dd3dd9184a GIT binary patch literal 47 zcmb=pWo*#E *F™>– \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_45_2.dat b/lib/phpqrcode/cache/mask_2/mask_45_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..ad44ff1885f2c4e0d2158824e4d2b5537e0e8eb5 GIT binary patch literal 68 zcmV-K0K5Nq+A}bK0z=#g4!8^kw`w#Iid7Q>h%(!dOx19XArWX)^>9~>HN_4))uS;# aNK_M3B2!g0&U7-YR1co;#)SYYI)8L$SQ+gA literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_49_2.dat b/lib/phpqrcode/cache/mask_2/mask_49_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..6e8edff24b9344b19623318f9e10802439cf2b40 GIT binary patch literal 70 zcmV-M0J;Bo+A}bK0zFeF c>OklqvR0#s4%}&Xxa%04@qrTo0MEO|#KK}86#xJL literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_53_2.dat b/lib/phpqrcode/cache/mask_2/mask_53_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..682cae2aa6532baf02d2aa3e0c1dd2ab5227a34e GIT binary patch literal 73 zcmV-P0Ji^l+A}bK0z*Ow32+$&77oAwesj8DyK(d{NRL}|M7?Oxab&l#B)j2eE;wiyK ib&jT?QJteYsi%|F)*Fp=5-1Z!bq=xk#E$^gB4-2t4I$0| literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_61_2.dat b/lib/phpqrcode/cache/mask_2/mask_61_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..77d3815eb51a7feb77ebf8fa7001e8428c252db7 GIT binary patch literal 78 zcmb=pWo*#E&42|mGA0{eU)ahq{&Zsci5AoT|sbCRL;^iky?c_QPW#8n#wmU scCwG!AOHf}SdL4%7jXKBFflomDSq>=(yS;mZJM;_nealU{J-+60Ag+8uB49o zCeM)i$;BWcAt6nrP(L9Zkl0KlBqVyA9!Ek#%9h06kgHO>pO7@^?R^TT0-T8OPY@d{ Aga7~l literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_77_2.dat b/lib/phpqrcode/cache/mask_2/mask_77_2.dat new file mode 100644 index 00000000..903cba4a --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_77_2.dat @@ -0,0 +1 @@ +xÚíØ1À н§Áû_®‹CMŠØ>òGót Ñ«eó¨+Ž×FWÄZE¼­mÓ&gއF£Ñ¶h‰ùF+×t/F£ÙYvF£´õ³ïµÜì¥Õjçô[*7òÕa¶ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_81_2.dat b/lib/phpqrcode/cache/mask_2/mask_81_2.dat new file mode 100644 index 00000000..17a9ac2a --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_81_2.dat @@ -0,0 +1,2 @@ +xÚíØ1 +À0н§Ñû_®KÉÒ©Vi!O\"á‘Aøˆ«ò]¯:‚x»‘çÃbWµ½1ÅuȦ&‰Ä_‰µT ΋6œH$‰ÒU^‰Dâ~bׯëb=gˆ³âžûXî­ÛÙ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_85_2.dat b/lib/phpqrcode/cache/mask_2/mask_85_2.dat new file mode 100644 index 00000000..72c74ff9 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_85_2.dat @@ -0,0 +1,2 @@ +xÚíØ1 +À0Ð=§1÷¿\—B7¡ÖÖOþ$á‘A0$â¬ý8W­ ¦ê­þwjguÞu¿­æ§Š¡R©T*u•÷SÖ§Ž¨æ•J¥R©ÞTóJ¥R©ÿRö‡ÕêÞ¢N¨æµ˜çVû \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_89_2.dat b/lib/phpqrcode/cache/mask_2/mask_89_2.dat new file mode 100644 index 00000000..06c9a4fe --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_89_2.dat @@ -0,0 +1 @@ +xÚíÙ± À0 À>ÓÈû/—&E*câÇQqâëÃŃ ªzf$òš«ÈËrM…ßåô„ß<ŽÈsa#d2™L&’?ïArYŸÉd2™LöG"ë3™L&“{ÊÙëRygw“;ÈúÊ ƒñÚI \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_2/mask_93_2.dat b/lib/phpqrcode/cache/mask_2/mask_93_2.dat new file mode 100644 index 0000000000000000000000000000000000000000..f5202963d69964d6d402d87515855f97fb868039 GIT binary patch literal 103 zcmV-t0GR)H+U?mf3IH((1i=1YWB&iSYr?gGcm@NrSPvE!3r5V0|K`gR^esJBL=U|p zCA*J9`claZold9I>6hu5#zF6@yLURBPN&o9dL&(sq|@niI{j|F;se@4&-NL5N8P;_ J=`Rs#W7tsZG`0W$ literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_2/mask_97_2.dat b/lib/phpqrcode/cache/mask_2/mask_97_2.dat new file mode 100644 index 00000000..38842b98 --- /dev/null +++ b/lib/phpqrcode/cache/mask_2/mask_97_2.dat @@ -0,0 +1,2 @@ +xÚíÙ1 +À0н§Ñû_®Ki·vH4 ’)ë_%s×_½Õƒd3KŽO1^ša†§LŸá,†$’H"‰$’KzRP—t[I&¯ÿX’ÝÍ9‰$’H"‰$’äIò$y’sI$‘DI$ɓäIò$»I$‘Dɍ%eëÌsò!¹¼=—™‚äLAZ5—œ'å̓IVý“rîn¸»/2oƅ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_113_3.dat b/lib/phpqrcode/cache/mask_3/mask_113_3.dat new file mode 100644 index 00000000..023b2730 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_113_3.dat @@ -0,0 +1,2 @@ +xÚíÚA +€0 DÑ}N“ÞÿrnDëÂFj2úK‚ÂÈCÂt?W«ÜݲîZ“iêÀ.qÕÁ‹ŒoýP ô¯ªª%SmjÕÖÂ7ËÞ¦‹:·©ª¨¢Š*ª¨N©Ê:@¤:݇·ìýÁŠ¾º•*€¹Š*ª¨¢Š*ª¨f©ÒW9dª2˜«¨¢Š*ª¨¢Šj–*}•S@ Ê`®¢Š*ª¨¢Šj½ªæ¯à§ª6ðJlº¾êÑ¿Ã}ÕÕ}ÕÕ§€•T‹¿UßaÈ24hnt \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_117_3.dat b/lib/phpqrcode/cache/mask_3/mask_117_3.dat new file mode 100644 index 00000000..79cc04d1 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_117_3.dat @@ -0,0 +1,4 @@ +xÚíÛ1 +Ã0 Ð]§Qî¹.¡xIÚB$úŒ‡€Á?~!É<ÇQ?ß#–ç¶Ð5µ/tIÝJ8owøié{áßçâ¬}£Sø˜^ã~‡¢½q猉P„ &L˜0áJá¢î1ÊúϻݢðD×K'¬J¨Ã„ &L˜0ᝅõÃn +«ê0a„ &Lxgaý°Gƒ°*¡&L˜0aÂ{ +g{è¡Ÿþ2¨ë‡s¢Ή~˜ðì7\]%r¢Jôö9nZ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_121_3.dat b/lib/phpqrcode/cache/mask_3/mask_121_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..aff5a7be5dbb2ea59135b972a31de3dec3877f89 GIT binary patch literal 212 zcmb=p_4c+Q-(dwFh68i2Tm1hYBYs6qc7az@=PAWDkCizVq0?+t7Om4wtq;3tyIk#F zy5GK%&h#wvb64#0Vy@VU|D7&ef7h~HH9KE;>-~Ih^HVEgKLuZlO;cUwJKHSx)|O2B zFzfxyYi|AgTNeL2=}VZ;Ev?R7P^rty{%*guOnUQ^gxskvcVQYX$3@&ONuIXHIa)Pv zd*)?`uy^M1DbmmD%Zo4AT@Sf`A^-TAmugk}r7i9rS@ZJQ!dsI6-_8j2Oj_vmiRt9J G3$_65-fl?% literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_125_3.dat b/lib/phpqrcode/cache/mask_3/mask_125_3.dat new file mode 100644 index 00000000..e2febdbd --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_125_3.dat @@ -0,0 +1,2 @@ +xÚíÛ1 +Ä Ð~N3Þÿrۄ]·‰BБÝ'?<Âà/̼VÛµ»Ýóþü¨ ïҏ”¿ÿ´…<–’0-_±Jä[¥ü?† +wÔÄ^;*Ãyòäɓ'Ož<ù’/9ÏÏɯì9±<áîyÓƜ'OžxFrjdA{$T!&?~Jee~GOn@¥ùz†Öô#EŠ)R¤H‘Z@ªbÂl-)ÌÝ¿ñ<ߧ*©OURŸ"5&•ö›š5ý*iúeÎ J]®+ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_145_3.dat b/lib/phpqrcode/cache/mask_3/mask_145_3.dat new file mode 100644 index 00000000..338b7e7a --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_145_3.dat @@ -0,0 +1,3 @@ +xÚíÜÁ +‚@Ðý|Íóÿ®”•:Œ^ñ ³JyÌ¡¤ªyM§î×j‹×-' +9¤V—SÛýÖ¦K¶©9ëÇe¬µ)PíyUûû¹£wËeÞ-m jÔ¨Q£F5jÔ¨RËiÙ«ÔF4×_wk}·0+µµjRBR£F5jÔ¨Q»ƒš¾¦eßOMBJHjÔ¨Q£F5jwPÓ×´ì˪IH I5jÔ¨Q£FͳÇúš–íÙc éw5jÔ¨Q£FíµŠ:¡œÿÑzS«Ž*2¤¯UZ_«¾CÒ×*­e_Oí´ïZ¥%dIȯûâ†b \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_149_3.dat b/lib/phpqrcode/cache/mask_3/mask_149_3.dat new file mode 100644 index 00000000..30bc5fab --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_149_3.dat @@ -0,0 +1 @@ +xÚíÜA‚0Ð}Oó¹ÿåܠ⦐Hé ¯éô“'¬Z×2{oVÛ|Ι«%µ™ê>‚yû·R{‡!8îäÂI+JpI|#¶Ýfì–5κ[âP A‚ $H Á‚Q}ð)Õ&<¹÷E‚§ JQ)J A‚ $H Ás5zþ¥¨%H A‚ $Hà4A^£ÿ5A)*E $H A‚ $è½ Þ3ïMHQ‚ $H A‚ç æü3Þ§`ÞP¯©®o¢Ý>X{טÔè+±ÑWb£¿¡àìß`IÑã)5׈%dš \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_153_3.dat b/lib/phpqrcode/cache/mask_3/mask_153_3.dat new file mode 100644 index 00000000..89cdec03 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_153_3.dat @@ -0,0 +1,2 @@ +xÚíÜA +Â0Ð}Nósÿ˹)7mJ¦õ…,Å}8µêX=c¿W^G“e’ÝNóE;R(13DFEx15%o)(+gL2|3uiEv#I;;|4`apdpkS*^~xvLf_IwePW`Q`R8jLgJQhVasX}og%bb( literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_161_3.dat b/lib/phpqrcode/cache/mask_3/mask_161_3.dat new file mode 100644 index 00000000..72a26a4f --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_161_3.dat @@ -0,0 +1,3 @@ +xÚíÜA +Â0Ð}N“ÜÿrnªF±ÑTká…,„€NûðÛ ÄZ—Ñ’f7J÷:³Æ’^`WáٔU×á»nXÚ¤¼Ç§M-½¾‡™#V¹¥+ß¡ËÛ+9z–ÜҖYÒ l”)S¦L™òo•cŸ±¯Ê±O_Cå?ß©õ%Ê;*Kl‰M™2eʔ)S¦L™2åYeý²]ÊÏÊ[bS¦L™2eʔ)S¦LyVY¿lW„òGÊ[bS¦L™2eʔ)S¦LÙÙ +ý²]g+$¶ßeʔ)S¦L™2eʔ­Ð/Ûq¶BbKlʔ)S¦L™2eÊqʙÿ‚þ¨œ]à­Â£{ÎA¿¼¦œÔ/×ô~¹¦ïŠœV9ï»\%ö÷‰[ãP¯#' \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_165_3.dat b/lib/phpqrcode/cache/mask_3/mask_165_3.dat new file mode 100644 index 00000000..870af8f4 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_165_3.dat @@ -0,0 +1,2 @@ +xÚíÝA +Â0Ð}N3¹ÿåÜT‰ #ØZþÀ Y¥uÈÏ­:Æ̛¯1–ϱE®Uæ¹TÙT|SüþÒ·Ô ñ ¿qž)òm-sG²øì ¾ ýBæÈ.C‘ĉ'Nœ8qâğâáÿÕ÷âwv7û[Æç'„tgÄÿ!.Õ¥:qâĉ'Nœ8qâÄÄõãv`ˆ_+.Õ¥:qâĉ'Nœ8qâÄÄõãv`ˆ—êR8qâĉ'Nœ8qâΤèÇíÀ8“"Õ¥:qâĉ'Nœ8qâĝIяہq&EªKuâĉ'Nœ8qâ½Ä+¾È9:¹}kFT?^úñêЏ¿G¼Åo<0Õ«Cªg/æ_ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_169_3.dat b/lib/phpqrcode/cache/mask_3/mask_169_3.dat new file mode 100644 index 00000000..94310952 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_169_3.dat @@ -0,0 +1 @@ +xÚíÝA‚0Ð}O3Üÿrnˆ¢‰ñ·¾¦ ¨)}á'3ªæ1EÎÇh‹ßÑ]î4üP[ £_«ñÁ¥]Kvè‡<Ã˙fpý©#ýûª¶y_Êlù[œgëe£ôéÓ§OŸ>}úôéÓÿoý ªµ%uJV/µ°“{¿„þ—ô%¿ä§OŸ>}úôéÓ§OŸþ¨úê}Ýú§êK~ÉOŸ>}úôéÓ§OŸ>ýQõÕûº=ô/їü’Ÿ>}úôéÓ§OŸ>}ú£ê«÷u{èïחü’Ÿ>}úôéÓ§OŸ>}ú£ê«÷u{蟪/ù%?}úôéÓ§OŸ>}ú¿×¯.N4ÿ»áƒVMm–¢R³•š¥‘ø™Òá¸t(1ï…¢| \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_177_3.dat b/lib/phpqrcode/cache/mask_3/mask_177_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..9586979a1f9d74c4e115757feeeabb74819df45b GIT binary patch literal 312 zcmb=p_4ckK*C7KDmJ79hlkfa5%Jb^v=;WB?Q=`hguxbC(hf6kRuDyQoTio}+UFQXv zzYC}H-0`hx>pHl#M}PCVx?h`vgGKGt$xx|wRV!3 zfoMp8BP)#fxJc>g$uD7oUs9|>H)gE5sHrt=^#lc>7A~z73z`r_mvKnO#w`)M&Z=su zbg*n(k1PjN^&?s|N=H{r^nS3Sqe@3D+;oUNM?Y$9iHOp<`z#Ekc_EUqAPXMxfb>qw zEAHgtRC0WyjcRYJR@RjRYnSlaR2M&;SL^DVy)i4Q+x2LaXy<=XYjqD_?+J5e|6#~G HtjGiaa;}E0 literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_21_3.dat b/lib/phpqrcode/cache/mask_3/mask_21_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..bcb4eec4919b60e2c25c4e18ebb9c34423536b63 GIT binary patch literal 60 zcmb=pWo*#EQOIfiJ63sVS+xNu1fplLAA habXVvLtL={H4TR*l1wwiWg5b#xHRE54FHDyc9;xW9FqV5 literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_29_3.dat b/lib/phpqrcode/cache/mask_3/mask_29_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..6150ac1289809bad7646c662dd9cf836311f47f8 GIT binary patch literal 75 zcmV-R0JQ&j+A}bK0z)JO16&9u7I`jwl1Q?&GZ`D8$YeOr5DVhME(}Fn_#_QSO-42g hU)nIl9)oZ$?ieJ~WF$A^k;Gv#QfT0j2LK0SpN7|C8+8Bx literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_33_3.dat b/lib/phpqrcode/cache/mask_3/mask_33_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..6053b5e396ca957ae26193aceb85d08a43dacd9c GIT binary patch literal 79 zcmV-V0I>gf+A}bK0z(W00bB+MfK>sq3hWAyRM5v3T!1RJz`2Gv5EpJKDB>cdVAPhO lW(z#c;7?-^TkxkbL)`g=Dz?D=LP!BVTMUV{1pswi&V8ytAOipZ literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_37_3.dat b/lib/phpqrcode/cache/mask_3/mask_37_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..5dea5b9cbe14fcff482e0fe9a647359aca07547b GIT binary patch literal 83 zcmV-Z0IdIb+A}bK0z+&F3b+gq0H-2kRd@{JG8i};@d2vZ2XK(!(BO=uY7eM-(E6p3Zv0bsQxl5nw^V$$JC%}Bqlsj9DvDo{aE;P>E# hYO*WtyB%t`BNs_$5b6wWqgwwJ)C%Io3LZM{#-RD-KY#!L literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_53_3.dat b/lib/phpqrcode/cache/mask_3/mask_53_3.dat new file mode 100644 index 00000000..8800beab --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_53_3.dat @@ -0,0 +1,2 @@ +xÚí–K +À0D÷s½ÿåº ­¥‰Ñ! -(.Bp&|ˆ"-t–&`Æq‘Q-"†ð9Ù_+)Be/H8¾ãD®¼%‘a~šÐ}spKFN˜úöœ¶Ö=,ÂÆ;‡;a^tª4÷–‰Ï\™ÞF™ÎáÂÀÊÎSNé§éâ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_57_3.dat b/lib/phpqrcode/cache/mask_3/mask_57_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..4e1e5da386a57dacaf76f93d05473ff922574488 GIT binary patch literal 126 zcmV-^0D=E_+U=Gx3cxT719!hh{{QE?gyNwnmS{-_8xJAm$PtVPuqu0fSCq8`R#F2C z`Jye^+}fgNtCnh;u5A$xa)x*4$m(#xu^rp7Rcwt+;I=%SqH*TgTz7#%(6RO)$6#_BUJmZJUz-cM|kVFF3Ae8Lopr+yDRo literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_61_3.dat b/lib/phpqrcode/cache/mask_3/mask_61_3.dat new file mode 100644 index 00000000..bf1a3cc7 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_61_3.dat @@ -0,0 +1,2 @@ +xÚí–A +À0ï¾fýÿçz‘4-%š•Ò*Ãâd°Ðpž!ÝyZÜ«‰æ‚uäõ(ù¸~ë=¹&Éۓ´‹)œÌR2â"/ò"ÿ<9çŠFΊ=r§þbòšó"/ò“ƒîÌíçrw¹"2®¯¹ãçÈøùBòèŸ#3-Ø0-KÀW \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_65_3.dat b/lib/phpqrcode/cache/mask_3/mask_65_3.dat new file mode 100644 index 00000000..85892089 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_65_3.dat @@ -0,0 +1,2 @@ +xÚí—Q +€ Dÿç4»÷¿\?R•Û …Å,û!¨OŠ²-òNv®Í1 :Âc¡Zœuï Ú"U‹MÕF ~jK¨€´…-la‹[^q^³Q\éœ=…o”-la‹ÿZpUÒÞB¬„äÿ ±@IµÖKµJzÉ¢|1Í¢ ÷¹ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_69_3.dat b/lib/phpqrcode/cache/mask_3/mask_69_3.dat new file mode 100644 index 00000000..55318a87 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_69_3.dat @@ -0,0 +1,2 @@ +xÚí×Á +€0 Ð{¿&ûÿŸó2¤'—®dô l†=,¹F½îéy;$§ì‡¤”WEË-R„Š¨³:¢¡%T,O2½×g…"Ä"‹,²È¢/DÍyĈ˜¹ôɧ{þO䮳È"‹,:N„vÈEñWNÎ#(&,ö,‘䕺Š®ë]æx؅ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_73_3.dat b/lib/phpqrcode/cache/mask_3/mask_73_3.dat new file mode 100644 index 00000000..15be77f6 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_73_3.dat @@ -0,0 +1,2 @@ +xÚí˜Q +€0 Cÿ{šìþ—ógè;è¥JJ?dÔ¬K„=ÚRaÃsJhTJ6exÎkaºú¥§\$é‘n¯´IE,-/ÑÓXB¢è*х=ËâžíÚÒýweeé4™¢è¸tÿö̒tšLщî«t t”ß«œèà¯bž –gF…fž ÖáqºõoÖd¢Ðdn-ð? \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_77_3.dat b/lib/phpqrcode/cache/mask_3/mask_77_3.dat new file mode 100644 index 00000000..ec782804 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_77_3.dat @@ -0,0 +1,2 @@ +xÚíØA +€0 Àû¾&ùÿç¼­BŠiÖRaK"té`I@³¶|¶º…fX—ö±Ôâ­yiöåólõE‘:Sza18G¾À‰if˜K*©¤?–:YÜC1쌞졘(ቷ—êöJ*©¤’¾’jÊl*Õí•TRI×KëÌîR^ؙæœÞksûÂ)cÌ)cÌ)³JZø¦¶óí¥äãa· \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_81_3.dat b/lib/phpqrcode/cache/mask_3/mask_81_3.dat new file mode 100644 index 00000000..47bc0f79 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_81_3.dat @@ -0,0 +1,2 @@ +xÚíØ1 +À Fá=§‰÷¿\‘,JÑGAúÄ¡‹ýhjÀÌ>ÚÙ#Ê3X™À’ø:çk÷Ô¹\ûFM JÝhuÇú½3¸¨>ƒT­ZõŸÔ{ÇãPSgøP'¹ÉkÔV¸jÕªU«¶_Û¯ý¯U«V­º•»=P Îo†O:Wҝ‹ÞäÝjü[ŸWxÒÎmò Ù5 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_85_3.dat b/lib/phpqrcode/cache/mask_3/mask_85_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..02c4f8cdbbe43a99de71a77162d811d36ad4f51b GIT binary patch literal 160 zcmV;R0AK%j+U?m(3V<*SMbUXy^Sb}dIVrU|sn!>N+|q$Y2;pF8P^qqRd9N$FYg^Jj ztFhS7{Q{@rM+N5MyIOtAC{U6F+M{SU#kj+puI|W4iU0x#Ab>!sfcG@40`85I_KdmkG#TsrP@uMqv1rdge4##%ZWgv6J(FGUkB?1g^dV O%IE@ppbHjj!&bK*zf9i% literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_3/mask_89_3.dat b/lib/phpqrcode/cache/mask_3/mask_89_3.dat new file mode 100644 index 00000000..2b4cb59f --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_89_3.dat @@ -0,0 +1,2 @@ +xÚíÙ1€ …ὧ)÷¿œ *.@àUÁü ƒÓÓ|±¶‰î¹’âeŵ6Û¢‚‹äw5*÷ô) oôi¨K®‘¢4nk>Áè1}d>œÐ@ 4ÐXYC¾oœò Û¡1<º©A§ h F„ûÆt +ß 4Ð@µ5´—ž1ÁWrÒï>7û«û†Gíµ}}¤¡x7|ÇN‘gÆîÚN \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_93_3.dat b/lib/phpqrcode/cache/mask_3/mask_93_3.dat new file mode 100644 index 00000000..b4cc8a97 --- /dev/null +++ b/lib/phpqrcode/cache/mask_3/mask_93_3.dat @@ -0,0 +1,2 @@ +xÚíÙA +€0 DÑ}N“ÞÿrnJɪQš~éB¨Œú06 û£n®aá¸<<¦×‡‡ôÿe6×M—R™ýCùÅPÈ ¥LÀ±ô̓išØ9MŽ 2È ƒLkÅ®½dD»v*ó"a·ÔX†jBdAdªdèôZöÀTßdAd®qYø0exö÷ö¼Ÿqe§çÊN¯«Œú©ª&WV“ææQvcô \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_3/mask_97_3.dat b/lib/phpqrcode/cache/mask_3/mask_97_3.dat new file mode 100644 index 0000000000000000000000000000000000000000..7adc9ebaa77cfc3c6f7a54307a831fbeee0c87db GIT binary patch literal 175 zcmV;g08syU+U?rG3V&G`N=*G0-MD(Ga{FCK!(&5t$)O3EWmo!5xs*ixXZ zVA@1zxl+BnrYNa(r@cz9VNyyDD4l1cxytAa-_m)8y8uckp@b4jD53OrC10xSQX0*J zF=dt7h5IPcalDsMLJ1|5P(o>6B~s-^N^~6WC6rJ?2_=+%t0e0VeE$jDlr;7Ux}BHg dPL&$iL~p8;J5{b%n)WQo-EsPG#~oB@^PHSYS7`tM literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_101_4.dat b/lib/phpqrcode/cache/mask_4/mask_101_4.dat new file mode 100644 index 00000000..1c97dc04 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_101_4.dat @@ -0,0 +1,2 @@ +xÚíšA€ Füÿs^1 b¤‹ÆáИª]ÃØÖ4šm+Æ8Ð+˜Ve¬Ä^H­R]–\Íc‡®ŠÛ +·oõWN#¸îXáéØá+l𠞭HE³cp \à—^.Î9qñW9ø¼ïç"ò…:¸À.ŸæBßÿó÷ùBƒ \àæ0Ìa˜ÃPǨcp \ÞÍÅïO•’‹N¥qjpGÖô}“ô}¥Ê$.ä˅Š§ÐŠ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_105_4.dat b/lib/phpqrcode/cache/mask_4/mask_105_4.dat new file mode 100644 index 00000000..0211cdb3 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_105_4.dat @@ -0,0 +1,2 @@ +xÚíšK +€0 D÷=Mrÿ˹‘øA …ÎTáe‘EFóL2 #ŽÈÌé¹¢…_I!“‹•ßú­£ç딤Ѻ““Î-Õ«km¿Oñá]sS T6*ùª'8Á NŸâ$Þî'N¥Z‹Êí^œXXh%Zrr$W¹}rûäÖUë*GŽ9r|ºcÌ[Á£cNâ¬Þ[_=Æ׫5¼^ÍJ¼£ù¸ 1*ôq›v \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_117_4.dat b/lib/phpqrcode/cache/mask_4/mask_117_4.dat new file mode 100644 index 00000000..38672591 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_117_4.dat @@ -0,0 +1,2 @@ +xÚíÚË +à н_£ÿÿs]4Ø¥©Dg¤nò¸à‰2Jj}´ÖÚÒ¾·RsSWG¶R¿ŒÉ§†žÚ)5¬»ÞE†áämá#ܯ•ã¾Õðk_"ÃzŸ”š3Â\¹råʕ+×r ­L»k|ê/{„¹;Ž'×àÔjk^zGw=K_GJACF5KEX*@<$z}?p^YqOrD6l{pq{+`&l7JcHsOy z_GM@Ox_x?b=y>Jqe}Ao?uX%DM`IXJr{-ZaqKAvlH`*6wj&*7((AW$y+_m1`VYgIgEyrCkW+Vc literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_125_4.dat b/lib/phpqrcode/cache/mask_4/mask_125_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..b98dc813afe773cdcd71a8779391ca295c0d3a51 GIT binary patch literal 213 zcmb=p_4c+S-ysD7)(f`F8-K^2;|+^RST%8G)>;-rsHGtPebu=wvE(Rqud?@Jdiv-z32@0r%Fa7(4|DUhVIr-8&`h2IF>D|wlymv&u|5gc>1uLtXBe(o`B(jjL zU;pLDUo3v_shtNkChn^3Ki;iZZS8BT4}Mgedi!xzR{!b=ahL8^+0UC-$jr|$aq=Dj DA0&Li literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_129_4.dat b/lib/phpqrcode/cache/mask_4/mask_129_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..8ecfa250845e8ef1add89a66c88fc9f31250a436 GIT binary patch literal 220 zcmb=p_4c+kU$cP#%Y}Q(H@>gmX_E0-a3R;c&@UP>6Fhnzw0;$t`MGk<)@^G`dv2;9 zJa>BiGETqum$vWzzWVcDA(y^F$>O^;cE3bkZ7!_If6o7~R(2)#^;-&#|1=8@FtW=O zT)5zvG5y;kg&7OBX?Mm(S)NeKczodZftUvk%zPFg;tOl7WBdj2GpxmpM2j^4FA?}L o{bhTz9Ot|H{BduueXdPB_S¢Ø/œ#\pÁ\pÁ…>¢è#ö ç\pÁ\p¡è#úˆ>âqŽpÁ\pÁÅ.º¾$¿ºÈIqü𽤠dô‘ÑG’R»°_4¦è ò€˜ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_137_4.dat b/lib/phpqrcode/cache/mask_4/mask_137_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..0c09c487c2e85488f8caf2dcc863e260cfd077d4 GIT binary patch literal 248 zcmb=p_4bYxEjs$#?!2-R}~*>9$YZ>m}P8_SPSlc>J(ZYVC8? zO1oo*K1q`<^UtZRwccRy_UiY^lc)4;t3SOfES@w`rW=l2^YbTRO$JKN#b*jQw`{%rV(;`b$vL{4 zXRQkQ#dOtY-ox+n-*;b@wS2d1)2vU1rN&=NV*fwfSo>q^jJZKc}*2a`@ScXA0|@PM!+Z)$&&j+uR`i+&96LlQothXU{Gd06E`pF literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_145_4.dat b/lib/phpqrcode/cache/mask_4/mask_145_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..33fb211249fd13955f9481a5af91416b0850c79f GIT binary patch literal 255 zcmb=p_4bYjXH=f@| K¯jò´oé ¾ªý|¯SªŠSWKùZmË׌ºƒÃj鏾€Ã\’Š¹çЪ2ï W\qÅW\qÅÕñ®"~·ß× ­jvÚtòê®òªŠv¥_Ùíƒ\qÅW\qÅW\q%g3Èä ú•}+®¸âŠ+®¸âŠ+®ä r9ƒœA¿²rÅW\qÅW\qŕœAÎ g3èWöAû W\qÅW\qÅW—«œÆ]åVµ~v{êDŸ™3ÔȜ!¹ªƒ\éWÇô«¬Â^<ír/ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_153_4.dat b/lib/phpqrcode/cache/mask_4/mask_153_4.dat new file mode 100644 index 00000000..e827dd16 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_153_4.dat @@ -0,0 +1,2 @@ +xÚíØ1ƒ0ÀÞ¯ñýÿsi,')p!äµ4.ÜГ;±½¿WUmßçj=¿²„²ê°Ê.NO¾þ>úûšçTµÚ[÷¾S7vÜۜg¶q•„?æ÷ÞÒ +š{pe¹o“3Î8ãŒ3Î8ãŒ3Î8{ØYXzðá,°²Û_úO¤ÓYfeñÎô3sÓÜäŒ3Î8ãŒ3Î8ãŒ3¹†\C®!×ÐÏÌMs“3Î8ãŒ3Î8ãŒ3Îär ¹†\C?379ãŒ3Î8ãŒ3Î8ãŒ3¹†\C®!×07ÍMÎ8ãŒ3Î8ãŒ3ÎÎq¶þÚé,»²ËmMrs›k¤Wvœ3ýìÀ~–WÜ €WB \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_157_4.dat b/lib/phpqrcode/cache/mask_4/mask_157_4.dat new file mode 100644 index 00000000..ad5fcf69 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_157_4.dat @@ -0,0 +1 @@ +xÚíÜ1Â0ÀÞ¯ñýÿs4˜"FPà=iRX¢XÉÛ0ç멪€u 4ftÑÖl}Òm¾øßýžé➭»Sû|²ËюëSÌ û¶ŽÄPÏ5<]öÉrÇwÜqÇwÜq÷£»È^QáéN6ÏûáéZ¸sߙ³æ,wÜqÇwÜqǝ>«Ïê³ú¬ûΜ5g¹ãŽ;î¸ãŽ;îôY}VŸÕgÝwæ,wÜqÇwÜqÇwú¬>«Ïê³æ¬9ËwÜqÇwÜq§Ïê³ú¬>ë¾3gÍYî¸ãŽ;î¸ãî[ww?P3Üå§ÛþòÑƘÝggtŸí®¡;÷]ûû.3àw4A¯ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_161_4.dat b/lib/phpqrcode/cache/mask_4/mask_161_4.dat new file mode 100644 index 00000000..7604c454 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_161_4.dat @@ -0,0 +1 @@ +xÚíÚA‚@ Ðýœfæþ—s!AL€Ä_|,ˆ™4òl)iï¯mŒ²ßl­×‰0'¼÷ +E¸û…£ ÷–]N\ºêüxÅ#·‡§2Ÿç/ü¼_¬{—7gÛò9쏼ٷÔÀÖ}óï2‡rÈ!‡•?}-³#T—Õe9äC9äC9üÀ¡~ùöý²÷6Sʇ겺Ì!‡rÈ!‡rÈ!‡æôËÞۘsÕe9äC9äC94ç _öÞƜƒ|¨.«ËrÈ!‡rÈ!‡šsÐ/›s0ç ªËê2‡rÈ!‡rÈá8ì§}D‚ÃÎìçw£ùýrï—«DXΡ|xÃ|˜ä!à2ð \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_165_4.dat b/lib/phpqrcode/cache/mask_4/mask_165_4.dat new file mode 100644 index 00000000..d83d6316 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_165_4.dat @@ -0,0 +1,3 @@ +xÚíÚA +1 Ð}OÓÞÿr.ª"Ñ*?úfÑÅÌP‚óLHIï—kŒµÎ«õZQ¦…8 +Gy÷êqkñ-ž¿ÿÎn5£Œ½Ú+?ÌÒñùù¾Ýâ¿ø|֎÷Òþà·kKn®E¢¬ñŹä’K.¹ä’K.?ï2º£˜.ó£|¼EJ§{å2<Ê:.åKu\ç’K.¹ä’K.¹ä’Ë—úñ¿êǝmu)_ªãê8—\rÉ%—\rÉ%—\šÛЏ;'2·!_ªãê8—\rÉ%—\rÉ%—\šÛЏ;'2·!_ªã\rÉ%—\rÉ%—\rinC?nnÃ9‘¹ ùRç’K.¹ä’K.¹äò;.û²óHqY'ÊݽéþN·F?ÞKô㕢,êR¾üé|™è My*3 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_169_4.dat b/lib/phpqrcode/cache/mask_4/mask_169_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..4aac95c1e3fc9ba5257f331564b211fab568c376 GIT binary patch literal 297 zcmb=p_4bw{7n30m>xEkX%lG~l?V3;+6CwFBVc+Mpz`!LezkNJB-=9zK3Cy|6dc7)c z$=5@7j?a{Q`J_AleCn>hU3Whz>;A1NtE#vC#=Q1!Zp)m1?|$5V9DCCK-|1Vc*mtaT zocL^x-SRm_r!-;2ueFy?#eVr#8L;Ge>5J}i?kE{?B4PtL69K8~&|}TJq5E>1FRHmwz3+$1r7q GdJ_PDBBetB literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_173_4.dat b/lib/phpqrcode/cache/mask_4/mask_173_4.dat new file mode 100644 index 00000000..9df4d865 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_173_4.dat @@ -0,0 +1,2 @@ +xÚíØK +1À}N“ÜÿrnÂa øÃ~ZY!ÎÐJÑt^ï×5Æ(¸/«õÌjk–z[pjµ§_Ø?~v:|jwúՖ_mû£îXzòoõ–Ó6?nËÞŠ<ö°j³$pË-·ÜrË-·_p[z¾=ÞVíæ–Qí¦3ÝæTéV¿ÕoÍ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·Ür›æv­æ6¯Ú÷ßý?•,eå`=*K¬6Ú­~û§ý6£à ´*× \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_177_4.dat b/lib/phpqrcode/cache/mask_4/mask_177_4.dat new file mode 100644 index 00000000..6437d251 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_177_4.dat @@ -0,0 +1,2 @@ +xÚíØA +!À»¯Ñÿ.1B„éMyð”![ c÷þ\cŒ²ûZ­çV\¹Üq“Š7ßâÝEó‡Oýzg~ÅkëøË¿jž;pg”Šu²Í[*7Š×½¥ºöÀŠóTpÌ1ÇsÌ1ÇsÌñqÇ!¯ÿ‹ã Šw/òr¯ÿå8«âXÇú±~l®à˜cŽ9æ˜cŽ9æ˜cŽ9–»ÉÝänr7¹›~l®0WpÌ1ÇsÌ1ÇsÌ1ÇËÝänr7¹›~l®0WpÌ1ÇsÌ1ÇsÌ1ÇËÝänr7¹›~¬›+8æ˜cŽ9æ˜cŽ9æ˜cŽånr7¹›ÜM+8æ˜cŽ9æ˜cŽ9æ˜ãtÇû§oEǙŸÉN¥Xy¹[ËÝR+¾‰cýø¯ûqNÑ\,4J \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_21_4.dat b/lib/phpqrcode/cache/mask_4/mask_21_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..e006b67e4419e056f5a3fb4b7232769ee9976232 GIT binary patch literal 57 zcmV-90LK4#+A}af07Dpq%K*Qqp&?w5peQNkA_J1lg(?A)hA@%~nFA+rh~hK>%^4`7 P=;q=RrH8oyopw{-jJFsR literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_25_4.dat b/lib/phpqrcode/cache/mask_4/mask_25_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..0c7c44bbb5bb50a1f060373ea3ca14d083fe686e GIT binary patch literal 76 zcmV-S0JHyi+A}af07FAV1c%Fjuna^PAxDf1Irg9fvh0EKpc;@!E_4AniAM&vX|%Qn i>NlJ|HN*%VIGY$5BJ4r(4;Eo;_F$1gmjnRDU3Su2%N^nX literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_29_4.dat b/lib/phpqrcode/cache/mask_4/mask_29_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..c28dc20e8248d196503c88e3e58b9048de750a16 GIT binary patch literal 78 zcmV-U0I~mg+A}af07FAVI0*(^2E@r?NRc2*iM`kWMfO73Na9E&7dAmSNkA6A$s@yF k1DFWbSimBS8G{geiIFARUKIc0kiuy%rYtrE0Gke<<${17%K!iX literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_33_4.dat b/lib/phpqrcode/cache/mask_4/mask_33_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..5834b6fb5672ddd54227a5229ad248efb56f9931 GIT binary patch literal 89 zcmV-f0H*(V+A}af07FAV1PK%5G9X?BinJkI0ZA&T;SOAYD(-+P$1ng+a^aGIlSHT> vY|E%S29rDBDF$Z>!lD9ODl{aRP7U#;Q^M{*2@gEd1l)nH0+%8HgW}HuoFyU1 literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_37_4.dat b/lib/phpqrcode/cache/mask_4/mask_37_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..4bf2e26ed0238cb7f0fa88b4a2e8d9f607c6c465 GIT binary patch literal 86 zcmV-c0IC0Y+A}af07FAVG!hE93`kRjsRW^pR8`b;7d}8$cR_hr3_>Eg@JYf+B2^J* sQ04GUMNxbc& v?i_XJs5{AZrvXfsV99_*CH~R|;!aXkQtVEY@FYSRQSQW4Nk}mOMgc#BT0kV* literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_45_4.dat b/lib/phpqrcode/cache/mask_4/mask_45_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..1b921f3009656cf429e67486e59237b8dd15ff5f GIT binary patch literal 120 zcmV-;0Ehp0+U=A<3IHJpMfaXY?|-@3gj12@{}N1#TnN<@9`Z@`Ei+qoFVPwup|*kU zpmqSgF*>cacXR`pI4*58TFBT1fxMG6XL7wac>{^GqK!9Q$bqGK7QU=)P)>BL}k8 eRu0aQtjeU@>+_-I`CuK_9H00P-1Gn#s>kM_-9E?w literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_53_4.dat b/lib/phpqrcode/cache/mask_4/mask_53_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..7e88826dd67c8eed58a77ecc7bd6326cd996537c GIT binary patch literal 128 zcmV-`0Du2@+U=H03cxT31^1pt?|->=VN(l5e9snI(1i&h1DSjzs%My4l0%60s2sV1 zUFvoM>Q$%8k$LTH-z$uZ_X`^svLKUJCMj-(<27Edc$MCl9xf#1?;NQB?uAn=uepcg i^-r(*&mns8lo?t9xVoWK-RMw{czy1?FmMC1XBA^pK|VMD literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_57_4.dat b/lib/phpqrcode/cache/mask_4/mask_57_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..84669c7d65c97c0b040497b32d3d3037c70d826e GIT binary patch literal 130 zcmV-|0Db>>+U=H04uCKSME9Hq?teKq4gQfCYGNWRShRhHSItD#wao0Xdx_S`3}%zb z)6ua+cp@ZJk!QRPPwS|R$7C*c-vtG{7f62E_H57pdBSPpo*a39C`!$ZCqdRc`@3z= k_I%kB_3cxT31n<5^|NpsON^2;!>e@qKa}XLb#Yw^v)q9v(qB=lyhR&g$ zouh+=UGEBA9-;T^egK`j*5&+4Z}?KB16>uQvCipDZ+dUw-O4os=_q+W=RtbJoA;dF m^rrXIyZXXjy>U8x$cKrH<+(z6K0*KBy}^0+esBPHn8I@q@JM_B literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_4/mask_65_4.dat b/lib/phpqrcode/cache/mask_4/mask_65_4.dat new file mode 100644 index 00000000..c24343d9 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_65_4.dat @@ -0,0 +1,2 @@ +xÚí—K€ D÷œ¦½ÿåtX£Ð™.4ÓE1^ÂãÓhv†»OæÍx„ùéW“ð0 ñ°JHÅ»‡½­ðz[ÿ^܈[vâȾ +yy‡ZÀkß=`„™êv·cíǃî…<ȃ<üÚCî/)zàܑ×¯× ¡ÈÃÇÎC²Œš"" \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_69_4.dat b/lib/phpqrcode/cache/mask_4/mask_69_4.dat new file mode 100644 index 00000000..a73b1144 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_69_4.dat @@ -0,0 +1 @@ +xÚí—;À0CwN÷¿\—ˆ~¤¨;C$3°$<)/m­ºß¥žeÎ¥T±‘2  —:¥]ÿ^VV¡%ƲzAïnÈpv…s"y‘y‘y)zöá¤dÄu6½àª½Gú¾È‹¼ÈËi^šÂ/<ÊtÓrÂrrÚ)9ͤlõrìó‚.¶‡Ö \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_73_4.dat b/lib/phpqrcode/cache/mask_4/mask_73_4.dat new file mode 100644 index 00000000..72f89227 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_73_4.dat @@ -0,0 +1,3 @@ +xÚí˜A +€0 ïyMòÿÏé¡´)1Ý-‚lE3š=Ô}¬ˆ(Öô°9ŸTÇdÎÒò–E/eO ZOžîãÛÅ»KíY;ÛúpS5Ð+‘ÄëNžäIžŠžà| +"©eìvúö+DݓæNs'Oò¤WŽkîäIž¾ð„ì†Ìž¸¤FúòrÜi9Î&óô«ÿ ‡]?ÃóA \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_77_4.dat b/lib/phpqrcode/cache/mask_4/mask_77_4.dat new file mode 100644 index 00000000..993c4860 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_77_4.dat @@ -0,0 +1,2 @@ +xÚí˜Ñ +€0Eßý÷ÿ?×ËjFe8¯0êú uØN©0Õ­µ‰lB´†6‡:«h·<½õ–§¥CÜe\,¹ †ìÔܗ~ø & rd0 »Sz£7z+ô–êoº»ÓÜþëäÝŽVâuÊ:¥7z£·Wo¿š ËÎSÖ)ë”Þèmoù3ë O‹y;:*h¥Þ>û¿a€ïCe \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_81_4.dat b/lib/phpqrcode/cache/mask_4/mask_81_4.dat new file mode 100644 index 00000000..dd652161 --- /dev/null +++ b/lib/phpqrcode/cache/mask_4/mask_81_4.dat @@ -0,0 +1,3 @@ +xÚí˜A +€0 ïyMòÿÏy‘XE m7"89ä 2’Ѹ ûQ1ݳÌëˆ+¸x‰x;ÅÓt35DIY÷¶1x\:už³ýº•}î¦e/ ê§Æ#ñø¢Th< +‰ùùU¤BzÔË<²×ì5ñˆG<’×ä5{G<⏢¿®5Äñ<饫>¯]ž×UÄr¿xuÐ ” Üû \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_85_4.dat b/lib/phpqrcode/cache/mask_4/mask_85_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..c8d5123e26909726dbd71694e1f6697cad51529e GIT binary patch literal 154 zcmV;L0A>Gp+U=P!3cw%?MR!k=-2ZZ2N*jmT*5nJN&mmxtH#~v~YIZJnPs9LfrlsbP zk*TK+4nE7TrIxLs*SC2W7zhg5zDpNC7h5Ilh$5=S0ABHmSG?ji)1NN$BI-ÜõéŸ+ÑpÓÓöH“öÈéÜ9ï¢DÞi \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_4/mask_97_4.dat b/lib/phpqrcode/cache/mask_4/mask_97_4.dat new file mode 100644 index 0000000000000000000000000000000000000000..5d848caade31141b6a6d238828e0513940b9aec8 GIT binary patch literal 176 zcmb=p^>&scSAzi$%llg2U;ocnYTk;AQoMQf@D~ArLUH5VhzlL*U+;ClQn_{Ld4Rh8 z>uTAu_q(T_ELu@IVU2P7<-3>5gi15Bf~CWkN@uS0RjmncZrXE$dhO>e3gqq;cwFbMH2i4?0P>DhOaK4? literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_101_5.dat b/lib/phpqrcode/cache/mask_5/mask_101_5.dat new file mode 100644 index 00000000..c21869e8 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_101_5.dat @@ -0,0 +1,2 @@ +xÚíšÑ +€ Eßýšíÿ®+£%=ÜM¢3Cbvó¸ Ѭ›«ÍNkû¹´gqõkqq{©%ôO¿ÒòüoçžùÈû,i–¨ÅKÖeœeçÁ3[›|‰îiž¶÷‡¾õ˜ã©V¥¥h]` Æ` Æ0¦Ê•±¸zË´TÔ0Gu×ì/qŒ8F®„1ƒ±3¶:WÊò>õ˜´#ŽÇȕ0c0öQÆ8»øE=F#Ž‘+a ÆþÄXÖ͞+cV©%9W>ßíQž]Tk©¹“Y-gL¸÷óq¬DËè‰‹Ï \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_105_5.dat b/lib/phpqrcode/cache/mask_5/mask_105_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..bc8798c64015b6595105a07645625a572c839c0c GIT binary patch literal 224 zcmV<603ZK&+U=S_3dA4~1n<6P`v0HHC0WDb$gbEE0yT;RFVdN!?Sm0#$x+d(-M&MH zb#RhAbEHXz@r$NR=-U3QPci-P|L%XEWG%ZUmG!BgbTK0LXu8R?&L*=*eAagQlk8Qg zsjyG52YayhPWDE5FUx?-`>CeAIbz1%-fVQSH_Cfi23+1R)r9Zid)&FO2Yavwd*nUx z9(fPn!}qvzVGs6T5BA7=v+3UUic`wTHUd>xK aP2TVA&wEd3Dq=6}&i9BW^E?1$d?(3j3x3!D literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_109_5.dat b/lib/phpqrcode/cache/mask_5/mask_109_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..25a394402fb8b1d0ebf02b85473522a21235736d GIT binary patch literal 211 zcmb=p^>&scSAzi$%lk^-Pyf$XZV2j*s`A*zF?pKO&MOlNBNgB2F4Ef5es`YjsdLA3 z1GmLzcQ4u+7wuKIGk@pLkJ~=o2#t=t|EsmEP`E4gbGg?&F(KW|<)*sao-4A2zw@dk z3W3o7Ln%e~oL=noQ``Tq@Y3g3w~o|0t6%gi0ZRhqKTiJP`A5a7)9;Xq4;a-6*>}!& z0V-}7~CRaH?+kXgI=m1Q4e>}I|^`+f56tjphW?I(xcpB?4RQpn(Z Hç=>ŒãÃ0 Ã0 Ã0 ÃOf˜z˜3Ž»=>ŒãÃ0 Ã0 Ã0ü.†3ÿ÷ïZ£$¯×·8\õp”ÔÃùw4½Çá:ã¨ÖZÀp¤:q¹ÖÄù§X 7 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_121_5.dat b/lib/phpqrcode/cache/mask_5/mask_121_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..9bb5c4158981760f99c1831c03ccf11a664e6053 GIT binary patch literal 256 zcmb=p^>%h3*AWFCm;c4Hp8T7ByMNb~P0`w->X-Iu1WibCj$>!PxYtGF(Dx08H@Bz! ziL_Mtn}1F*CX2(7=TOEDEbWKm# z7n3IwXBH>TO_bgSLC0^-+rs}kq59sv;^g0Fytmmr`w)|MuCvr_`^DT6m?EIk`)9ws z`TOnWP2bl(=@oqXJ10zcK~pjRkXgEU#Yr9g&b-C9Uzp__hM;esZ;0LBZFwcK^7XPb o>!)^ZQ#aoWuYBxxGe&=>)49shxbEDe|L3eseDs4sW73s<0HpnlZvX%Q literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_125_5.dat b/lib/phpqrcode/cache/mask_5/mask_125_5.dat new file mode 100644 index 00000000..2161c50a --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_125_5.dat @@ -0,0 +1,2 @@ +xÚí›A +Ä E÷ž&¹ÿåfc;S´¶$?‹‹”ŠØQ4ëáYaßhûyJ}9ºg=×Ú=©liŸ´.;nh_ÍÔýïwzýží.÷qôƒCW”¶üÏȧyº× uëÞë’PkÏ;ÌÃ<ÌÃ<ÌÃ<ÌÃ|*óqëùÎü,‡ m“kWæqçNÊl—%ª ŸÇçñy˜‡y˜‡y˜‡y˜‡ù×Ì×^Ïæ2䰅sX|ŸÇçaæaæaæaæ3ϙ9lH‹Ïãóø<ÌÃ<ÌÃ<ÌÃ<Ì¿›÷웁¿Ì[í¢õüên`ì™TíÚûqŠ¶8ó¡^—vôy©öŽ« \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_129_5.dat b/lib/phpqrcode/cache/mask_5/mask_129_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..f0c1d65020884c517fcba84b94191eaac350aaa5 GIT binary patch literal 259 zcmb=p^>(%)-(dqD=JNe+fBrw;rBWIY;l}PP(iGgY;6uuWT>&yOg;TY((|V7;4|rHz z$aHnxR5q=ee-{;mpS}6Fjz8)5|GBsR+cqxEkvegY{WD8>{;97#wkaFeC|)-I_*?FJ zdDOO73mlv68dxKM=*5vkTKXxHkABpxay&a{NAkk7uziscPg`}IW$x!MWZc)F|A2b~ z0~9@B{lrw+xCbP5#sezq5T~F&LHq>w52k$wdRTBP%uhX7dcHJE;G5lvJnQRETQ@vs deIFa2`wqnRlbR99G23{{r2|{+4tV*M007v5c@F>p literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_133_5.dat b/lib/phpqrcode/cache/mask_5/mask_133_5.dat new file mode 100644 index 00000000..46be8b09 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_133_5.dat @@ -0,0 +1,2 @@ +xÚíÜA +Ã0 DѽOcÝÿr]4%1mCTåÉƯ„Ð÷xΜ[DvÌ=Æá{Fúú–E¤Ïµˆäq½?Ý¿Ü9ûkeÑ­ù}±'2^ý•cœçš4G”žÛ:¶3=J£K-šôF0‚Œ`#ÿÍHÒþˆwð'#ß<{Ú~—Z4é :BG舻F0‚Œ`„áGø~„ŽÐ:‚Œ`#Á?ð#t„ŽÐw-Œ`#Á?ð#ü¡#t#ÁF0r·…ïÙ}Qõš}e¤üÝòR‹Ú;ø<ùçCžéV‹}ї‘ìó¢ËÙY-Hž \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_137_5.dat b/lib/phpqrcode/cache/mask_5/mask_137_5.dat new file mode 100644 index 00000000..064e7f2f --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_137_5.dat @@ -0,0 +1,3 @@ +xÚíÜÑ +ƒ0 …áû>Móþ/·ÇkÅ1mÂøªÈXº³ü=‰–ö¾µÈhýÕÚîså×áH"ãk ÇM„:îúê–3qÒOü¿W}ÿ9’Ô–¬I”‰“ýHž1ÙG;þ- Ï©sìîÚ¶ù?Ò[%M +Å v°ƒìü#;£zg^ÝÔ3Õd}Î6‹“Å9ÛÆΨޙ×@7õ”Ò„ïð¾#gÃv°ƒì`;׳£Þ©\ï$ÔÅåŸð¾ÃwälØÁv°ƒì`çvÔ;ލÖ}7Êwøߑ³a;ØÁv°ƒkA­µ”ïð¾#gÃv°ƒì`ç=N2wúxg§WÓ¤@n?Ûëc}½SQ“:ûZd?+¨ÏÎú9vÆÎzß)£ÉæÝáP \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_141_5.dat b/lib/phpqrcode/cache/mask_5/mask_141_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..60c1a8e81acb9a104b1003fe8c362588b053abac GIT binary patch literal 297 zcmb=p_4dw1u0sYqtq*_O`hNbW|NLx;(ly@Fw~{rHnwy%g%&1?U=@uQmHZAgYPUWvV zSwa8P%uLts{p{|I6Ff?XUZ>?fOlh?Hu<*Lhj^j-g&%KHRklY zHSXJ%GR-^MUl+M`k&@0?^TfhtO`k-r;2DQRmi;?;$r6o)IJ{82> zzVP^R$E^#0m%8OX_%_jPZqDCVlYVV;i{Ag?{rvsKSBqQ(C$718!)g|LXx`R)LEA3< z-^TpyQqr?GFC*0AGYu!M2uzSo(E^bzLvI+;8@4U$WERT)%VrUu|y7`j4jj zp4qEF>;UTg{AOd_*}XaECï£*¥ú¬v¹ïsýØ]Ŝ_{W!Çzﶬ/ÏÝÞõ÷ÝÅÕ)½Ë™»¹Áö䤏vÿ ›ÏV‘®×6ÜV‘•Þ»ð¹Ã,f1‹YÌb³˜Ê Ìn^o¯¿>¿þí\Oï]øÜñ,Ïò,Ïb³˜Å,f1‹YyVž•gåYžåYžåYÌb³˜Å,f1+Ïʳò¬<˳<˳¾1‹YÌb³˜Å¬<+Ïʳò,Ïò,Ïb³˜Å,f1‹YyVž•gåYžåYžåYÌb³˜Å,fÿïÝukys77—Èì}ïv犝Éæmbž=¥wÙsw³)ï»tWÖ†Ó:® \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_161_5.dat b/lib/phpqrcode/cache/mask_5/mask_161_5.dat new file mode 100644 index 00000000..70d5fb00 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_161_5.dat @@ -0,0 +1,2 @@ +xÚíÜI +ƒ@н§éºÿå²ÑDp@ èo|m ˜¢ßrHk㨤Ñ~c˜½o³^ÝÃJz­×°‚–#5l»¿î¦S_92Ûî ©“[¯}¾ÜÃÈZʟ‡ó=œìTê2ìÿƀ×P‘™2[cVì衆ÌC–Yf™å'-‡ÛìXÎ9>üv§Ë~u»“½sK5ì`Êe¹,—å2Ë,³Ì2Ë,³Ì2Ëç-ë—ßÐ//¯/o_q¾}KÇç¾ä²\–Ër™e–Yf™e–Yf™å³–õËoè—Ý+òÿ¹/¹,—å²\f™e–Yf™e–YfÙ³úe÷Šx¶B.Ëe¹Ì2Ë,³Ì2Ë,³Ì²g+ôËîñl…\–ËrÙ16Ë,³Ì2Ë,³üì<œv.×r륆Á½Þ¼‚™ýrO5ÌÿŸöÔs_ýZÎɔuËI¹_ÃìÞ*Ÿ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_165_5.dat b/lib/phpqrcode/cache/mask_5/mask_165_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..94af813d90326e83dcb4898dffd47eebd3120cc8 GIT binary patch literal 332 zcmb=p_4alkS5trh>xKGoxt!_!?`Z2*Db#6mYclucZ_V= zotdf6-&SvZv*GR8D7h;;_}1^MuiAF~^{4Rr^~KwcM;_~Y5%sO3bm!TkuUAgq{`4tJ z=-blf&CknX*3G+da{|L^pSsAbX|zx+~B?%Xj;& z;1;Iu;j^AJCF&Z`Lw*|;|Nba-v0r}8=>>Iv>dx&vf52z;Q-;T)bDuoUlH3!|5cNl~ F6aZ#Wx#j=> literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_169_5.dat b/lib/phpqrcode/cache/mask_5/mask_169_5.dat new file mode 100644 index 00000000..921a7707 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_169_5.dat @@ -0,0 +1 @@ +xÚíÛÑj„0Ð÷|Íäÿ®/¶niµ¢K¹£'ŠÈÊ.rö:ÁT-m&¶ZÛx9¯yüq§3rÿµOgàv¼OO_zׯ§u`]ÿüÈ·¾ßitëا™ãt½Ùñil¦oc¿‚ö1ã3j9Ž%_g|ëÔ§Æ)ûì³Ï>ûì³Ï>ûÏ°¿=×teÌ&õþ_ã4¤Þÿ²¿=×t¥UŸÊ}¹/÷å>ûì³Ï>ûì³Ï>ûO´¯Þr½5/u“¹>¹/÷å¾ÜgŸ}öÙgŸ}öÙgÿ®öÕûO®÷½Ûsv®OîË}¹/÷ÙgŸ}öÙgŸ}öÙ·–G½o-w{¬å‘ûr_î{ægŸ}öÙgŸ}öÙg_½¯Þ÷nµûì³Ïþ=ì×n]˜4Nk§Öβ_Êðÿ­÷«M½¿ž¦×ûû´Ï8ím?ñÿ´SF…·<· \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_173_5.dat b/lib/phpqrcode/cache/mask_5/mask_173_5.dat new file mode 100644 index 00000000..f9a67413 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_173_5.dat @@ -0,0 +1,4 @@ +xÚíÛ[ +ƒ0Ðÿ¬&³ÿÍõG1Ðø¢gäD)[°Cz¼±÷eDÖѷц÷=R¾NÏ6²îóÚFÒíJm ÞÏJq÷Pœ}ëxÞö séîÑ_¾õ}¶éGÚF©y;žíú¿‹ +[;ý]™öé¯eÃk[®ÅQbT«m±yË&0 L`Â̄Y?á¨ÇðرÝÚæ¼w؛· ïfý„£ÃcÇÊÕVNä9Á½˜À&0 L`˜×„Zý„¤}0=F=F9ANä÷L`˜À&0 L`Bz¬Y²fIñß=F9ANä&0 L`˜À&0 ž‹´fIÑs‘r‚œ 'È L`˜À&0 L`<i͒£ç"å9AN˜À&0 L`˜ðVÖ­aB¯XÛ"ý„±²ù×,U­m…>Øö± +=Æw˜óZ¶gBΜPª¶” !8 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_177_5.dat b/lib/phpqrcode/cache/mask_5/mask_177_5.dat new file mode 100644 index 00000000..b07c636b --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_177_5.dat @@ -0,0 +1,11 @@ +xÚíÝъÂ0Ð÷~ÍÌÿÿܾحˆšŠ ÎuO,"% ñô:$Xui=¹ÕѶ«×ՃŸïô¸g÷Ƹ?Ώq­.úÕSo~æz׉¹õWï:ó™·=Žh1cÜqóøèñþ]ì”Ƕ¼îiÇÖ!÷¼ßçírß8Ɓó˜¬`+XÁ +V°‚ õŠµÓ껏j›Ïjž;—8ƁóX®+ä +¹ÂoV°‚¬`+XÁ +V°â?[1µ^ñh-Ö³5Z;§¶©¶ùrmS®+ä +¹ÂoV°‚¬`+XÁ +V°â;¬°ËZ,µÍYµM¹B®+ä +V°‚¬`+XÁ +V°‚ö™Z‹eŸ©Ú¦}¦r…\!WȬ`+XÁ +V°‚¬`+ì3µKmÓ>S¹B®+ä +V°‚¬`+XÁ +V°¢cþò㊛Ç{g;¦^Qq5¡ZU»ÆÕÝ®ûŸQÛLã0+*&YDqÈñéô*6 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_21_5.dat b/lib/phpqrcode/cache/mask_5/mask_21_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..04f97ea6983c85e1cf6e68150ea02bffa30a4f4b GIT binary patch literal 74 zcmV-Q0JZ;k+MSL;3IHGo1n<6P=l`E8qQc53Ts_3F*hoFpjJL@ppoFxt|L%<{=GéÙêŽZùyÎ:—ÜDRŸ« \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_33_5.dat b/lib/phpqrcode/cache/mask_5/mask_33_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..726d7fd75da51d6bd7737a41e0120162ad66f42d GIT binary patch literal 106 zcmV-w0G0oE+U-+G4gettyYm|Q|Ibavg*ZYTH6AU510hWtK(zoJYG1SgT>VVIrQ<*s zI~>0{7>;PQoL380wan9y;(obh5mL~qPG^u~gT@LOIlD;&&=vfsD8 MtZP z6Mwy=xtNYJP8P5*q$8GTpmRmFxG+$uUgBJr@iKnar8ktiR$tD;xa+0O#TdC4Bt{5~ JuLf_z1Mr1%Fq8lQ literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_41_5.dat b/lib/phpqrcode/cache/mask_5/mask_41_5.dat new file mode 100644 index 00000000..e07c6172 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_41_5.dat @@ -0,0 +1,2 @@ +xÚíTA +À »÷5Íÿ?7˜«ÈXMtxÒ´x©¤ …¸?@‚˜›7@ò¾~"éN$õ‡SÖÉ°Ä{ø+C³¨ÛA'Êör\PŒpè<ޏ÷-¼ ͺ:S3s¹Ô‰ùÛ»ËÞ©Îz#žóqw™ó› >þ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_45_5.dat b/lib/phpqrcode/cache/mask_5/mask_45_5.dat new file mode 100644 index 00000000..5168a17f --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_45_5.dat @@ -0,0 +1 @@ +xÚíUA€ »ï5íÿ?焐U:N&Z"†”:;4P1=ƒbNvSGÆM1¶Ü˛½n<ëv`q³¤{ìîßMg§ã¶4þå=Gó-T¹‹º?›“Ôß='kíÈu™Û­ž“õ>‘ëß'¯®çþÜ(éκŽö Jô{EßѵsÊ]È ,§sqð \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_49_5.dat b/lib/phpqrcode/cache/mask_5/mask_49_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..9f3f3cd7d60bcba44d9223f52747c1cc9a9feb52 GIT binary patch literal 146 zcmV;D0B!$x+U-_B3cw%?yZ1HC|3A0G94cx|E9_(x5y8cz*3P{E3|?W)+(E}-2WX#i zfHZ}}1&-ONsSXt<99&1;WS;^gJWwdf{AS1((&~d%`->c<{A($VpSL1s{ zRx%t39rs?{9Nck;b+FN)RKeb>Q2ppQ^!)JYKLg9b6OOo!Q?K^%$i!U415hQ$TboHr A)c^nh literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_53_5.dat b/lib/phpqrcode/cache/mask_5/mask_53_5.dat new file mode 100644 index 00000000..449807ba --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_53_5.dat @@ -0,0 +1 @@ +xÚíVAÀ »óúÿÏíâ"Ë zYf5Ɛ˜JC ª ˜A;ÄÜáé¾Âlû\˜,†ëdòR.¯ \(åe_Ýú ³æôеaNi5†ª\żŽ†ÿÐÐë‡aLPòò(¯ÐàÒ;×ý±2שÃãå¯jÈN6O u…+é¯Ñl{y•«6odúá^ ãÚàçC[‡%® „ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_57_5.dat b/lib/phpqrcode/cache/mask_5/mask_57_5.dat new file mode 100644 index 00000000..c7dd81f3 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_57_5.dat @@ -0,0 +1,2 @@ +xÚíVA +À »÷5Éÿ?·‹NÝlªƒZ‹HAbB‰Z0aÓ ìÎMÆÒÃd`1Ýz”'"<Ր1™æ9nvͨ.ãô )bÝ»µ~¤;˜Ÿ9ú¾ÕZ#tõBÁ~ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_65_5.dat b/lib/phpqrcode/cache/mask_5/mask_65_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..ecd9380682523494a1f5577c6e22eff92571b446 GIT binary patch literal 163 zcmV;U09^lg+U-|C3IHJpy!#sG|DW4SODL(th;FD_Ol!+`ptx^N zLEU#+P+TP~hiEM?kDlMYCn2{Nokr`dh z=(A4`MyHt}6_aUUXNJM(G}onKt|Qlx8JUq8UCD^KPfsl&$;;O(L#`i%q&M<+dnDc& Vax;Tki-1v3l_b|f_yg_whE8s3Pu>6k literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_73_5.dat b/lib/phpqrcode/cache/mask_5/mask_73_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..00001176d018bd72f9f2128f2f0bf775aab99aa8 GIT binary patch literal 184 zcmV;p07w6L+U;0d4uBvG``>BS`(MrYR@be?`f zXg4__uzEOkK6dEjx2oLg#9{`gm`?j=wt4_|87ivOHqbF%PAmBX8kw9Db&_}T?ycUn z`rYuGA*p6w>oim|H}6{gZul*glk!e^C-3Cl6W;y1W(Io8^nRzjQ{KtDFL+1JRVtmB msmjs2lzG8{6JIm^VkS0TGiPwh(`lA>@p#INaS{u_o$71Ó/3ò4ÎØځz÷^'ÑÔÝ[˜Fyglg•®M>•OÅTLÅ4ϔ{÷&3ëWy*ŸÊ§b*¦ï`ºÚ<3õ;´‘îÞVo0÷/s—6nÿ‘§Ï0Íya½ß[û”ªmácE \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_81_5.dat b/lib/phpqrcode/cache/mask_5/mask_81_5.dat new file mode 100644 index 00000000..71215e95 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_81_5.dat @@ -0,0 +1,3 @@ +xÚí˜Á +À Cï~Móÿ?·Ãtz°U4½ŒÔ"£ }tšÕÀMX2|.îɋ¸Ë™F\œžð¸õÑÂ~mõ‘4 ÷±¿ØXu +ٔ, ÍÌw—:— E†Æ„>ŠµXÿõ̯=_Ö]g>±>óÂÆzæמ‡/ë)5ךk±k±kùµüZs­¸X‹µX¿¬Y{Ü®Ñè}ô¶áç~mt¿æîšìÃÏý:S#™µÑ&;U#)ñÚä \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_85_5.dat b/lib/phpqrcode/cache/mask_5/mask_85_5.dat new file mode 100644 index 0000000000000000000000000000000000000000..09cf0e28127934862f45b0f155ede22e48833cd2 GIT binary patch literal 186 zcmV;r07d_J+U=P^3V<*S1n+rG^8e3yuu_X!YO*T`o0cLu)Fn>SVBDKU)x4XXo;}Lz zW!EUrTdh$X>snv=m*blAkGsN*t+gK4zOfzOFOb9L?@mq&=-FzkwKE)0V`(MDRSbv$ zF(3xMXCUdfAl$J#15Y(!+RxHTimUQ~@_-l+17bi7s2)%~pgf>FAO^&M82AqZz<$9g ouBdLo$N>Dm_MjDe$NHpal&=TaS~+q3j)5w#tg{8Q4HYg~22k``-v9sr literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_5/mask_89_5.dat b/lib/phpqrcode/cache/mask_5/mask_89_5.dat new file mode 100644 index 00000000..5fff5306 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_89_5.dat @@ -0,0 +1,2 @@ +xÚí™á +à „ÿû4Éû¿Üþ¸5eÆÙå®npQ¤´ Gú™cÖÍf‡µðl^^‡;;bŽ5;`¬k¶©¶U͹߮¾ßj`ÍNósÜùùO=Ú\[a6‡žÁ°¶~ÞnLÍD?‹ ±!6ÄÆ°ñuüÈF%w¿*Ȭ²ÌkÎù¦f¢Ÿ77”SĆØbƒÃ†êXodw_ùØ—mµ¨â†â†ØbClüÈNۙ ck&äîY¯­VoÜ¡™×·B×¢»Ø¨œAl6Æ šæJjÜx \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_93_5.dat b/lib/phpqrcode/cache/mask_5/mask_93_5.dat new file mode 100644 index 00000000..ec4240bd --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_93_5.dat @@ -0,0 +1,2 @@ +xÚí™K +Ã0 D÷>æþ—ë&©»ð¯µ& áÉÆ fP^”ÁŠ8BY5ÊÇs(imœ®¼ÙÒ®¤±®=f—µ÷3¨/wÛ§§‡E»¬y¯§ŸïYŽQ¦wf‘á[}¯å¨ ²„[»9ï0303ÏefÇÏ̙Ùñ3'3=<òÆK{níæ¼Sg¨3ü›`f`f`æ¿Ìdø™ÞÞè®oiü£¦ÎPgø7Á ÌÀ Ì܇GµjkÞG]í}?V/æë kÒ×Þ÷ÀWi72–Js™vÃ|*"f^ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_5/mask_97_5.dat b/lib/phpqrcode/cache/mask_5/mask_97_5.dat new file mode 100644 index 00000000..509d1174 --- /dev/null +++ b/lib/phpqrcode/cache/mask_5/mask_97_5.dat @@ -0,0 +1 @@ +xÚíšA„ E÷œ¦½ÿåf!3bf5í¯Æ¼Bˆ‘ùé£|#f=<3l6<›§Ž_+xjÿ©ÁÛ) “ÙÝ©Ãy°“ïÿ¯ ‰J ¹yXiïÜ»ª5¤IzsٞîcëuÄeQ¡¡ °K°K°K·d)â—>,ͼwx®DƒÖ·.,;ãÂsÔ%êg,Á,Á,=€¥ëýRÐóὓ¼7u‰ºÄK°K°ôT–D÷†<(n lY’þŸÞhÐùVÛ¹s÷ޕôy¸Œ¥´ýP±§Eñ<¸öq \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_101_6.dat b/lib/phpqrcode/cache/mask_6/mask_101_6.dat new file mode 100644 index 00000000..13f97a0f --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_101_6.dat @@ -0,0 +1,2 @@ +xÚíšk +„0 „ÿç4Éý/·Ën_.‰Ê2#ˆS‹H”6±_“PâÞZ ›Ïf˳_¡îé,ï7؞Ûà+·%×åWÇÂîd„–âÏnå}–“_&«Ok;Œ×úP¾Çfµ>³t‚yY×¾]Öns °;s·æs‚Ú,º!Lk¬ÁԅcbLŒ‰12cÔX9Ëó1 ÔÀZç#XÐò±En#;ÏsvŒT~L~L±RŒ‰11vsÆ.‹•”³‹1‚ò±¿ò1ù1ù1ÅJ1&ÆÄ؍ÓÙŃó1ù1ù1ÅJ1&ƞÄ«²gËØ KLƪjl¬¬k{g¼Úž5óKò1/ëǐù¯~,aŒ»ù‰õc««ö$“Þ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_105_6.dat b/lib/phpqrcode/cache/mask_6/mask_105_6.dat new file mode 100644 index 00000000..a58fec74 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_105_6.dat @@ -0,0 +1,3 @@ +xÚíšQ +ƒ@ Dÿsšäþ—k¡®ÙBÒZ»#o)Sd}ÌGÜ·Šå¹lú쯯Ö^‹žúú³®)G]Sñ4ÝS×ëšÞÞñ¸ó?½#BºZö:Õã+{þñÅ×s§ÁH¨KþNóiIŽÂ!¦«mþòe1 +RWe9!ÿ¡`ö`ï¶ìUy¯Ë€§uë:檞»ëÖåšU=w×-ûo•ÔºwB·}cMÞKßÃ÷è¹°{°{ä=òyßÃ÷è¹°{°{ä=òyßÃ÷è¹°{°wSö¤caoìi'Ýföºé½õyO=C•yO=C•y¯›ß[Ÿ÷Äó{SÞ»œ=—;Ÿ|v4}ϯ2‰¨¸0§ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_109_6.dat b/lib/phpqrcode/cache/mask_6/mask_109_6.dat new file mode 100644 index 00000000..be7b4749 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_109_6.dat @@ -0,0 +1 @@ +xÚíšAÂ0 ï~ýÿρDBHÓC½HãV2‡Æ0Ùn¥uoªò£lø쯯²¯Ë»=Û¢s9[ˆŽõl'«ºÝ?™íë7ÏíR"¯ &“§Û2™ÕßÏ:7QqX_•n» §û]£$Ó՚–EIYôÁ*¦³ÆL”üq0 “0 “0ù{LJýäз(s\É³wœô¾‰¦X÷-Ó7^öÑIt„I˜„I˜„Iü$~?‰N¢“0 “0 “0‰ŸÄOâ'ÑIt’g7LÂ$Lþ-“›„¡€Iuzrfr M÷“^ê'}“éÍ÷“•ùÉ(ÉO~RŸé]1Y²ãLÄžuÒå9ó¡QÍӕ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_113_6.dat b/lib/phpqrcode/cache/mask_6/mask_113_6.dat new file mode 100644 index 00000000..397f5274 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_113_6.dat @@ -0,0 +1,3 @@ +xÚí›Ñ Eßû5ôÿN£°¤Õ‰ëõÁÃÈbF6¨on´¶¯,m›>·gSÅ9ìñÞRWã½ðˆcŒÇ•9Œ&»%‰1ùöÏ_÷Þcx= GR^°šw-z?Ãêdzõvî=î,¹ê°}Ô¥?ǹژ³:Å9œmÓ=—ó=@U”¶ä²‰„UX…UXýVe ³ûÕÜÅ~Õby4WúÕéiæ¿:Ýe=ó‰ó¡+3}u4V%s*ZZGM&;I{^hb=04yIS((dxvZSQzT-ftM{l(nX+lN_8ODT@5*n+ z7_UD(asGDJ=LTuwGLL68OD>x%-!8VhX~z9)s_}nsM7#IRuTu5NlE1M}DE!~LqHV#? z>Qf#_+}0{yXSc>}`Oi7KFW*{qHhjb7t7W#OJ7->RxEgr--0aihQri-x!RWX2w$z_x z-{(K`{`B@#S%`O<>9f@NPe0F}o}Zti{rT€ù’õüɼ—Æú$<>¯OÑôvòÊù'ÅûËåCçÑytæaæaæaæa~›ùòõ|êžÔÙ'9li‹Î£óè<ÌÃ<ÌÃ<ÌÃ<ÌÃüóìI‘æç°è<:ÎÃ<ÌÃ<ÌÃ<ÌÃüóٕWæDz¸‚y¿:.z=¿ª ŒÝ“ʯ œsØVšÃ¶E=ll›_k0_#võ°³Î¯˜mÝ÷›j \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_129_6.dat b/lib/phpqrcode/cache/mask_6/mask_129_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..b4695c3ff0d8ebd6925d8af5e0b403d5974ed46b GIT binary patch literal 310 zcmV-60m=S&+U=Xs3d1l6Mc@4z{r{iaU`b3tw}-Y`#z{*Vj)K^nc<+O%V_D@=U$Xty z&tEmqAcJ?j?v86TK^YOR_hi^6CyeFRR#Fmw^kkN5f+OzB@3mz7YhU+_46fxbXrKqJ8dEWiRRzyf{&zkpxBFVGk0 z3uq)*fCX591z5l@;1}=<_yzg`eF2RG3$OqSumB7A1^fbj0lz?Bpf8}2U;!3j0T%w4 zg_beb0}DNqzB>!qv~!(b=$i3#ztA<~>3$)bcdqjbP4mv1Uw8})+SVD`X8*k}X!oJ` I0%mGk`PF`vEdT%j literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_6/mask_133_6.dat b/lib/phpqrcode/cache/mask_6/mask_133_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..40911dc575dbbb17a4a057a46521c47b159138ca GIT binary patch literal 296 zcmb=p^>&UUU$X%Z%lo?CzyHr~4f5p772*@!y+W#4z-aoFvniX|)r-4>+}{b_t=?z1 za^B%Uo6C=?Bf5p+A4mDPRY%qZb+7;LH~IgZx!WufT|#LdH+*}lvf|jbWz$U;MJdj?+L60%T4~Y&jvfg5!>uf4f9dJsH`X7Hoj9}k^e4rC zS0C4C)Ev*0lXY~zAowlHfJqsIn&c1mKXCt`{DQ-(sSmClB=SSBgaxSfM)pCdp>-_w zAk_;%Y9X4Ll¾sÖª‡ìür6öö¸“6‡«ú°6Érҟ¶=ûüv¸Ú²þWy±Ú ¢¶Š-¸Ê' +ìÀìÀΟ²ãÅ;q tQE>U–϶öf‘¯•ê³­ìxñN]TcÑ(s❮7tÝAwðÙ`v`v`v`çkvˆwfŽwtû;]«ùÞ ;躃Ï;°;°;°;çÙ!ޙ;Þaoôå]ºƒî ;øl°;°;°;°Ã· | Ê· èºƒîà³ÁìÀìÀìŒì(3}Œìl.­š?«…"މr}äÇ;Ú\}¼S¦Ù-AžœüwÚ<9;úEVœ'§×ˆôó¡ð \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_141_6.dat b/lib/phpqrcode/cache/mask_6/mask_141_6.dat new file mode 100644 index 00000000..0340409a --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_141_6.dat @@ -0,0 +1,10 @@ +xÚíœa Fÿ÷4íý/§‰c Òêâ¤]òزȐ…¥ª[²¬¤=Éð[E럓ÖÜósî¹m,éšÛfÒn/ß|kj\ä¿òj§?g½ÝþòÈ[qþû(NO˜Zc5ûŠ©SGGP[oM×Vá’Ö¸´éf¼¥÷vÖL<)r%zGej;*ZC7u5PHroFXT;2T zErAz-@(#{w+P}?wqtMJ3uDW8^Zp>M}^Fr0Lpp6sHMCtS0T=zSWcURlGh1q8m6XBZP z)<+zU-@Sal+U99%rKBCNUob7{wNzPiPzs9vGH3tDF8^{p;9$q2z5quaE#u5AU!HIYpjb0cSa)^E8M?_KmSO6tj)==bYa lKD}5p(yFJjBc0i__3AFOq}<9%1{c=3R{)onxM=_Y literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_6/mask_149_6.dat b/lib/phpqrcode/cache/mask_6/mask_149_6.dat new file mode 100644 index 00000000..69e98835 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_149_6.dat @@ -0,0 +1,2 @@ +xÚíœÑ +ƒ0 Eßó5ÍÿÿÜÆfµƒ47ÍÝ8UD“6Ëñ’ÓÚ2¼z´mØpߞ¦ªk8«»¥öŒ}åÅGì«ÉôӕÅëN}?}æÄW“:ƒÈÚguàWA´ËŒ7 ~Û;­)ƒÇâãØ{̪ǿ+ÖWPþºOÛ¢¤öÍþrµEƒ\j˜wG)y˖àw©À‚A„A„A„AM%òÁá™æ2ùà`µµ2«’d”³l–¯àÚ|p}¦eqP’¢ƒè :ˆ    Âàe j想=úlïþT5™©É ƒè :ˆ    Âà© ²Gÿë{ôÔdö×dÐAtDaaaaaï&Ø£§&Ãwè :ˆ    Ö1¨ÒÙð•Á-MRb0éÖW˜f½ ëöèuzŽ5™&Y“iIѺšŒNрA­—»PÑQS«ÎþL}4 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_153_6.dat b/lib/phpqrcode/cache/mask_6/mask_153_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..3ab6130edd889298419b702ce1dcfddfda30cf2f GIT binary patch literal 367 zcmb=p_4ZC+-eCoSmWSnj%-{FNXq%daEZUK`+NjemCo*t?dCFURVYiCx+AY&AWaXz; z#Mw80;rtkb0d8YE*wD7uX)inq9ZVuZUFDP(T@8+N1 zd)6dxd%yYT`R@txHxIga-#%q{p=18$LjAv|)HMzi=qI9z_Q`c5T9@Wu3#VwUI?XqmF<#Ov^FVyZX znO%a=0o3e&KJ815aoXF1m16oYp6*fD?Jm?ru;I^wH)p;*n7!8a0qfl_O<0VW z=e+S-gZL9m5s=·ÇW³Ã³»—CöaïzÈ6îÝÉUü¼~Ò»·{`ný•Š¸õÙÉÝ»dvVýy~µrÒ·Z¯"çq·Ûk{>g$ÅáXK¶õÈU}m\b÷ja¤GÞx˜Å,f1‹YÌbö¿™òÙ]½z¬‘­Ìž½ƒš^¯.ë5Ó[?Ö嬜•³r³˜Å,f1‹YÌòY>Ëgù¬œ•³rVÎb³˜Å,f1‹Y>Ëgù,Ÿ•³rVÎúmŒYÌb³˜Å,fù,Ÿå³|VÎÊY9‹YÌb³˜Å,fù,Ÿå³|VÎÊY9+g1‹YÌb³˜ýŠÙ‹ ½̦M7>2{9zºÏ¶hŸm3Éçûlò|ã9ßxóÙ¼™ä#f#Ÿx•6 ÿ˜³-îvë%…N' \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_161_6.dat b/lib/phpqrcode/cache/mask_6/mask_161_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..ecec68b1ac0f7ae45685bed5d752ef54a48f0f3e GIT binary patch literal 399 zcmb=p_4aOH-eCm+*NgRG%)jr)tiI;gamK_~Was)*2d9a$rlzvVFd(`Vxt}K4Lw&$1iobzS93uRn)?%d|f?w*sGT%NE> z{5IRU4qg|XWXaPJc9Wm(u=|#>w)ceHw=b*9PWtu#%$j?0UgYIfVgE|yed#NsPfj0ye)_BM^UK-)PTmj)Dk+(%2Qn6>@Mqw( zr>Eaf(4VdSY0^ghT|OXlU~(X3o3@I6N-cI>vvvVU=j&u7z0uK%@n+#iZgHXOO4Lz* zS5klalWD4FYUNJv>X3bV?!C6tj6Zkhb=|q?)qi3p?yJdny>uh|S+%y9&hsv>7uDKn Qv3e2bEbSR&we7b907^~O^#A|> literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_6/mask_165_6.dat b/lib/phpqrcode/cache/mask_6/mask_165_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..d641dfa3dde2565c932c7234b4521d35c4a1af0d GIT binary patch literal 400 zcmb=p_4e+=tY!lV)(ihDXFd5FpVz$dq?^)Rf%2utrx}%SOWEwLn>i_J`_iSlTlG_a z?5xW@^>fafr_X<_`MyU#`bPG>>Gu53mUJ)QUoZ3jlYiaKTYL1ypC5hw`u4`@;aj#{ z65c&WV*jT2f7ha_kN&Vtzwen{t6%P~`!n?0+`iwtWbQAWZ<=}1xMrHJarBp;Hbut9$M7_G_mM zcbUq6j_Pl_yVJGrbfKl*aj-TBao%v9T>btkn@|5AAOFSPyYnPS{;9>|9^-RRg7etb z$M3`Xce6j+WoQnP+#v(96>7#EW6f8E-w#x%VH*A2r>p9Yt-(CciI0n7`gVuGb;wx~J!=SaTlS=q~KGûì³Ï>ûì³ûãµ¾ +õþõ'{«„Õ§_õVˊÚx­-âJýËø<ӛܗûr_î³Ï>ûì³Ï>ûì³iûêý;×ûù÷öœr­OîË}¹/÷ÙgŸ}öÙgŸ}öÙ¿¦}õþ½ë}÷ö¼x­OîË}¹/÷ÙgŸ}öÙgŸ}öÙ·—G½o/{{ìå‘ûr_îûÎÏ>ûì³Ï>ûì³o/zß^÷öØË#÷å¾Ü÷Ÿ}öÙgŸ}öÙ¿†ý£d²ì'ŸÊ³µ|ÔQR½ßNSï·Ã3¹’êý³œËÓãÏåYÖú²ÏäÚ³ÿ‰ZÉ'Çms¿EŸÇ·j›5ø \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_173_6.dat b/lib/phpqrcode/cache/mask_6/mask_173_6.dat new file mode 100644 index 00000000..95fa97c7 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_173_6.dat @@ -0,0 +1 @@ +xÚíÝaŠÂ0Ðÿ9MrÿËí¢­M SÜ*:a_-²5hh_¿)©uÛZÖ­[éþ®÷¦lïÓoûےsŸmKúšíø›NÇ{òÿãHÌ?x­Ï`l‡#fï9>’ÚŸ[¯õeé·Ð„ÏŽß“­¡ ï?þ^ìóöm÷ó®­ð*û/KËm¿—ãhËy%ÞËv-nKl¥í»Âè–í¤kK¸L`˜À&&Ìê g5†¯µ•(·gºwxôY¢ÜžîÞáa¬žpVcøZ[‰Æ#O=¡ëSNä9Á½˜À&0 L`˜Ç„¥ê ¹ç't­jŒjŒ]QNä9Á½˜À&0 L`˜Ás–ÌYRcü@QNä9 L`˜À&0 L`‚ç"ÍYRcô\¤œ 'È r˜À&0 L`˜ÀÏEš³¤Æè¹H9ANä&0 L`˜À&ü²¯ 7špÜ6¯`Â|õ²¬õ„hm¸œs–ò¯ ××ëR5Ƭ™³Æ˜½È‰ k\ÌX/²Ï ‘ )÷g9È \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_177_6.dat b/lib/phpqrcode/cache/mask_6/mask_177_6.dat new file mode 100644 index 00000000..e9f0476f --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_177_6.dat @@ -0,0 +1,14 @@ +xÚíÝÑn„ …á{žÞÿåÚ¤*4vÛ´u¦û¡1‰£²ø{<L­Gi‘Kí¥ ¿ëGUÌíäŠß÷Ç]çmÜ/ó6žÜÛjÿõ?mZ¤müzÌy/úξgÍjÏÿ\ÌՓ—¢<`Å_¶ã>f{Š¿Ð¿³_ñù,¶,K9o 4ŽÇµôù7lËñÞniJiggiår<¤-MGÆ +¬À +¬À +¬À +¬xuVÄ÷+zÌÒRøCÌr9‡+Gqç6ÞQWžñb"ø×Qe×ï"ùWLº‚® +è +ß XXXXX/ÁŠ|~Åj,ÖnŒÖmu¼MÞæÚÛ¤+è +º‚®ð ‚XXXXXñ¯Ya,–±X¼Í;¼Mº‚® +è +ß XXXXXæ™‹ež)oÓӘÞf’|¦ƒ·™–5²H“û¸ëŠší¥÷7/D \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_21_6.dat b/lib/phpqrcode/cache/mask_6/mask_21_6.dat new file mode 100644 index 00000000..6bd505b4 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_21_6.dat @@ -0,0 +1 @@ +xڝQÀ Cÿ9M{ÿËi]èÒýX‰1¤À Å-½ C!»É³Dìû7 W ìٜ§Ø&rDñ)~Î]<MÎ ·3(>{ƒïA ¡«ÿíŽa²¼Sý \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_25_6.dat b/lib/phpqrcode/cache/mask_6/mask_25_6.dat new file mode 100644 index 00000000..d45083aa --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_25_6.dat @@ -0,0 +1 @@ +xڝQAÀ »÷5öÿŸÛ2)êe+Ä(XmÊZtÆ*(õÚ¹«;ÃçtJã<峂†_Ú¤‡3°oŠÜ½Ú´"Ì¢a²zh}Ñ&qv€µSGÊ֙,ó-÷‡™J›Í4}³™¦oS[âü}w \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_29_6.dat b/lib/phpqrcode/cache/mask_6/mask_29_6.dat new file mode 100644 index 00000000..0408e224 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_29_6.dat @@ -0,0 +1,3 @@ +xÚÕRA +À0 ºûšäÿŸÛXcÔõ²ÓL(4E”ÔˆB +8CÖܾ޳nÃM©+lǝªÃՆOžé1]&•Ú¥4UëD-6-$:6ÊdZá?yæÛlôÝf£?í˜ åŽ8?žß²±<Ûlôž}ž¹g›göí * \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_33_6.dat b/lib/phpqrcode/cache/mask_6/mask_33_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..8de4ba5c9ba9a264cf4ecdce048414a103ca9a4c GIT binary patch literal 124 zcmV-?0E7Q{+U-*@62Kq`+j$N7|L58(kh4fSIW}?*IZa71?g=y$Z@wV--1ieV|EfU) zZS5LeWzbl=5S@-V;-&hAT2>bTQ5IjGy*#_+5FlYF0i|O3{~#Ory&Utx49Pb}M!qqU eGB4z0Ua0$-m+;~$`<#o+3+E#9Qgs1fkI!%T**fq5 literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_6/mask_37_6.dat b/lib/phpqrcode/cache/mask_6/mask_37_6.dat new file mode 100644 index 00000000..b37ff0ab --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_37_6.dat @@ -0,0 +1 @@ +xÚí”AÀ &ýÿçÚT `½ôèjB{{Ok%tdtlP>c!Jq2?sR|6OyXBED_#CJGJ|{4?o|# zWi31{IkRWty7H{19EeICVF#bFBLK`Sqohq!P3c{Hxke=hL*^psZ< literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_6/mask_45_6.dat b/lib/phpqrcode/cache/mask_6/mask_45_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..a7da7ee0297b6371bd3ebf57467f009712e40cd6 GIT binary patch literal 189 zcmV;u07CzG+U-?A4#Xe`yz?6P|L3|%6(}8a+S4YxXiTkkisJyP!>lt6lk}|T(tQNG zKksqJ*w!?R9dPAm82jdF@w%LHYmk%ah`(8LQqB>(=edn(GCywV&RxRO?k3YHLkmWk z*aT+KWsqQ$<3Gg7PA4uT3C+}K0drYmWeGYb>)1(p7ta_qgP{3eCtn>q+w^_mWM3IF rC#dT5I$?6GuTnWSVh7coK6Z$@lVax;CrT-Ws>PubeR7!xL?VGyGa6i_ literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_6/mask_49_6.dat b/lib/phpqrcode/cache/mask_6/mask_49_6.dat new file mode 100644 index 00000000..64ded709 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_49_6.dat @@ -0,0 +1,2 @@ +xÚíVQÅ ûïiàþ—{K&·ÂêÇûYX¤³ØÙ0ï̦!=ÛýŠ­tÇån&ÅðfpŒWL +±`¤/¯<ϓKVrU¢\1öbGpáê@Äìӑ&fNëŒ/+ƽqÙà ¢`ðàòAWÿçêSƒÉßRGpõþ_5|Æ|zÀ×xν:¸¢ªåJ©‚+WE©m4hÛ4Ú3tÜ­ƒ.×Á©A­g`\ɁÒù¬÷ʤþ*ÙÅFÈô \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_53_6.dat b/lib/phpqrcode/cache/mask_6/mask_53_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..9139e325901037a409a2a2d317141cbd9bb27807 GIT binary patch literal 195 zcmV;!06hPA+U=In4uBvCMc?@v`Tw7*ElsG)6&_ona}B4=6R_J_H(gnqCg!_cThR(n zojZKuSh^TEmcRQQKZxaCGEO}_fJWLvh7ncHkT}m%gO65*3_i=>Wv5I&JTu%XJ;$_U zq9afxnshi?de~<88-}PKQlCVXOM8jnene{dW{CPB^@+QK_CphY=i#p94>Qav8_#g2 xe}y4d8>?E5v<_ݏ`åÃî8¦Ž¹€GÁ1“œ`–B”Ý`;»ù+ØÂì}åÄÌØ&s£ÒçŒ]<§J…QF=mb3 UŒF'ÚØ6¶Ɩá„E âü€¹5õJa÷wZØÖù60¢¬ +ß[¹·ë¶9¡±ý9¶”ì{Á–SšÛ\ݞ8Õ`k&­Áœos}{â[Rß¾ý[¥+—þwðºÕO‹èd^jW \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_61_6.dat b/lib/phpqrcode/cache/mask_6/mask_61_6.dat new file mode 100644 index 00000000..f2d3f10d --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_61_6.dat @@ -0,0 +1,2 @@ +xÚí—KÀ D÷s¸ÿåÚ¤µE~݂ihÌÄ'™ +ÑŽÍÀòNÏ'oVWßéà£jspèÚCzÓþìÑο©¥ÃaÌÏg!«…#WD%~Ü˃Y?±JÛfŒÚåR€E¸¢ŽÁKoæͼ™Ç˜§ü|Ƀˎ*ÌOÿP7 Šž‡åÛn¾ë¼½¥™7ósã†`ž½ïÌÍÖÀõsúåçdôD¾Ÿÿ¹Ÿsé~>ý<ßiÌK'Žl'¸×9¥ûÐ%.ÆîÄ7 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_65_6.dat b/lib/phpqrcode/cache/mask_6/mask_65_6.dat new file mode 100644 index 00000000..550fc8fe --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_65_6.dat @@ -0,0 +1 @@ +xÚíWQÅ ûïiäþ—{KžNLk?˜e$ŒQ´ikÝìÆÚ4¸çö1{˜á‰ð×`+®!úÚ®ºM Á? áû “’°È1b°8†ž £·¦.ŒÞ^ƒwÌÞò¹ìèsn²ÁFjè5¹…EaQX|‹=wä¼@°2v<òŋŞ»‰–|4w»êê\ÔUXÇBQz+óÊT±ÈTǹÖcøBÓzž/4­ç8Õë,‘»5Ý`¡¥¨»ý¹È± üOV$ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_69_6.dat b/lib/phpqrcode/cache/mask_6/mask_69_6.dat new file mode 100644 index 00000000..a3e4fa0f --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_69_6.dat @@ -0,0 +1 @@ +xÚí˜KÄ @÷œî¹™dThÃðí¦ hLSSEžq eY@<ã¯+Þ*£|ß窮 %‹®‹>¥¡¨®‹¹zÃ*7ë–Åe´¤öÆ6ãQ¶½©S`šÞ.²¯>»sE Ë'¨%@[‘Ž6°@PË0Ãh £aôFÕxtpl²2§Âóý ‡Q-g1N†feo^ßøÑüë†Ñ0F¯dT>N_ÕOö’‘wË‹G3ìùªu†åœÁ»gˆå {‘3<Ê[žÔº b?Â'6ï^ºŠ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_73_6.dat b/lib/phpqrcode/cache/mask_6/mask_73_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..ab71b70ae59ccfb23e9c4185b1e919d531fb040f GIT binary patch literal 230 zcmV6w!~0Dh_U!#`ksFaQ7m literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_6/mask_77_6.dat b/lib/phpqrcode/cache/mask_6/mask_77_6.dat new file mode 100644 index 00000000..ad5a660e --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_77_6.dat @@ -0,0 +1 @@ +xÚí˜Ñà EßùøÿŸÛ²i‹ÙÅVäaË.š¦±F©§pST›YÖô4q÷ú~´z…«=Ÿä:ö͒ û6îøÍüôm8‘¾:#0PضiDy:2Å '§ùZ­s±Š&}Ïôç滜\r‘0\¥Åš•˜Xw¬Â;iP¬äàȔLœ)ÒS¬±£eԕÜ{hˆDu9÷L‘žb½•©JÞÒS÷ŒSÆ)™’)™ÞgZš{÷þeÜøŸé)ã”qJ¦dúLw+ƒ#Ó3-V0ÅÕ·lîjƒ¹™ýÚ ×S-ÕS ê½9=ݯ÷¦5ÁPPïõq1Mõ?ågÓ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_81_6.dat b/lib/phpqrcode/cache/mask_6/mask_81_6.dat new file mode 100644 index 00000000..28a6d075 --- /dev/null +++ b/lib/phpqrcode/cache/mask_6/mask_81_6.dat @@ -0,0 +1,3 @@ +xÚí™Q„0Dÿ9 Üÿr»ÉÚR³LÕvök‡šÆ`´¤¯0 º;æi6ÜûçÑÚ\|ñí_¿êccÔ1«¢h¾ýuŒ§½ioÞó#2ƒ¬}x*.YûtÃ&¸­± +Ö°¶ÀÖq/K‚;3ÌväeÐÌ¢ȊÒ‚AÛH±ë?`]é5ÒðK¿¡Êü´†w¿!}{Zû߲žW +Œ”yâ·¾Àž^§_y­¼k±k±–^K¯•×ªáb-ÖbÝYSÚ¸'֜NóÈuÃ×õšÕ#M½fõHS¯Q?|]¯IýðA¯ÆÚi™Mû÷‘yíì¤yuWà \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_6/mask_85_6.dat b/lib/phpqrcode/cache/mask_6/mask_85_6.dat new file mode 100644 index 0000000000000000000000000000000000000000..d5403e49a80cd825886b9cf067587297c22542b2 GIT binary patch literal 229 zcmVz+U=Q93IibwME~bB$^9?aLbYnE?lu`e3KJJuW7jbno{1 z6z!*@KIP;y_0^MY?(1Uq+xo)SueFNlpSwk~3kHJTZW;Jhe~*j0f6i>Ev*&T`9<+0j zJ6S`Ia)zC1@aibjTa>+X>cWZvF(3xSz)1!u`9P<`={Ia;V3iYwbtJu->xkU@m%8GB z;(!ntduS+U=Q93dA4`ME`S|1p|)V-|IyeM8#yz&a$P<5H8u1j zJvs=^zR6hA`VPFkrR{fvn^+GR9ksLtHTXo64YENt$i~~)fawi)LW)84hWko>3Nllc zx#paEz7d+7rFOyurM|GlguB4YENtj{*X=Ev^DF}ptAKX6@RpX4vjZjklMsHWS3nR)a*F|K!unUJMmO!Vn} zoTXx;{$pvl+nqFvSzoF-QmYM8VkABAis-2UASHPxZ{Wiz40ft)3ZUf;xjbgSiRJfEh3YX28r%%+%_c*_vLo*0<$@ z23~1k)EU$n%uQeh%zzm%^YhH4w^!eo$?ptXW}>e4xt^)$QRDw9atl$NB&!*=®½1='#–`+bƒ¥l]Z±”¶­¬ýð \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_101_7.dat b/lib/phpqrcode/cache/mask_7/mask_101_7.dat new file mode 100644 index 00000000..1f6bc512 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_101_7.dat @@ -0,0 +1 @@ +xÚíšQà Cÿ}rÿËm“Ê`éÚÊfªjòTé#±¥ÔäÞ54'tûí…îf¼aÈЇo°–$±c<ÙËêãÝÓÕñHÝ Ìh8„lÕÛûþÁëo=½Ä„ŽÅ§àHvº©;‹z€¤!ƒ|/‹FŽÐ3cf̌‰S×ʅ±±㍂¼êñ 8©KŽ)4©9 ”Qç1ç1×J3fÆÌØÅ›S+ÅwÖcçõ˜ó˜ó˜k¥3cf캌ùîâ¾zÌyÌy̵Ҍ™±1¦{¨²bL÷¶çÍX™S+óï.to{>ô˜îmO§ÇJ2²û3cÄ<6ãXn0F´ ) \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_105_7.dat b/lib/phpqrcode/cache/mask_7/mask_105_7.dat new file mode 100644 index 00000000..6b0cacfe --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_105_7.dat @@ -0,0 +1,2 @@ +xÚíšA +Ä0E÷žFï¹a Mҙ˜N¾Px)¸pQ£¼è_è~ž|ñ(b¿F’„šç$.Ÿa¿o“ÝòWÿGNÚPæUǖ·‰Mþ%{‡ëoôHQôÙUñl¯Ö´¿¬L^>+Éçm­“#{°{eo&Y2sÛoM•)gncO9s›ßZŠ³´3wÇo™„Ú+Âè{ô=f.ìÁìÁz½‡Þ£ïÑ÷˜¹°{°{è=ôz¾GßcæÂìÁÞsÙkCQϞpÓíÊ^¶€&Ñ{^£÷¼Nï­Ê·UïÕìï ìe5°ç}¯æE‰wGûßn+o \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_109_7.dat b/lib/phpqrcode/cache/mask_7/mask_109_7.dat new file mode 100644 index 00000000..9875cbe8 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_109_7.dat @@ -0,0 +1,2 @@ +xÚíšA +…0 D÷9MrÿË}µÚ*˜ _x-d˜ú:Î"îNJ¢Ý-kÅ"Šâ¨š¢œ•dŒ{›¿Õ»ü¤·ñã¯ó³ÞÊגɬ|'ƒÒÚràQ5+ sûŒ¡)Ûc•Õê7úÕ-ÑÕó»1nn햺qÿɔ–ÔÍJtgô¬^îʉwÿ̘Ň-ùƒ?ÿ*š&Mmý@ee5éø^Ñ +c¢”° +«° +«ÀªÒ,¬¶ýªïbï\1¿×3ýjõ4óØT¿ZžfÅ¢·»o鯠«è*º +«° +«° +«°:›Uüêt¿*ü¿ú½¹ºŠ®¢«° +«° +«° +«“Xů²0<·BWÑUtVaVaVƒYÕl +Þ°ªÙkýf5éýª_Ö ¿ªÙkýáW5{­«µ€ä–5pnõC¬éªZ:¬Å bv \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_117_7.dat b/lib/phpqrcode/cache/mask_7/mask_117_7.dat new file mode 100644 index 00000000..cde78c10 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_117_7.dat @@ -0,0 +1,2 @@ +xÚí›Yà Dÿç4pÿËU•²ÈêIª>"ù%6æed ‘Ò8rðS ÍNsŽµU¯ánëk5¦Xe­øjѻު®u—Ûî¦ô¿ö±VÛXgøê,l`øøîuÝÊÀî÷£!‚h‰XZù\VãlM±ìë|[ͬÝÂ0 Ã0 Ã0 ÿÃí–#hF'ëøc]²±ž¾¦iéí>ìúŽûHÐat†a†a†a~<ÃÔÆzØyÆqkO‡£Ãè0 Ã0 Ã0 ÃðææŒãªžF‡Ña†a†aþ)†§2ÇË°éfÒáþ%ƒÀz8ùëátO=¼žâ€3ÿ=Ž‚áÖî3œÜ:ìÿcw‘ +ûV$¢ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_121_7.dat b/lib/phpqrcode/cache/mask_7/mask_121_7.dat new file mode 100644 index 00000000..d5d577f7 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_121_7.dat @@ -0,0 +1,2 @@ +xÚí›[ +Ä Eÿ³šdÿ›ú°ŒÆi;^az,ø#6ƞ^rÝׂ§h¶ŽôµÈêÐ&Ýì¨çÜ^amýËÀ•YŸ9×_Òغô5C·r–6ë®ðt^ù^ÅWlûÅÐEä˜ôز~É¿|èM®èmýÁåÛmSò}÷¶Ó( Û° Û° Û°}ŽmQ½]ŒZ§Vüq½]¼ÓvËѲ"™M¹1fÙúGÔÛÛ, q½½ÍB·Ñmt¶a¶a¶a¶ÂöÄz»eF²3»cxI¹—D·Ñmt¶a¶a¶a¶ÿŸmÎnð’ý$ºn£Û° Û° Û° ۏa[}ï¦`[yëæÀö–°¾Þ–Þ»)Ïn<¹æ4ÜKú/éó¼¤O¢»s§l¨nçlÔmŸµÝ/GëÙ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_125_7.dat b/lib/phpqrcode/cache/mask_7/mask_125_7.dat new file mode 100644 index 0000000000000000000000000000000000000000..f9ec0887b05d63190cd6ebe1bb181252db240a5b GIT binary patch literal 288 zcmb=p^>(%+-(dwFmiND<{`^0`b*j_CTqezxZ{^rj;wKcm=?PmSu=Glz<7VlslV=Y- zO8>Uu%kQn~TjKuaTl~3{$o%&7)#h8}=22b&;klFIREslqHa`A!?#mmI&via`Hb+0Y z@=dof=(6k43w+wj81s{h(%)-(dv-mfy8!@BX(Jcim*@*T8k(?P5abBdPTV55E<2nWM}-KktRmgh+FK z(J5XM>l-trubloFW*NMH^}mg5a-3Y>F9fC9#l&wam?F3O`BH_m{d}fVk6)~v_I&Hz zHJ=+cdHrqItm^WLCC8c$D{tL(Yf{g&%x7Q9 zubFPXVwyI0pF{it{Ra~h7{x%SagRfsg8l^Y7u;W1ZG?0VFoDnn@e|xnSU)k2i@PJtN|E!a-ww)M{dF^|hGkUkCJ!|~{M9*8VnoW7a`o8vg bU+c{{(Mi0VI}n?>ZnFz5Vih(RRyE z|8~uM{F%Y??j(=+_U|&*MxD6{EXooGIou3B+4rdIt<3u>@m`ky)yCCP{twlzB)65{ zxt83x+o|t_pyi`jZivc5?msx>A1W8Q07ZMC+7Tk}qrk>B3EF|xO$4cfDymCT`D{~t z*yCE}H)iGgttY-t-17O&+Wsls{yaWkCr)~=oXRV&$sJJi`D}ZpWzpFaOJp>)b53$^ I_LZ6o0K%<<ŸÚÎo[l +ìÀìÀΟ²Ó +©ý0û¡7։µVÆl;b¶–ëüè™7æõfM¾S´†î ;è1ìÀìÀìÀìL³C¾<ßQí[+@wÐt‡˜ v`v`v`v&Ù!ß ›ï°7ÚX+@wÐt‡˜ v`v`v`v8 ÊYP΂¢;èºCÌ;°;°;°saG{™Ä;Ú»>vRœ|ÇžåùŽö®K¾£½ë£ØMÎðHÖ +‚³#Н(S›ËÎòúqÌçd \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_141_7.dat b/lib/phpqrcode/cache/mask_7/mask_141_7.dat new file mode 100644 index 00000000..98dffab0 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_141_7.dat @@ -0,0 +1 @@ +xÚíœA„ E÷= Üÿr“IëŒTY@¿ÉÄÅ0!µøø|1”²—št¹bG0µæԗѤ…s¡2Z/îç¿oa‚ìøÜ\ÿq¬ãzÜÛOnҋMºÏñÞn™šñt„áX"Kÿ—m‘eM}çÚòCpµíÄP™L^¾µŒ„S0S0S0S£L ø)ǔ‚ŸÚ˜êYß¾%žÔbÑý,õS©l?ÕzC§Ð)tŠµLÁLÁLÁLI2…ŸzŸŠRX¶h¾£@§Ð)tŠµLÁLÁLÁLI1…Ÿz‘ŸbÏ·óŽB§Ð)Ö~0S0S0S0Å7´ø)ö|ù†B§Ð)˜‚)˜‚)˜‚©÷3Ֆ«L%Ÿ tfª¬wM±Ÿ*:~ªhù©»¡Zºç«sn’cª÷$1UTtJgÆ8‹ÌÕOYºE \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_145_7.dat b/lib/phpqrcode/cache/mask_7/mask_145_7.dat new file mode 100644 index 00000000..4aa2bac1 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_145_7.dat @@ -0,0 +1,2 @@ +xÚíœÑ +à Eßó5úÿ?W6Zµ ¦-›^é±àƒ2‰q§×ÄbG‰Ÿ¢X6(ƉuÍ"“LbÑbÝGuû÷ŽÎ¼®··Gkø¨:HwA[¿jšÔm¯øH¢ø¬Ýžï3ïŬýîßâOðkQ{l·|ê»èT›†EmÇ JfÙLÊ?ŸÚ2"&Á¬Á¬Á¬Á¬ÁÚ¬)Äk©ÝRf¢—µÙcï“Ñ̉ÓåFŠÑ,§“z©¦=躆®±‡„5Xƒ5Xƒ5Xƒµ7±F¼¶\¼¦p–ÚUs#躆®±‡„5Xƒ5Xƒ5Xƒµ°F¼¶d¼ÆYö•Üº†®¡kì!a Ö` Ö` Ö`o‰×8ËæÛct ]C×ØC¬Á¬Á¬ gMå­‚5…[´N¬%éÄk÷h•ñZp®?›¯IÜ£•Ï²ƒ^n$ˆÑæÞY7A×ÖÆëZP[¶ fȓ0 \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_149_7.dat b/lib/phpqrcode/cache/mask_7/mask_149_7.dat new file mode 100644 index 00000000..809f0055 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_149_7.dat @@ -0,0 +1 @@ +xÚíÜÑnà …á{? ¼ÿËu“Ú†­…´2»ÕG$nˆˆcççÈF¡µKëÉ×Ðb3ª÷ôþÖªt³îûªPc çÌ¥Ó7[¢?9:ñÕý['éÁë9'¾*Ӗ àGæÜa°½hÖ_¿¹/«zÁ+Î6XB‡>ê˜2ôqYÀJ…0Êù黏šBfaƒÄ 1ˆÁª ȇ9c7Gë ùOl©ô,Å^¥ßÅ꽓òÁ3ƒÕòA:Hé Ä 1ˆA bƒÄàÿ0X4œ%Ù«½û#ÇÔd>¢&Cé ¤ƒÄ 1ˆA bƒ<šA{ôo¿G¯&óLM†ÒA:H1ˆA bƒÄ 1è¿ {ôj2þ› ƒtbƒÄ 1ˆA &1Xç`¼_ Ö9ÛðÊ`«™®B˜¶G_çlÃ5™:g5™¶ajMæÍLÔÁŠËèƒIý <|r. \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_153_7.dat b/lib/phpqrcode/cache/mask_7/mask_153_7.dat new file mode 100644 index 00000000..c1ab2766 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_153_7.dat @@ -0,0 +1,2 @@ +xÚíÜQ‚0„á÷= ½ÿ匉B5ˆ +ю惤/Í²åïØIÙiº^-àî®Zkm|»YDhë9 ›ÎêÃ\{’KÇƶ·{Ÿy—³Ç3ßv†¶Ì»œE]u`RÚÇrý"›ß}ÛY ½ëeÂ2{ÛVV8][×.n:+2_ç¶ÊÂBÃ&6±‰Mlb›ØÄ&6ß`3i¿9Y³³åΌ諡yÙúU}ԟ82f-vږÕ6 nÒMºI7±‰Mlb›ØÄ&6±ùólæî7ãÎð‚þÕ ¢›t“nÒMlb›ØÄ&6±‰Mlþ2›ÎüÍÙ^Ð/ˆnÒMºI7±‰Mlb›ØÄ&6±é;gxA¾C¡›t“núO‹Mlb›ØÄ&6±y€Íy•ÇfP¥Õ[6Ÿ4ºßÌ«Ùk`v^Ð+Ó9Ä Ê¬OÛ±ùð}Ï攨›™+ZXíè®=:iWE \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_157_7.dat b/lib/phpqrcode/cache/mask_7/mask_157_7.dat new file mode 100644 index 00000000..2db27f68 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_157_7.dat @@ -0,0 +1,2 @@ +xÚíÜM +ƒ0Eáù[M²ÿ͕‚­ü£s¡_„ ž‰ÇÛã ­}F¹†Qks½‡Ì{Ý%¶WqÛ÷×îø.ž­¬Ýþϯ­]Ü8evV½ßbvV}è®_µÜEÌ»n3W^KÃ\Ÿ`äÖV캽çZl³˜Å,f1‹YÌþ;³af±Ôkž·Þ¨×úiàè“ÁÄzÍôÖËz?urVÎÊY9‹YÌb³˜Å,fù,Ÿå³|VÎÊY9+g1‹YÌb³˜Å,Ÿå³|–ÏÊY9+gý7Æ,f1‹YÌb³|–ÏòY>+g嬜Å,f1‹YÌb³|–ÏòY>+g嬜•³˜Å,f1‹YÌþÈlâùƳi§o˜ý.\¦ÏƝo<úl;9º:Âg[®Ï¶lŸmÁÔ^œI>=gϙœ³-yk_TAµ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_161_7.dat b/lib/phpqrcode/cache/mask_7/mask_161_7.dat new file mode 100644 index 00000000..35ba8ff4 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_161_7.dat @@ -0,0 +1 @@ +xÚíÜю …áûyšòþ/皨E)Æ®›î1~4áÂœý93,˵´ «+µØZT=Zeâ¶C»¹ú.~iߏµ§¯ÊÞÖ&>Œ,–ÿÔï´6eù˜·í•Ö~,láW]ì ®»º2Íê꺐±Ý\Ñþ;×µ2j"–±Œe,ËrXŒÝµVÓ(ícìµµZӖ1‘™§8Þ©í§‰±/,'ÇØt™.ÓeºŒe,cËXÆ2–±Œåß±,_þŠ|ytõüç£ï|ÎÜ]¦Ët™.cËXÆ2–±Œe,cyËòå/ɗ­ysî‹.ÓeºL—±Œe,cËXÆ2–±lo…|ÙZ{+è2]¦Ëbl,cËXÆ2–±Œe{+äË֊Ø[A—é2]¦ËXÆ2–±Œe,c9åÌCÐXÎ<ëþÆò’Ÿ/owsP¾œyÖý]¾œyÖ}·VdÙìæ°¹¯d9J—Ó‡ì)Ë1õ jI2ë \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_165_7.dat b/lib/phpqrcode/cache/mask_7/mask_165_7.dat new file mode 100644 index 00000000..e27fb8ed --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_165_7.dat @@ -0,0 +1 @@ +xÚíÝQŽ‚0Ðÿ·š²ÿÍM&A,NĘ̈!—x0é‡&XZׇZ»-KØ«[êÞÉeÉj‡½Œëæx,ƒ§¼ú.ï·g}ë`;ÿþþ+k{ËÑ~1ŸŽÿ}á+k{ËØ¥ž™¾SGùWãgî}‡Ý¬@Û?_µö8퐾o+·k][·hô”Wü8~·u·ÜMÆgœqÆg|j<õ·ú¶¶Ú*ßq=<¯”Ïü¤æۓRwƓëñÕøøÌüÄÌéŸÈq9.Çå8ãŒ3Î8ãŒ3Î8ãIÆÕãUGÿ?~µsnr\ŽËq9Î8ãŒ3Î8ãŒ3Îx€qõøÇÕ㮁yç979.Çå¸gœqÆgœqÆgÜ=)êq×À¸'EŽËq9.ÇgœqÆgœqÆwOŠzÜ50îI‘ãr\Žû­Î8ãŒ3Î8ãŒ_ÆøVvd}²ÇÞøü¡aõx˯ÇÛ5êñã)¹&ÿ9)ñÙÞf¼¥çxþ3øYH]ûS^*/ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_169_7.dat b/lib/phpqrcode/cache/mask_7/mask_169_7.dat new file mode 100644 index 0000000000000000000000000000000000000000..ef1a181f2cfd4fb995864843d58efd1a33443bcf GIT binary patch literal 383 zcmb=p_4aOTUz33Z>xJ+6rf>h5o6qcIQd2nm=Y_6}PsM~AQyzW1wahnqx4i9#trl79 zGTt{n-#Tkq_|`@8b@BO^-&#lQzJI&bdA?QLEw|ZnT7O=OKRfSrJL~d`Aw9u`O=epcc%X?f~g1U{2P4x`u+VC z_4Xxs=ND}`cY4xm literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_7/mask_173_7.dat b/lib/phpqrcode/cache/mask_7/mask_173_7.dat new file mode 100644 index 00000000..3b513712 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_173_7.dat @@ -0,0 +1 @@ +xÚíÝÝjÃ0 Ð{=Mòþ/· RbÖH¬û«´rj\Ç=ý,ºm·coúZŽ8;»ïmÏ÷½mÛÝë±0b÷ƒ_ߚt$~Wu5ÛǚNnÜ'?dÕf2¶í(oÁïßGÚ,Løþù÷õ6_{»zÅÑ÷Æ? Ë9úwq9Ç àS!ƌëÛ9Îoë€î2 L`˜˜pµŒ¬––O»Enï¶v8L˜²v8L¸º UáY×"ûd}ê K›r‚œ 'È ÖL`˜À&0 L`B'fÕ:ïO8ÛTcTc\kŒr‚œ 'È ÖL`˜À&0 L`BìY²gIñ§kŒr‚œ 'È ÖL`˜À&0 L`‚ç"íYRcô\¤œ 'È r˜À&0 L`˜ÀÏEÚ³¤Æè¹H9ANä&0 L`˜À&ü'úÿ!Ø;êÅq+¶Yõ„l*´Ü³´þ=؀ã9¶jŒ[2ÚÖÿ€ Ms¤Ÿ‡Ô„–ç­ë*Ø \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_177_7.dat b/lib/phpqrcode/cache/mask_7/mask_177_7.dat new file mode 100644 index 0000000000000000000000000000000000000000..068477c92af080afb53465a651dd7d1815d562c2 GIT binary patch literal 407 zcmb=p_4e+?tY!lS)(hWjd_VoS4`&P8oD}qI!Lz*MP5ODNZExOG1+MwJb8D;p-LO8! z?c3h{D>>rL|Ffpgd7A6Xc6+Psn~m@D{rRxH?)O~%;+lWWo2OpY#{~EVH=u6 z*CeoNM;zn|YxyENS5&k1Xxh;g$7WrP-Y%=Xxj1^=`WtIKUTA-NKSlcq*G{K(1-ys2 zkTw0`)@J(M6-dz@>7=A*us5M&v*{}_V zikH1R`f1L}yvxPQidw;HV6KBY)F%BE(1c~reV&3`GXd;yxF5O}ivA8Q?Gyc+m*}Yd zYKdyZw)H0}-4ng5+!L?o?u!;XT{?T~wJmv{XFN90&I($0Ldf#T-Q#!vG0tQ&@c{s0 CYRvKg literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_7/mask_21_7.dat b/lib/phpqrcode/cache/mask_7/mask_21_7.dat new file mode 100644 index 00000000..4f9f1386 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_21_7.dat @@ -0,0 +1,4 @@ +xڝQ +À0 Bÿ=Þÿr]š˜-?]Rl‡ä݃2•¦¹nc +ð[Ž¹öÝnùAÃ".–j+êi +~‹x3<úaXÚ{H†ÖC1xÉÀ)â„á¤üSå \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_25_7.dat b/lib/phpqrcode/cache/mask_7/mask_25_7.dat new file mode 100644 index 00000000..cefe1b97 --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_25_7.dat @@ -0,0 +1 @@ +xڝQAÀ »÷5ôÿŸ[F@©àaƒ„ÄÔÖZ̲… >;’ÐÀQ±ÊIÖÀQH8Rÿ¼ñ҈GÉ"èz,ù½&‡ñþ;±­Ð'oñ»97”%P8%÷6oǽ;]ÞúNWnÝ[äf7¹ÌÕvÔ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_29_7.dat b/lib/phpqrcode/cache/mask_7/mask_29_7.dat new file mode 100644 index 00000000..e3d7391b --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_29_7.dat @@ -0,0 +1,2 @@ +xÚÕR9À ÛýšøÿŸ«ŠÈQpX˜$læŲf!I2pgSãªêªMZj·ºóÌÃÂ"útŠðï¡e0¾¿#ԛ`_Ë1-±ÞóŽé´câÝÍ÷òha÷~/¡Eh™4¦Åæ"ä˜~Ï \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_37_7.dat b/lib/phpqrcode/cache/mask_7/mask_37_7.dat new file mode 100644 index 0000000000000000000000000000000000000000..87d9a1a9d2c57b346aa4a8a2e03754a7f7668ab3 GIT binary patch literal 122 zcmV-=0EPc}+U-<34nQFY+c^!r|K-dh{-xmXMloTrDOS>|wt{nN$p8UIKT#gc;o<{l zE|1OO;;@B_*1sBYail&HAVaMSznZ$V?+Zst%JX#@k^|V&_%v=tL+(dx9wGsNg^L)? cH0CK`8l%kV8sp6AdyF;KJ?hQK0&cYgLugGq!2kdN literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_7/mask_41_7.dat b/lib/phpqrcode/cache/mask_7/mask_41_7.dat new file mode 100644 index 00000000..8acec04f --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_41_7.dat @@ -0,0 +1 @@ +xÚíTAÀ »÷5ôÿŸ[fDYæ(O’^¬ÅbR3/~t/L"¹Ä7SQQ5…jÔ\S—šiíñÎb£ß#ՆȏÂ×+Ç£¤w#æzõx?Þ㽧A-ëšw•u曑Y7$b.%AËÇ;•w«Rµ÷ñoxG}?ƒ \ No newline at end of file diff --git a/lib/phpqrcode/cache/mask_7/mask_45_7.dat b/lib/phpqrcode/cache/mask_7/mask_45_7.dat new file mode 100644 index 0000000000000000000000000000000000000000..dbba31d0bfddcbed98ea5d7a9f6ee59f976e0421 GIT binary patch literal 173 zcmV;e08;;W+U-@*3cw%;e7~=;|Npr$DAUrsy$v=4K{1olOOYWhIYuypTZ?rVorcG` ziBe#%j*Q*dv)kOh(x@276Nxd&JP9U=2L~+ngMKq>jn}9{jK*jHRSM|5x5n%q5&j`e zsyWelhq7a3OJw7iYkdjosJYWIS!tZw|D3#JI49hv+1NkUa3?Dz bQL;xvA(=V?*)bSkL5FpXakG_S`^qkH-^P*%H1XEuNsLnfvAu` z`*BEI8A_NDBQX*qG5P?bYCW1Y9JBiGIs;FK@Oe8gF(1@>hQVmp28DF`j`Xh+BQX-A zPcoX-fMZmg?C*@cp*&oVxZ$(2Gpy+uA|bgw1Aot87`^rkIYy2Bj`)lr?t+Z`0Y=4# E+IH1p%m4rY literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_7/mask_73_7.dat b/lib/phpqrcode/cache/mask_7/mask_73_7.dat new file mode 100644 index 0000000000000000000000000000000000000000..f414e4a5877861bd45e439125a47c52b70a0ca12 GIT binary patch literal 221 zcmV<303!c*+U;1;4#OY_e7~=O|NpsVOKWw-svJ$a1xQMLKjmF z$Fo{kZk}5~sTj*XCvO!sEAx=sT{$)7Ae9TQEOc4^f@wQ)ea)wu7H%}{#MK=l@)ASD zb^%LDMOj|2h)%FTj!en)$C=J-W^O$fr&vx@-|THnt7dOwYNfBvQ>ukv oÌ40Ý÷ãT±%9¯‘Ô6²ü÷ªU5‹*sI{`¹ªÿ™_²>S?ç}(:yâTïlï{G&E\”Ö6¨õ}"A’¤X‹õ XϬ«²³Ç<Âmwx°fÜá‘G”QSkr0$!s zmX(et@ z$j}>#8;TpsDPluxhz+rk$AtTL3lG`X3UJ4`446UdL}WW&@+vhnbfN!;F1qj9*+b^XNIk3 z`ZsZ(ai8(tWM<5anK3hF=1a_o^~_APRcC!GK5O7o1G~?-&v25BNzV0+I1 literal 0 HcmV?d00001 diff --git a/lib/phpqrcode/cache/mask_7/mask_97_7.dat b/lib/phpqrcode/cache/mask_7/mask_97_7.dat new file mode 100644 index 00000000..b277368b --- /dev/null +++ b/lib/phpqrcode/cache/mask_7/mask_97_7.dat @@ -0,0 +1,2 @@ +xÚíšáƒ0„ÿßÓÀû¿Ü²D[ÌÚâV.K¶«Iÿ`…â'ž³sxáº÷Âyäå”$ùxãxÃ"Îéª×= O^&pêb¶ÊÈYʬž$êKŸÝ£àÁÉŽ8KŸ…Ë ÎeÌó¡¥ ÔøŸ3:$bI,‰%±$–ÄÒYb襶 +M)¯TôŽ %q®¬Èô綦EÿœX}jlØT—T—ôŽKbI,‰%±ô,ñõã_e[%íýŽöV]R]Ò;N,‰%±$–þ’%VŸ@`‰Ñ%pa©m€§—(}ñ_¥%í%ÚÛ¸ÚÛøÚÛÈ4¥='u)ai¿.;M¾ù> \ No newline at end of file diff --git a/lib/phpqrcode/index.php b/lib/phpqrcode/index.php new file mode 100644 index 00000000..9e14b7ea --- /dev/null +++ b/lib/phpqrcode/index.php @@ -0,0 +1,94 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + echo "

PHP QR Code


"; + + //set it to writable location, a place for temp generated PNG files + $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR; + + //html PNG location prefix + $PNG_WEB_DIR = 'temp/'; + + include "qrlib.php"; + + //ofcourse we need rights to create temp dir + if (!file_exists($PNG_TEMP_DIR)) + mkdir($PNG_TEMP_DIR); + + + $filename = $PNG_TEMP_DIR.'test.png'; + + //processing form input + //remember to sanitize user input in real-life solution !!! + $errorCorrectionLevel = 'L'; + if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H'))) + $errorCorrectionLevel = $_REQUEST['level']; + + $matrixPointSize = 4; + if (isset($_REQUEST['size'])) + $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10); + + + if (isset($_REQUEST['data'])) { + + //it's very important! + if (trim($_REQUEST['data']) == '') + die('data cannot be empty! back'); + + // user data + $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png'; + QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2); + + } else { + + //default data + echo 'You can provide data in GET parameter: like that
'; + QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2); + + } + + //display generated file + echo '
'; + + //config form + echo '
+ Data:   + ECC:   + Size:   +

'; + + // benchmark + QRtools::timeBenchmark(); + + \ No newline at end of file diff --git a/lib/phpqrcode/phpqrcode.php b/lib/phpqrcode/phpqrcode.php new file mode 100644 index 00000000..80adb9df --- /dev/null +++ b/lib/phpqrcode/phpqrcode.php @@ -0,0 +1,3312 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +/* + * Version: 1.1.4 + * Build: 2010100721 + */ + + + +//---- qrconst.php ----------------------------- + + + + + +/* + * PHP QR Code encoder + * + * Common constants + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + // Encoding modes + + define('QR_MODE_NUL', -1); + define('QR_MODE_NUM', 0); + define('QR_MODE_AN', 1); + define('QR_MODE_8', 2); + define('QR_MODE_KANJI', 3); + define('QR_MODE_STRUCTURE', 4); + + // Levels of error correction. + + define('QR_ECLEVEL_L', 0); + define('QR_ECLEVEL_M', 1); + define('QR_ECLEVEL_Q', 2); + define('QR_ECLEVEL_H', 3); + + // Supported output formats + + define('QR_FORMAT_TEXT', 0); + define('QR_FORMAT_PNG', 1); + + class qrstr { + public static function set(&$srctab, $x, $y, $repl, $replLen = false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + } + } + + + +//---- merged_config.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Config file, tuned-up for merged verion + */ + + define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there + define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true + define('QR_LOG_DIR', false); // default error logs dir + + define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code + define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly + define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false + + define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images + + + + +//---- qrtools.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Toolset, handy and debug utilites. + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRtools { + + //---------------------------------------------------------------------- + public static function binarize($frame) + { + $len = count($frame); + foreach ($frame as &$frameLine) { + + for($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + + return $frame; + } + + //---------------------------------------------------------------------- + public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') + { + $barcode_array = array(); + + if (!is_array($mode)) + $mode = explode(',', $mode); + + $eccLevel = 'L'; + + if (count($mode) > 1) { + $eccLevel = $mode[1]; + } + + $qrTab = QRcode::text($code, false, $eccLevel); + $size = count($qrTab); + + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach(str_split($line) as $char) + $arrAdd[] = ($char=='1')?1:0; + $barcode_array['bcode'][] = $arrAdd; + } + + return $barcode_array; + } + + //---------------------------------------------------------------------- + public static function clearCache() + { + self::$frames = array(); + } + + //---------------------------------------------------------------------- + public static function buildCache() + { + QRtools::markTime('before_build_cache'); + + $mask = new QRmask(); + for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { + $frame = QRspec::newFrame($a); + if (QR_IMAGE) { + $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; + QRimage::png(self::binarize($frame), $fileName, 1, 0); + } + + $width = count($frame); + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($maskNo=0; $maskNo<8; $maskNo++) + $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); + } + + QRtools::markTime('after_build_cache'); + } + + //---------------------------------------------------------------------- + public static function log($outfile, $err) + { + if (QR_LOG_DIR !== false) { + if ($err != '') { + if ($outfile !== false) { + file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } else { + file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } + } + } + } + + //---------------------------------------------------------------------- + public static function dumpMask($frame) + { + $width = count($frame); + for($y=0;$y<$width;$y++) { + for($x=0;$x<$width;$x++) { + echo ord($frame[$y][$x]).','; + } + } + } + + //---------------------------------------------------------------------- + public static function markTime($markerId) + { + list($usec, $sec) = explode(" ", microtime()); + $time = ((float)$usec + (float)$sec); + + if (!isset($GLOBALS['qr_time_bench'])) + $GLOBALS['qr_time_bench'] = array(); + + $GLOBALS['qr_time_bench'][$markerId] = $time; + } + + //---------------------------------------------------------------------- + public static function timeBenchmark() + { + self::markTime('finish'); + + $lastTime = 0; + $startTime = 0; + $p = 0; + + echo ' + + '; + + foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { + if ($p > 0) { + echo ''; + } else { + $startTime = $thisTime; + } + + $p++; + $lastTime = $thisTime; + } + + echo ' + + +
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; + } + + } + + //########################################################################## + + QRtools::markTime('start'); + + + + +//---- qrspec.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * QR Code specifications + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QRSPEC_VERSION_MAX', 40); + define('QRSPEC_WIDTH_MAX', 177); + + define('QRCAP_WIDTH', 0); + define('QRCAP_WORDS', 1); + define('QRCAP_REMINDER', 2); + define('QRCAP_EC', 3); + + class QRspec { + + public static $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), + array( 29, 70, 7, array( 15, 26, 36, 44)), + array( 33, 100, 7, array( 20, 36, 52, 64)), + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), + array( 45, 196, 0, array( 40, 72, 108, 130)), + array( 49, 242, 0, array( 48, 88, 132, 156)), + array( 53, 292, 0, array( 60, 110, 160, 192)), + array( 57, 346, 0, array( 72, 130, 192, 224)), //10 + array( 61, 404, 0, array( 80, 150, 224, 264)), + array( 65, 466, 0, array( 96, 176, 260, 308)), + array( 69, 532, 0, array( 104, 198, 288, 352)), + array( 73, 581, 3, array( 120, 216, 320, 384)), + array( 77, 655, 3, array( 132, 240, 360, 432)), //15 + array( 81, 733, 3, array( 144, 280, 408, 480)), + array( 85, 815, 3, array( 168, 308, 448, 532)), + array( 89, 901, 3, array( 180, 338, 504, 588)), + array( 93, 991, 3, array( 196, 364, 546, 650)), + array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 + array(101, 1156, 4, array( 224, 442, 644, 750)), + array(105, 1258, 4, array( 252, 476, 690, 816)), + array(109, 1364, 4, array( 270, 504, 750, 900)), + array(113, 1474, 4, array( 300, 560, 810, 960)), + array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), + array(125, 1828, 4, array( 360, 700, 1020, 1200)), + array(129, 1921, 3, array( 390, 728, 1050, 1260)), + array(133, 2051, 3, array( 420, 784, 1140, 1350)), + array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), + array(145, 2465, 3, array( 510, 924, 1350, 1620)), + array(149, 2611, 3, array( 540, 980, 1440, 1710)), + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 + ); + + //---------------------------------------------------------------------- + public static function getDataLength($version, $level) + { + return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getECCLength($version, $level) + { + return self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getWidth($version) + { + return self::$capacity[$version][QRCAP_WIDTH]; + } + + //---------------------------------------------------------------------- + public static function getRemainder($version) + { + return self::$capacity[$version][QRCAP_REMINDER]; + } + + //---------------------------------------------------------------------- + public static function getMinimumVersion($size, $level) + { + + for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { + $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; + if($words >= $size) + return $i; + } + + return -1; + } + + //###################################################################### + + public static $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + //---------------------------------------------------------------------- + public static function lengthIndicator($mode, $version) + { + if ($mode == QR_MODE_STRUCTURE) + return 0; + + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + return self::$lengthTableBits[$mode][$l]; + } + + //---------------------------------------------------------------------- + public static function maximumWords($mode, $version) + { + if($mode == QR_MODE_STRUCTURE) + return 3; + + if($version <= 9) { + $l = 0; + } else if($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + $bits = self::$lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + + if($mode == QR_MODE_KANJI) { + $words *= 2; // the number of bytes is required + } + + return $words; + } + + // Error correction code ----------------------------------------------- + // Table of the error correction code (Reed-Solomon block) + // See Table 12-16 (pp.30-36), JIS X0510:2004. + + public static $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 + ); + + //---------------------------------------------------------------------- + // CACHEABLE!!! + + public static function getEccSpec($version, $level, array &$spec) + { + if (count($spec) < 5) { + $spec = array(0,0,0,0,0); + } + + $b1 = self::$eccTable[$version][$level][0]; + $b2 = self::$eccTable[$version][$level][1]; + $data = self::getDataLength($version, $level); + $ecc = self::getECCLength($version, $level); + + if($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + } + + // Alignment pattern --------------------------------------------------- + + // Positions of alignment patterns. + // This array includes only the second and the third position of the + // alignment patterns. Rest of them can be calculated from the distance + // between them. + + // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + + public static $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 + ); + + + /** -------------------------------------------------------------------- + * Put an alignment marker. + * @param frame + * @param width + * @param ox,oy center coordinate of the pattern + */ + public static function putAlignmentMarker(array &$frame, $ox, $oy) + { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + + $yStart = $oy-2; + $xStart = $ox-2; + + for($y=0; $y<5; $y++) { + QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function putAlignmentPattern($version, &$frame, $width) + { + if($version < 2) + return; + + $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; + if($d < 0) { + $w = 2; + } else { + $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); + } + + if($w * $w - 3 == 1) { + $x = self::$alignmentPattern[$version][0]; + $y = self::$alignmentPattern[$version][0]; + self::putAlignmentMarker($frame, $x, $y); + return; + } + + $cx = self::$alignmentPattern[$version][0]; + for($x=1; $x<$w - 1; $x++) { + self::putAlignmentMarker($frame, 6, $cx); + self::putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + + $cy = self::$alignmentPattern[$version][0]; + for($y=0; $y<$w-1; $y++) { + $cx = self::$alignmentPattern[$version][0]; + for($x=0; $x<$w-1; $x++) { + self::putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + } + + // Version information pattern ----------------------------------------- + + // Version information pattern (BCH coded). + // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + + // size: [QRSPEC_VERSION_MAX - 6] + + public static $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, + 0x27541, 0x28c69 + ); + + //---------------------------------------------------------------------- + public static function getVersionPattern($version) + { + if($version < 7 || $version > QRSPEC_VERSION_MAX) + return 0; + + return self::$versionPattern[$version -7]; + } + + // Format information -------------------------------------------------- + // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) + + public static $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) + ); + + public static function getFormatInfo($mask, $level) + { + if($mask < 0 || $mask > 7) + return 0; + + if($level < 0 || $level > 3) + return 0; + + return self::$formatInfo[$level][$mask]; + } + + // Frame --------------------------------------------------------------- + // Cache of initial frames. + + public static $frames = array(); + + /** -------------------------------------------------------------------- + * Put a finder pattern. + * @param frame + * @param width + * @param ox,oy upper-left coordinate of the pattern + */ + public static function putFinderPattern(&$frame, $ox, $oy) + { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + + for($y=0; $y<7; $y++) { + QRstr::set($frame, $ox, $oy+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function createFrame($version) + { + $width = self::$capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + + // Finder pattern + self::putFinderPattern($frame, 0, 0); + self::putFinderPattern($frame, $width - 7, 0); + self::putFinderPattern($frame, 0, $width - 7); + + // Separator + $yOffset = $width - 7; + + for($y=0; $y<7; $y++) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + $yOffset++; + } + + $setPattern = str_repeat("\xc0", 8); + + QRstr::set($frame, 0, 7, $setPattern); + QRstr::set($frame, $width-8, 7, $setPattern); + QRstr::set($frame, 0, $width - 8, $setPattern); + + // Format info + $setPattern = str_repeat("\x84", 9); + QRstr::set($frame, 0, 8, $setPattern); + QRstr::set($frame, $width - 8, 8, $setPattern, 8); + + $yOffset = $width - 8; + + for($y=0; $y<8; $y++,$yOffset++) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + + // Timing pattern + + for($i=1; $i<$width-15; $i++) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + + // Alignment pattern + self::putAlignmentPattern($version, $frame, $width); + + // Version information + if($version >= 7) { + $vinf = self::getVersionPattern($version); + + $v = $vinf; + + for($x=0; $x<6; $x++) { + for($y=0; $y<3; $y++) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + + $v = $vinf; + for($y=0; $y<6; $y++) { + for($x=0; $x<3; $x++) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + + // and a little bit... + $frame[$width - 8][8] = "\x81"; + + return $frame; + } + + //---------------------------------------------------------------------- + public static function debug($frame, $binary_mode = false) + { + if ($binary_mode) { + + foreach ($frame as &$frameLine) { + $frameLine = join('  ', explode('0', $frameLine)); + $frameLine = join('██', explode('1', $frameLine)); + } + + ?> + +


        '; + echo join("
        ", $frame); + echo '






'; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
", $frame); + echo "
"; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(file_get_contents($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + file_put_contents($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + + } + + + +//---- qrimage.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Image output of code using GD2 + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QR_IMAGE', true); + + class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/png"); + ImagePng($image); + } else { + if($saveandprint===TRUE){ + ImagePng($image, $filename); + header("Content-type: image/png"); + ImagePng($image); + }else{ + ImagePng($image, $filename); + } + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/jpeg"); + ImageJpeg($image, null, $q); + } else { + ImageJpeg($image, $filename, $q); + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image =ImageCreate($imgW, $imgH); + + $col[0] = ImageColorAllocate($base_image,255,255,255); + $col[1] = ImageColorAllocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + ImageDestroy($base_image); + + return $target_image; + } + } + + + +//---- qrinput.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input encoding class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('STRUCTURE_HEADER_BITS', 20); + define('MAX_STRUCTURED_SYMBOLS', 16); + + class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } + }; + + //########################################################################## + + class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if( $size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if( $val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = array(); + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } + } + + + + + + +//---- qrbitstream.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Bitstream class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRbitstream { + + public $data = array(); + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public static function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public static function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return array(); + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } + + } + + + + +//---- qrsplit.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input splitting classes + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public static function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public static function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } + } + + + +//---- qrrscode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Reed-Solomon error correction support + * + * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + * (libfec is released under the GNU Lesser General Public License.) + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } + } + + //########################################################################## + + class QRrs { + + public static $items = array(); + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } + } + + + +//---- qrmask.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Masking + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('N1', 3); + define('N2', 3); + define('N3', 40); + define('N4', 10); + + class QRmask { + + public $runLength = array(); + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public static function serial($bitFrame) + { + $codeArr = array(); + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + $codeArr = array(); + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = array(); + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(file_get_contents($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + file_put_contents($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } + + //---------------------------------------------------------------------- + } + + + + +//---- qrencode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Main encoder classes. + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsblock { + public $dataLength; + public $data = array(); + public $eccLength; + public $ecc = array(); + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } + }; + + //########################################################################## + + class QRrawcode { + public $version; + public $datacode = array(); + public $ecccode = array(); + public $blocks; + public $rsblocks = array(); //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + $ret; + + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } + } + + //########################################################################## + + class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } + } + + //########################################################################## + + class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + + } ; + + //########################################################################## + + class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + } + + diff --git a/lib/phpqrcode/qrbitstream.php b/lib/phpqrcode/qrbitstream.php new file mode 100644 index 00000000..7d4ec4a6 --- /dev/null +++ b/lib/phpqrcode/qrbitstream.php @@ -0,0 +1,180 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRbitstream { + + public $data = array(); + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public static function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public static function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return array(); + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } + + } diff --git a/lib/phpqrcode/qrconfig.php b/lib/phpqrcode/qrconfig.php new file mode 100644 index 00000000..e53dff8c --- /dev/null +++ b/lib/phpqrcode/qrconfig.php @@ -0,0 +1,17 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + // Encoding modes + + define('QR_MODE_NUL', -1); + define('QR_MODE_NUM', 0); + define('QR_MODE_AN', 1); + define('QR_MODE_8', 2); + define('QR_MODE_KANJI', 3); + define('QR_MODE_STRUCTURE', 4); + + // Levels of error correction. + + define('QR_ECLEVEL_L', 0); + define('QR_ECLEVEL_M', 1); + define('QR_ECLEVEL_Q', 2); + define('QR_ECLEVEL_H', 3); + + // Supported output formats + + define('QR_FORMAT_TEXT', 0); + define('QR_FORMAT_PNG', 1); + + class qrstr { + public static function set(&$srctab, $x, $y, $repl, $replLen = false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + } + } \ No newline at end of file diff --git a/lib/phpqrcode/qrencode.php b/lib/phpqrcode/qrencode.php new file mode 100644 index 00000000..4b77a5bd --- /dev/null +++ b/lib/phpqrcode/qrencode.php @@ -0,0 +1,502 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsblock { + public $dataLength; + public $data = array(); + public $eccLength; + public $ecc = array(); + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } + }; + + //########################################################################## + + class QRrawcode { + public $version; + public $datacode = array(); + public $ecccode = array(); + public $blocks; + public $rsblocks = array(); //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + $ret; + + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } + } + + //########################################################################## + + class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } + } + + //########################################################################## + + class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + + } ; + + //########################################################################## + + class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + } diff --git a/lib/phpqrcode/qrimage.php b/lib/phpqrcode/qrimage.php new file mode 100644 index 00000000..10b0a6e1 --- /dev/null +++ b/lib/phpqrcode/qrimage.php @@ -0,0 +1,95 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QR_IMAGE', true); + + class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/png"); + ImagePng($image); + } else { + if($saveandprint===TRUE){ + ImagePng($image, $filename); + header("Content-type: image/png"); + ImagePng($image); + }else{ + ImagePng($image, $filename); + } + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/jpeg"); + ImageJpeg($image, null, $q); + } else { + ImageJpeg($image, $filename, $q); + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image =ImageCreate($imgW, $imgH); + + $col[0] = ImageColorAllocate($base_image,255,255,255); + $col[1] = ImageColorAllocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + ImageDestroy($base_image); + + return $target_image; + } + } \ No newline at end of file diff --git a/lib/phpqrcode/qrinput.php b/lib/phpqrcode/qrinput.php new file mode 100644 index 00000000..0f6d7f94 --- /dev/null +++ b/lib/phpqrcode/qrinput.php @@ -0,0 +1,729 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('STRUCTURE_HEADER_BITS', 20); + define('MAX_STRUCTURED_SYMBOLS', 16); + + class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } + }; + + //########################################################################## + + class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if( $size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if( $val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = array(); + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } + } + + + \ No newline at end of file diff --git a/lib/phpqrcode/qrlib.php b/lib/phpqrcode/qrlib.php new file mode 100644 index 00000000..d55c4af2 --- /dev/null +++ b/lib/phpqrcode/qrlib.php @@ -0,0 +1,43 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; + + // Required libs + + include $QR_BASEDIR."qrconst.php"; + include $QR_BASEDIR."qrconfig.php"; + include $QR_BASEDIR."qrtools.php"; + include $QR_BASEDIR."qrspec.php"; + include $QR_BASEDIR."qrimage.php"; + include $QR_BASEDIR."qrinput.php"; + include $QR_BASEDIR."qrbitstream.php"; + include $QR_BASEDIR."qrsplit.php"; + include $QR_BASEDIR."qrrscode.php"; + include $QR_BASEDIR."qrmask.php"; + include $QR_BASEDIR."qrencode.php"; + diff --git a/lib/phpqrcode/qrmask.php b/lib/phpqrcode/qrmask.php new file mode 100644 index 00000000..b14d7ae1 --- /dev/null +++ b/lib/phpqrcode/qrmask.php @@ -0,0 +1,328 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('N1', 3); + define('N2', 3); + define('N3', 40); + define('N4', 10); + + class QRmask { + + public $runLength = array(); + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public static function serial($bitFrame) + { + $codeArr = array(); + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + $codeArr = array(); + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = array(); + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(file_get_contents($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + file_put_contents($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } + + //---------------------------------------------------------------------- + } diff --git a/lib/phpqrcode/qrrscode.php b/lib/phpqrcode/qrrscode.php new file mode 100644 index 00000000..591129a3 --- /dev/null +++ b/lib/phpqrcode/qrrscode.php @@ -0,0 +1,210 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } + } + + //########################################################################## + + class QRrs { + + public static $items = array(); + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } + } \ No newline at end of file diff --git a/lib/phpqrcode/qrspec.php b/lib/phpqrcode/qrspec.php new file mode 100644 index 00000000..92aea0c7 --- /dev/null +++ b/lib/phpqrcode/qrspec.php @@ -0,0 +1,592 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QRSPEC_VERSION_MAX', 40); + define('QRSPEC_WIDTH_MAX', 177); + + define('QRCAP_WIDTH', 0); + define('QRCAP_WORDS', 1); + define('QRCAP_REMINDER', 2); + define('QRCAP_EC', 3); + + class QRspec { + + public static $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), + array( 29, 70, 7, array( 15, 26, 36, 44)), + array( 33, 100, 7, array( 20, 36, 52, 64)), + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), + array( 45, 196, 0, array( 40, 72, 108, 130)), + array( 49, 242, 0, array( 48, 88, 132, 156)), + array( 53, 292, 0, array( 60, 110, 160, 192)), + array( 57, 346, 0, array( 72, 130, 192, 224)), //10 + array( 61, 404, 0, array( 80, 150, 224, 264)), + array( 65, 466, 0, array( 96, 176, 260, 308)), + array( 69, 532, 0, array( 104, 198, 288, 352)), + array( 73, 581, 3, array( 120, 216, 320, 384)), + array( 77, 655, 3, array( 132, 240, 360, 432)), //15 + array( 81, 733, 3, array( 144, 280, 408, 480)), + array( 85, 815, 3, array( 168, 308, 448, 532)), + array( 89, 901, 3, array( 180, 338, 504, 588)), + array( 93, 991, 3, array( 196, 364, 546, 650)), + array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 + array(101, 1156, 4, array( 224, 442, 644, 750)), + array(105, 1258, 4, array( 252, 476, 690, 816)), + array(109, 1364, 4, array( 270, 504, 750, 900)), + array(113, 1474, 4, array( 300, 560, 810, 960)), + array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), + array(125, 1828, 4, array( 360, 700, 1020, 1200)), + array(129, 1921, 3, array( 390, 728, 1050, 1260)), + array(133, 2051, 3, array( 420, 784, 1140, 1350)), + array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), + array(145, 2465, 3, array( 510, 924, 1350, 1620)), + array(149, 2611, 3, array( 540, 980, 1440, 1710)), + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 + ); + + //---------------------------------------------------------------------- + public static function getDataLength($version, $level) + { + return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getECCLength($version, $level) + { + return self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getWidth($version) + { + return self::$capacity[$version][QRCAP_WIDTH]; + } + + //---------------------------------------------------------------------- + public static function getRemainder($version) + { + return self::$capacity[$version][QRCAP_REMINDER]; + } + + //---------------------------------------------------------------------- + public static function getMinimumVersion($size, $level) + { + + for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { + $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; + if($words >= $size) + return $i; + } + + return -1; + } + + //###################################################################### + + public static $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + //---------------------------------------------------------------------- + public static function lengthIndicator($mode, $version) + { + if ($mode == QR_MODE_STRUCTURE) + return 0; + + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + return self::$lengthTableBits[$mode][$l]; + } + + //---------------------------------------------------------------------- + public static function maximumWords($mode, $version) + { + if($mode == QR_MODE_STRUCTURE) + return 3; + + if($version <= 9) { + $l = 0; + } else if($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + $bits = self::$lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + + if($mode == QR_MODE_KANJI) { + $words *= 2; // the number of bytes is required + } + + return $words; + } + + // Error correction code ----------------------------------------------- + // Table of the error correction code (Reed-Solomon block) + // See Table 12-16 (pp.30-36), JIS X0510:2004. + + public static $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 + ); + + //---------------------------------------------------------------------- + // CACHEABLE!!! + + public static function getEccSpec($version, $level, array &$spec) + { + if (count($spec) < 5) { + $spec = array(0,0,0,0,0); + } + + $b1 = self::$eccTable[$version][$level][0]; + $b2 = self::$eccTable[$version][$level][1]; + $data = self::getDataLength($version, $level); + $ecc = self::getECCLength($version, $level); + + if($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + } + + // Alignment pattern --------------------------------------------------- + + // Positions of alignment patterns. + // This array includes only the second and the third position of the + // alignment patterns. Rest of them can be calculated from the distance + // between them. + + // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + + public static $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 + ); + + + /** -------------------------------------------------------------------- + * Put an alignment marker. + * @param frame + * @param width + * @param ox,oy center coordinate of the pattern + */ + public static function putAlignmentMarker(array &$frame, $ox, $oy) + { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + + $yStart = $oy-2; + $xStart = $ox-2; + + for($y=0; $y<5; $y++) { + QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function putAlignmentPattern($version, &$frame, $width) + { + if($version < 2) + return; + + $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; + if($d < 0) { + $w = 2; + } else { + $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); + } + + if($w * $w - 3 == 1) { + $x = self::$alignmentPattern[$version][0]; + $y = self::$alignmentPattern[$version][0]; + self::putAlignmentMarker($frame, $x, $y); + return; + } + + $cx = self::$alignmentPattern[$version][0]; + for($x=1; $x<$w - 1; $x++) { + self::putAlignmentMarker($frame, 6, $cx); + self::putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + + $cy = self::$alignmentPattern[$version][0]; + for($y=0; $y<$w-1; $y++) { + $cx = self::$alignmentPattern[$version][0]; + for($x=0; $x<$w-1; $x++) { + self::putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + } + + // Version information pattern ----------------------------------------- + + // Version information pattern (BCH coded). + // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + + // size: [QRSPEC_VERSION_MAX - 6] + + public static $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, + 0x27541, 0x28c69 + ); + + //---------------------------------------------------------------------- + public static function getVersionPattern($version) + { + if($version < 7 || $version > QRSPEC_VERSION_MAX) + return 0; + + return self::$versionPattern[$version -7]; + } + + // Format information -------------------------------------------------- + // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) + + public static $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) + ); + + public static function getFormatInfo($mask, $level) + { + if($mask < 0 || $mask > 7) + return 0; + + if($level < 0 || $level > 3) + return 0; + + return self::$formatInfo[$level][$mask]; + } + + // Frame --------------------------------------------------------------- + // Cache of initial frames. + + public static $frames = array(); + + /** -------------------------------------------------------------------- + * Put a finder pattern. + * @param frame + * @param width + * @param ox,oy upper-left coordinate of the pattern + */ + public static function putFinderPattern(&$frame, $ox, $oy) + { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + + for($y=0; $y<7; $y++) { + QRstr::set($frame, $ox, $oy+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function createFrame($version) + { + $width = self::$capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + + // Finder pattern + self::putFinderPattern($frame, 0, 0); + self::putFinderPattern($frame, $width - 7, 0); + self::putFinderPattern($frame, 0, $width - 7); + + // Separator + $yOffset = $width - 7; + + for($y=0; $y<7; $y++) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + $yOffset++; + } + + $setPattern = str_repeat("\xc0", 8); + + QRstr::set($frame, 0, 7, $setPattern); + QRstr::set($frame, $width-8, 7, $setPattern); + QRstr::set($frame, 0, $width - 8, $setPattern); + + // Format info + $setPattern = str_repeat("\x84", 9); + QRstr::set($frame, 0, 8, $setPattern); + QRstr::set($frame, $width - 8, 8, $setPattern, 8); + + $yOffset = $width - 8; + + for($y=0; $y<8; $y++,$yOffset++) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + + // Timing pattern + + for($i=1; $i<$width-15; $i++) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + + // Alignment pattern + self::putAlignmentPattern($version, $frame, $width); + + // Version information + if($version >= 7) { + $vinf = self::getVersionPattern($version); + + $v = $vinf; + + for($x=0; $x<6; $x++) { + for($y=0; $y<3; $y++) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + + $v = $vinf; + for($y=0; $y<6; $y++) { + for($x=0; $x<3; $x++) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + + // and a little bit... + $frame[$width - 8][8] = "\x81"; + + return $frame; + } + + //---------------------------------------------------------------------- + public static function debug($frame, $binary_mode = false) + { + if ($binary_mode) { + + foreach ($frame as &$frameLine) { + $frameLine = join('  ', explode('0', $frameLine)); + $frameLine = join('██', explode('1', $frameLine)); + } + + ?> + +


        '; + echo join("
        ", $frame); + echo '






'; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
", $frame); + echo "
"; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(file_get_contents($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + file_put_contents($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + + } \ No newline at end of file diff --git a/lib/phpqrcode/qrsplit.php b/lib/phpqrcode/qrsplit.php new file mode 100644 index 00000000..d75b8273 --- /dev/null +++ b/lib/phpqrcode/qrsplit.php @@ -0,0 +1,311 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public static function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public static function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } + } \ No newline at end of file diff --git a/lib/phpqrcode/qrtools.php b/lib/phpqrcode/qrtools.php new file mode 100644 index 00000000..3012db49 --- /dev/null +++ b/lib/phpqrcode/qrtools.php @@ -0,0 +1,172 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRtools { + + //---------------------------------------------------------------------- + public static function binarize($frame) + { + $len = count($frame); + foreach ($frame as &$frameLine) { + + for($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + + return $frame; + } + + //---------------------------------------------------------------------- + public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') + { + $barcode_array = array(); + + if (!is_array($mode)) + $mode = explode(',', $mode); + + $eccLevel = 'L'; + + if (count($mode) > 1) { + $eccLevel = $mode[1]; + } + + $qrTab = QRcode::text($code, false, $eccLevel); + $size = count($qrTab); + + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach(str_split($line) as $char) + $arrAdd[] = ($char=='1')?1:0; + $barcode_array['bcode'][] = $arrAdd; + } + + return $barcode_array; + } + + //---------------------------------------------------------------------- + public static function clearCache() + { + self::$frames = array(); + } + + //---------------------------------------------------------------------- + public static function buildCache() + { + QRtools::markTime('before_build_cache'); + + $mask = new QRmask(); + for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { + $frame = QRspec::newFrame($a); + if (QR_IMAGE) { + $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; + QRimage::png(self::binarize($frame), $fileName, 1, 0); + } + + $width = count($frame); + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($maskNo=0; $maskNo<8; $maskNo++) + $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); + } + + QRtools::markTime('after_build_cache'); + } + + //---------------------------------------------------------------------- + public static function log($outfile, $err) + { + if (QR_LOG_DIR !== false) { + if ($err != '') { + if ($outfile !== false) { + file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } else { + file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } + } + } + } + + //---------------------------------------------------------------------- + public static function dumpMask($frame) + { + $width = count($frame); + for($y=0;$y<$width;$y++) { + for($x=0;$x<$width;$x++) { + echo ord($frame[$y][$x]).','; + } + } + } + + //---------------------------------------------------------------------- + public static function markTime($markerId) + { + list($usec, $sec) = explode(" ", microtime()); + $time = ((float)$usec + (float)$sec); + + if (!isset($GLOBALS['qr_time_bench'])) + $GLOBALS['qr_time_bench'] = array(); + + $GLOBALS['qr_time_bench'][$markerId] = $time; + } + + //---------------------------------------------------------------------- + public static function timeBenchmark() + { + self::markTime('finish'); + + $lastTime = 0; + $startTime = 0; + $p = 0; + + echo ' + + '; + + foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { + if ($p > 0) { + echo ''; + } else { + $startTime = $thisTime; + } + + $p++; + $lastTime = $thisTime; + } + + echo ' + + +
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; + } + + } + + //########################################################################## + + QRtools::markTime('start'); + \ No newline at end of file diff --git a/lib/phpqrcode/tools/merge.bat b/lib/phpqrcode/tools/merge.bat new file mode 100644 index 00000000..b60a4853 --- /dev/null +++ b/lib/phpqrcode/tools/merge.bat @@ -0,0 +1,2 @@ +php ./merge.php +pause \ No newline at end of file diff --git a/lib/phpqrcode/tools/merge.php b/lib/phpqrcode/tools/merge.php new file mode 100644 index 00000000..19d338b3 --- /dev/null +++ b/lib/phpqrcode/tools/merge.php @@ -0,0 +1,70 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR; + $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; + + $outputFile = $QR_BASEDIR.'phpqrcode.php'; + + // Required libs + + $fileList = array( + $QR_BASEDIR.'qrconst.php', + $QR_TOOLSDIR.'merged_config.php', + $QR_BASEDIR.'qrtools.php', + $QR_BASEDIR.'qrspec.php', + $QR_BASEDIR.'qrimage.php', + $QR_BASEDIR.'qrinput.php', + $QR_BASEDIR.'qrbitstream.php', + $QR_BASEDIR.'qrsplit.php', + $QR_BASEDIR.'qrrscode.php', + $QR_BASEDIR.'qrmask.php', + $QR_BASEDIR.'qrencode.php' + ); + + $headerFile = $QR_TOOLSDIR.'merged_header.php'; + $versionFile = $QR_BASEDIR.'VERSION'; + + $outputCode = ''; + + foreach($fileList as $fileName) { + $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n"; + $anotherCode = file_get_contents($fileName); + $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode); + $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode); + $outputCode .= "\n\n".$anotherCode."\n\n"; + } + + $versionDataEx = explode("\n", file_get_contents($versionFile)); + + $outputContents = file_get_contents($headerFile); + $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n"; + $outputContents .= $outputCode; + + file_put_contents($outputFile, $outputContents); + + \ No newline at end of file diff --git a/lib/phpqrcode/tools/merge.sh b/lib/phpqrcode/tools/merge.sh new file mode 100644 index 00000000..e4c2fbcb --- /dev/null +++ b/lib/phpqrcode/tools/merge.sh @@ -0,0 +1,2 @@ +#!/bin/sh +php ./merge.php \ No newline at end of file diff --git a/lib/phpqrcode/tools/merged_config.php b/lib/phpqrcode/tools/merged_config.php new file mode 100644 index 00000000..55ddb450 --- /dev/null +++ b/lib/phpqrcode/tools/merged_config.php @@ -0,0 +1,17 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + \ No newline at end of file diff --git a/schema/ttrss_schema_mysql.sql b/schema/ttrss_schema_mysql.sql index 9a160f2a..8ac8611c 100644 --- a/schema/ttrss_schema_mysql.sql +++ b/schema/ttrss_schema_mysql.sql @@ -50,6 +50,7 @@ create table ttrss_users (id integer primary key not null auto_increment, salt varchar(250) not null default '', created datetime default null, twitter_oauth longtext default null, + otp_enabled boolean not null default false, index (theme_id)) ENGINE=InnoDB DEFAULT CHARSET=UTF8; insert into ttrss_users (login,pwd_hash,access_level) values ('admin', @@ -268,7 +269,7 @@ create table ttrss_filters2(id integer primary key auto_increment, enabled boolean not null default true, index(owner_uid), foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=UTF8; - + create table ttrss_filters2_rules(id integer primary key auto_increment, filter_id integer not null references ttrss_filters2(id) on delete cascade, reg_exp varchar(250) not null, @@ -305,7 +306,7 @@ create table ttrss_tags (id integer primary key auto_increment, create table ttrss_version (schema_version int not null) ENGINE=InnoDB DEFAULT CHARSET=UTF8; -insert into ttrss_version values (96); +insert into ttrss_version values (97); create table ttrss_enclosures (id integer primary key auto_increment, content_url text not null, diff --git a/schema/ttrss_schema_pgsql.sql b/schema/ttrss_schema_pgsql.sql index 600714e6..377261df 100644 --- a/schema/ttrss_schema_pgsql.sql +++ b/schema/ttrss_schema_pgsql.sql @@ -46,6 +46,7 @@ create table ttrss_users (id serial not null primary key, last_digest_sent timestamp default null, salt varchar(250) not null default '', twitter_oauth text default null, + otp_enabled boolean not null default false, created timestamp default null); insert into ttrss_users (login,pwd_hash,access_level) values ('admin', @@ -229,7 +230,7 @@ create table ttrss_filters2(id serial not null primary key, owner_uid integer not null references ttrss_users(id) on delete cascade, match_any_rule boolean not null default false, enabled boolean not null default true); - + create table ttrss_filters2_rules(id serial not null primary key, filter_id integer not null references ttrss_filters2(id) on delete cascade, reg_exp varchar(250) not null, @@ -253,7 +254,7 @@ create index ttrss_tags_post_int_id_idx on ttrss_tags(post_int_id); create table ttrss_version (schema_version int not null); -insert into ttrss_version values (96); +insert into ttrss_version values (97); create table ttrss_enclosures (id serial not null primary key, content_url text not null, diff --git a/schema/versions/mysql/97.sql b/schema/versions/mysql/97.sql new file mode 100644 index 00000000..c555b86d --- /dev/null +++ b/schema/versions/mysql/97.sql @@ -0,0 +1,10 @@ +begin; + +alter table ttrss_users add column otp_enabled boolean; +update ttrss_users set otp_enabled = false; +alter table ttrss_users change otp_enabled otp_enabled boolean not null; +alter table ttrss_users alter column otp_enabled set default false; + +update ttrss_version set schema_version = 97; + +commit; diff --git a/schema/versions/pgsql/97.sql b/schema/versions/pgsql/97.sql new file mode 100644 index 00000000..f458ee91 --- /dev/null +++ b/schema/versions/pgsql/97.sql @@ -0,0 +1,10 @@ +begin; + +alter table ttrss_users add column otp_enabled boolean; +update ttrss_users set otp_enabled = false; +alter table ttrss_users alter column otp_enabled set not null; +alter table ttrss_users alter column otp_enabled set default false; + +update ttrss_version set schema_version = 97; + +commit; -- 2.39.2