diff --git a/day3/day3.jl b/day3/day3.jl new file mode 100644 index 0000000..9a3ee83 --- /dev/null +++ b/day3/day3.jl @@ -0,0 +1,70 @@ +#!/usr/bin/env julia + +using Test + +function priority(char) + v = Int(char) + if v <= Int('Z') + return v - Int('A') + 27 + else + return v - Int('a') + 1 + end +end + +function rucksack_errors(infile) + psum = 0 + + open(infile, "r") do io + for line in eachline(io) + n = length(line) + a = Set{Int32}() + b = Set{Int32}() + for c in line[1:Int(n/2)] + push!(a, priority(c)) + end + for c in line[Int(n/2)+1:n] + push!(b, priority(c)) + end + psum += pop!(intersect(a, b)) + end + end + + return psum +end + +function rucksack_badges(infile) + psum = 0 + + open(infile, "r") do io + for lines in Iterators.partition(eachline(io), 3) + all = intersect!(Set(lines[1]), Set(lines[2]), Set(lines[3])) + psum += priority(pop!(all)) + end + end + + return psum +end + + +function test() + @testset "elf rucksack errors" verbose=true begin + @test rucksack_errors("example.txt") == 157 + @test rucksack_errors("input.txt") == 8394 + end + @testset "elf rucksack badges" verbose=true begin + @test rucksack_badges("example.txt") == 70 + @test rucksack_badges("input.txt") == 2413 + end +end + +function main() + if size(ARGS, 1) == 0 + test() + else + infile = ARGS[1] + println("infile = ", infile) + println("error priority sum: ", rucksack_errors(infile)) + end +end + +main() diff --git a/day3/example.txt b/day3/example.txt new file mode 100644 index 0000000..f17e726 --- /dev/null +++ b/day3/example.txt @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw diff --git a/day3/input.txt b/day3/input.txt new file mode 100644 index 0000000..0467fc3 --- /dev/null +++ b/day3/input.txt @@ -0,0 +1,300 @@ +gtZDjBcmpcDgpZcmmbgtdtqmCGVCGGsvhCFCCqvmCMMM +JrhfzfLTNfJhPnhQnfzHfCFFQFSGvMFCGQFsQSMSVs +TllTRrfNNlfzwhtZBZgtRDBp +vMdwjZdjwjvjdTZZvCcQMGnQMQcbcgLLCL +rsVhfmssPWzDVGCLJSbCgPLSQG +lfWNDHDgfszFRTFtwwNjdv +GLPqVqdVGCLCdczjMjzMfzld +JnWQvJDmvWBtlMzhrzfHQgcz +tDtJDDDDtWRRmBwJwWtpPRsGCGScLPGSqspNCS +ChVzZzfNDzNJmBQfjjJfmH +MrTMPMncGMJvPPvPWTbrMWvgmBgQwgdpwmdpdpjwpHQcdw +SPvvvbqrFvMvZzJzsFVzVJNV +mvBbvMFqbMMVVmtCBHpDdDPTDspdNWPDVP +zjSfftcQtwtSfQSpNDppsNsjPNdRPP +fgfStJShrgvvCLLv +GmFnNNwbFFbhQQGQnGwwwfBgnMMqVDBZVVBMfMVzVz +vWzRRHzTHcgfZDVfBgfH +SSTvrvRcPpcvjFGwNGbNpbwQwz +FFgbZZFZgFmpstLgmbtzqNrwVPlMPlSWWrMPNp +QQhTvjhcvjjvTcTcTfCcSRwwWzwzPMrzWNNWVVhwrwWq +GRQBfCRnGGTcDvBfGvffCCjnFZtFFgStJLbLHbFLJZdgmd +pppdjcrMMRDJLJdRcwRDrwssqHGGDHsZHHsvBVtvmVHV +nlCFWzGzzQFlSlhGWnPzFbSsBZmsssmVVmsBvnHqvNVqqm +lFTTTCSQSTrdGJJLJG +jpsGMgsmghQwQsMmhlQshjtTNTRTnFqRWnnqRfFnnt +SLBCHrcvZHbSvSZrSvSWnfvVNvftVlFRTqnRTq +JrzdZbBcHBCrrlHrrSsMgmGpJPDPQmpgQgPG +cmcZHgwgMgHSLmtjLfWPNNrWBNfffp +JTqGTsClHslVVRVCVGVJGnBrjdnnrdBNvjPNBNBrWvnW +VVlQlqTFJlzzlsVGsRCZMthHDbwbFhgcbwHchg +qgZjgjjbssqgsjlNqjhTtdrfQdTdWLLnDVfHtHWd +zcGMBDDzcLnztfQQQz +JSppJcBScMmMFFBRCpRCMmGlggvjhbhlNlglwbslCZjhDZ +hvhmqcqwwcTBvvwQnRQnRnTRFzFzQz +jWLPPtPsgMtpdLMLWllpgLLQFQhFJjnVrzFrVFhnRzJJrJ +WPWffgtSdspdhSMdlSdtfBbHmSvqbNBCCmcBmcvcCH +frVcrVcggfSZJfbbJvBd +hwWQnwhWQmQmThTSsdvvSMBTBzcb +wGnFFCGlQwntGtCtwntwDmFwRgLrHqNRqqcNNgRrHHLggCjp +wRSwwHDMsRGHvNBNjTgvjgJD +mcLcFCclWQWQpPQWVQcQcvvNJjrNBTrvgJgBvTRvCg +VFPbQLchQLSRfbMtdHGH +lfVrhnlRRqrJZVDJdHSWCvJCJSbj +BFsgcgMNNQgSvbfCff +ffNPcMtzqPlnmRGh +ZJplFmRJmWRJRWmTJCvtTtnLCtndCqtqnr +SQsVPQHBQZNSNSLCfSLrcLcrrr +VMjPjbNMDsVHmRllmZpZWmjh +LcTLRbJhhdhLJbbclfVvfWQVWFRWFFfq +rZNttSNvtgsPPFsqBFPWQF +HGCSmHrrwNnHGMLpDhbzzpmJJv +VlSWzRtWSJqWdfhdqBdF +mTDHsmmmcHpgrCgCrTsMMtqfsFNsZqfdMZMNbd +TDcpvrpHCprCpHrmcQvTHgTQzSnLJnPPJlLzwJtRVJwLjJ +vZSWZJZJFvhZldZHdvvlphZSNGNnmzwCPNHNHGNrrRHGCPmP +bjfgcbjTQTFQBnGRRBCBNwBnCz +csqscsbssQLsgQcLgLQLQTQpFdlhdvdZdpZWhJplShWWtq +QgQvHnfflfBwQCfwlfglnQQccNcRqGGcjmcsGjddwdzsJc +DhZbTLZTDMVTsRzsqsRjszTz +FSZVtMLMMWbSgqSvPQlnpH +MMPllnnBmfSHvBgCLf +whZjGRJdjcNjjhRjCvgCfbSvCZLHfpZs +RRWGWwNRWwhwclmrgFmngFPMWm +VVHQGDGDGsdRrmZBQZRCVHZCNcSTTPMwwvTTwSSNqBqvgMvN +nfhdLfjFnJpblLbJjWhtnjWPScNnwSTPTPqTvgngNNvSvS +fpWljtpLjflfLfzlhZGQHZQVddHrrQRDRz +VCHCjwCwMSZSqQzhhQqcWZJD +GGGrFFgNRNNgmfnTdgmWQpczvPvQPWQJGDpzzc +lgTttRTgmfNRntrTTngrCbjCwJCHjLBBHlMVMsbB +szgPPlCblggVszhLmzvcvNrqpjNqmrqqpGvG +wBQDtBfQDtFvLjjctLqTMr +ZFWWdDLQFwSfDSBSQQBWnnnQVdbhgRVbsHzsshbClzzCVggb +VpVsHVcqcMVMMNHpsspstbMqzBztJZTBBfJfzTvZfvWJWSTv +mDDQgCQQQHdrwgSvZSmJJZvWfJJf +drCjggDlPdgrlbjNcnhcHsbpsj +cNNDRRpDcNcTpppsqHLQGLfRLvHzLH +lFntJjtbFFlsmsjvnGqHWLfhfqzzQh +sgPbjBJtPgbPJblblJgbgbwdBTwDCwpwrdZZVcCcDppc +GGclMjLnnjCMchcChLMLcnnzRFJDZJSRSzzzzDSShszPRS +VHgFQgwVwfNNpQVfHzQsPPPJDbmZbJDJbS +HfNVWdHVvgHgVWVNppNWVHwTlvBFcClBCjcTLTlBnnLrTL +GTLdlJhffQwDRvWLrp +HVZVNjjsPqzNjNNmNgDWMrRQpWvWRHrDHBWp +VCqVzjPjCpVqCVPCsbctcnblcGlTbGnlbFJf +flHdfdBNdZcflBMjqMjBNfZQhvJbGvqvsshJQsJCJDWvvD +gFTzRRpzRTwbgbLmtCvsJhWsChrWCrtWCC +VzzzFbVRLPznmRBffPNBHNMdlZfl +FFFMwCqJFFmrRwgnbLrL +GpjGpQHQpfjdjDRnLrbrRQmJzzgg +BphfhDcNcHNvPBvSqJMWJS +NndbWpDBNbjvWLZqWsWQ +JPFFTSPfgcMgftQQGjvTmsGqzssG +gPgcfcVFgcHqSqVhbBCHlpbbpDlhDD +FSdfWFTTBnjsDCjsmrrT +pQzLRVLppLGcQjqbmVDJsChCvCbVsm +qHLRGqqZzGjLqBNMFdnHlNlBFN +DjqbfBTchDjqqCjjCTWNTbdzSVzGZQGBwZnQnVwpSSnQ +ssJlPrtvMsRLrrJQGNZJSpZpGzSG +rlFssHsvPRPMvFmtHvtqjhTgjbqhWqNmNqgDNh +vcpnRqwwLLbvvcGpDQWDFSCgMrWWQWRR +gtNfBfllrFlHrlrl +ZPzftBmsNBNBPJBZPmZPNtmPdGLsqbwqpqcndVLLGpVGvqgV +vRBfQqqBQPfbrFvPBvPbhLDVDVDQZVVtZtlWLLLt +jcJmFFwnhJVZLWVl +sHTcmNNHzncmcjmdsBCrBCPCrBBqCFrqzb +bbZRnGmNnBGGMNRTgCmWWGGSrvSvFHvzFvFQDF +LjwphpdPdLpLJVqfJrQzDzfrvQHSvDcQrQ +DJphdwDsnmbZsTZM +rdNrZNBSzSztnNzWCcNpHlMwlwHWlM +QqLGLJvLjtvQWhgHgchHwHJw +GtjTGtDRqvfLRGnrzsmZmfrVFBrV +TdMhZrTTNvwphcLL +WnnmffmDWnWPsPCJNpNcpNVNQp +fsjbWfFFfnmmDsFDnnflSSdczlMdTHTzTTRRBdtT +cMcPcMcwgWJMjWWhFWCCQCmqCFdh +bSLVLblnNnLbVfnsbSbCChSQdChptpdqZrmCmZ +DLGNfnGVDNDHbfzjRcRgqHMRBJPc +HVFVlVHjzjjlCJjHjCjnvDrggrgLdqzddMqrzz +SSfBTmtNdLqngvrm +TwnNfPWWpBSBNtTHZCGlPHCQJHZHPV +prvccpFQpMcQBwsvssshdwSTPD +qbGHVbNJGqwdPgDrTsDJ +fGbGqqlGGHflqLlzZBBrRcrtrZlp +fCSPhltMBmPmbdgd +DjvJJscvTsHHDbWzBWsWbdwgLB +VVHDZvTppRcJVFFppvvRJDJqMSGqCtZdthttrnthSZMGCr +ZcSrSdrhDjBDDCmZdZmZjhwVHwqVVsMwgswVVwMfhw +PNvzTPNbnzcPbGQNJTvqwsWgVgVMMWpQqwgHpp +JTPGPTzNttnbRTPlPtNNRlFrFmBcmDljjmBFSCmLZZBr +mNvRRCVMtNRdFNtMtBHHprpHgJgJWwpBnprg +LZDDlSLlTslDfbcpJJWndwcscnwr +qdZZGSDhMVRCGtmC +VGFjjgBShGdGzQczcGRG +MppqCDfCMwfLDfvNmrtWstRcMPzRMRsRsPQS +NwDCffLppbqqrqvTBngSbnBHglZllH +vdllJVDzmVDVqvvWvdqJlcWrCsfCsfSSsSJfCSfQQCCbCQ +jnTHZPZHMjZhMjTpHgMpgnbNqBstnfrtSSrBSNssCrfN +LHLTFLjTMTTTwjHhpHTcwmDcWVDlvRDmvqwWlW +rqQsSStdmsdLqlNNPGlGlV +FpFpzJNTcHzRHRHlGwFVLFBLFGVvlw +WCCjWRNJTJWhQhbhrbnd +jsQjfrRTRwzSsRTgNchlnlhqcnlQmQ +dFDtdFBDddHLJpVpHHtVbtHFCWlWlGlNlmGggNqgglmcchqb +dLDHMVdLtBBDBFVJBFthtJHRTvsMSvsTrTSRvPPjPzSwRP +CSPpSrLlrlPrPchLnSlbDbbRttDVhbGRDDJRtD +fzfvmzTMmfsFszsHZsHMHVfwtbjBDDGjtRBjQQGGJb +HmvmTFmqmTsHqzzzzdTsMMScndccdLppnLCSPcCLrVgr +pfMflRnfrnjrpjnFzDpfDMmMLRTLZVTgLsvdZgLLZHSVWZRd +tBGNhwPGcNBBWwZddsSTTPgVLPdT +JwthtwbbhNBQhwhbBCrzpnprnWnprlzWlClD +PPnZZjnFNDjlJJhtMddfTTdD +QGLHFWvQJtzfpvCt +swqSmmQWLQwFWLwwRcqNNBnnbgPqbPNbglVZ +GCLSjjZGZhpvGtBgjJlnJDhhJMVDPnJlJP +mNtQQwNzQRHWdJHnPTsddlln +zQrfmbtNbcQcrzmrRBZqBcvpjSGLZGLZBB +zGNzgsjDssvNbPlWJfJq +RLMVSRMLhCLZSMZHDSJWvpcqfbfhvpJqcWPv +dMVHLFHLZMLRLLFRHHHVZMgDTntgstGwznzGGnzjDFwG +wCLCHLBwzBtQRLHLbNFFfdqdDqVrVfBN +JGvljmgGZvMlfDRRnnnZnfND +GppRlgJlSllSgjMsmllpTjcCLczWztPWPwwwzWThtcQh +WvHbvvWnFHszDRSltcCctCFD +gCmJmCCPTPqpgrZtjdRtDRplcSjS +rJJrQPPJQmrmrhGTznCfLMMbfvWfbCWQ +TqBWtTbFBNNRRtwQpJJvvvZPpTSQ +fRMfsMssrGhSmMwSQvvZJm +VggcVlsCgHnVFnndbbnR +NdrSSWBNPPSWWHPPlwlLZHLZLMhjlLLH +pVptMTgVTzLwZTzlbF +qsRmRJtsMvMqgqgRvCdcSrWSPcWrDmmdBN +nbJnfqWcmCMnSBSHwzWBsHHz +dVpdvdppdptppDlvlHcczSgNcgww +VGTdTVtGtRLFPTDbcfCmmcCQJQjcrT +VTjrjrjTlTjQMdpGrWMSHvSG +wnNJbDmttnwnhNwcJmNGdvWvMSfvMfhSSppSdp +JznFnNsGnzzGFDJsFNmLgVVQZBlLZjQTLTjTls +hpngHwcpWHgjjfhzTJBfBB +RFFbFlQlSdRsbRQQMGPRGdSGjBvvNTvzZMBvjzBBTJTvMBBT +GPSSPDDDFzGlGGRzLzGGPRWqnprcgCHwCHpwHWVcncLV +LLlLGffQLPRThRwP +MpZjbmznWqmqZznmzmpZqZnMRgPBCTPfgRTTwTjhwBPPghjP +VnZpMsMMJnWsmnJpJmzrtFlGQFrHGvSvfHStNV +MQqHMQPnqmpDdTLLRnDjsj +NGFzwgtLBtFFGrrCtzgfgCNgSsdTDSSTsdssjDdSlZRjTSBs +zCwNLthfrbCgzzhqhmccJPhQHVmV +SndBVcgdqcRBRcdPBBcVcQTSSMLMlTssMNMWsHMsLQ +GmJvZvhqpvZtNwwWLTTLwMMm +JFJpzFGZqjvhGZcjBPcCBBPnnVBc +rJWbqTvwvJNbPDPPvLcZvPDp +QMnfBsjmFPLcHRDfPp +lQlMlmtFsMMBstljlnGhtMhmGNqJqTcWNNbWdGwdNNJCrTrq +LcjcNCQNQWDpRDjRTj +vWvszVVSsBGWsTJRFHRJTTSTRJ +vvGbtqbGVVBqtzbqvBdzVLWNLClwnwMLWlQNMfdPQP +TWBZsWrjzZzWBrBsrrsTLNNJvFnJVmlSFFQnGpmnSJJS +qdCggdqqqhhqwhRbCwbCPqhlJFPPGJQVvvvnpVVmPnnFvS +ffgCfghDqDdCsGWZjTsLrsfW +QzQSSQmzSsLQcLmrcsLzccgqCnwqCtZDnDnrZwgnqTTT +hFRHHRPRPMtWPGVPRlMljRPCgWBBDTgJBgnwqTZDBZDWDB +jPjPHRMjjvdjVFhdNfbsbbQfbcddmNtL +jJlTqMqJtdztJqzcSJSlTdSlprLsRRHwcRRrsrHbrnnRHsHL +VVVMWNNWmNmLnPLRHrLp +NGhfvvVWBNfNNCNCQTMqjzgTQBSSSqll +SSSRMRSRpnMRHLqWLfPlDGlGWldD +hbNtlmvrNrsVDWsGPfPfqG +jvbBNmvlJjRcCzHFppCJ +hhWWPjnBGBGnjqBWSnhhsNLllLNcLczJcqcTlLTlfl +FHvFFMHwdmvrDbwCbbvHwdHnZTMLzTNTczflJTZclzNLlLcJ +HdFFvdDvpCDdrnwrGhBQhWRRpsjQWWQW +sBsvtJtdRdjNbWWrTllqlNgg +nSZSnPPZzMSnSlScWWWgrVWCrqgrWMWr +lzSncQcLZLzlwDvtdDdFdFJJhHvJ +lpsTLDlTtFtlWHPDvvgPfgMrQQJM +zmNbzcNjzldjwmbdbhhjcjRgfwrgvMwMMSRJSvQQvrRf +ZhjqcjzNhmzNqBqNznmcWHplCFGnpCtFsGWHHWsH +ZPGQBFHFbhSrHqtfSrSr +nMdznzzMDTnjMQrMWtrMptplqpqS +wzjczJmccTJCmcVghZBJbPBQBbVh +wLLMJbqSBBnnJhbvbFSSRRlztTrHzrrrrd +QNNGVPjWPGVqltTHWCqCdH +sjNGmmGVGgQNGDVmsVpgqQVpMDhvbLwMffZfhZbLnfLLLZwb +gQLcQrMtBPdwSBsSlmBm +TfCpTJnTbfqgsgwgppsSzp +jVbvTnvWfJnJjjbfCjWWjrFPrLMtcDPgLMQQRtgZVF +gwpHvpgwngGHcnvNvgnmsqCzmMzlfqmmqzHHCm +JrdSLdBVPRDtRtPfPPzCJhjqmljzmmqszzsM +SWLDDtVdrZWtSBRZfRcwgFGnpNFpnTnWnTvT +rpcnHrwrhWccNZDDBBgBVCSW +nmzFRRjFmmJQNDJC +qznMlqGnzRtRGvqGFRPrdMhwTpTLfLcppLHp +wthvbmhmChWMRJLJzngZpzLLNC +SsdBVjSTjBdffBFfcSdVHfTrnDZGpQgNZHNnLZGpJngJGLng +sSdTcdVScdcrccjcrBPrBSjcvmRRwlWPhwmqtgWhMPtmMMqR +CJJBdBCrHdBhtRHctBQhRMrBwZpwZWNZNSNTwSNpQWpZsSSW +LVFnvnbDjLsDPsPqFFvPvDnTzSTwNwPZpSmpSpgmgZWNTW +LjlflbFjsvVlrHcrHtrfcChH +tVLJGNRtfBBNGBrfrbzmfhPsrsPC +DWWDQHQgllSFqFzcsJmzzSSzmrrs +MJFQDgMqnHlDvFdGNBNNZGNVVvjV +wnNwGCBBFNWBqjFBnLLGVDHhHmDPHvZTjTvTrPvD +bMbttVScMJQtdgSgstbJRSPmrTHmHmrmmSDZlrPrPDhv +cMbgpsbVbzbdRMRFWLqzBfLGwwwwfW +JpSnGSGpbGgsWWPHJrdfsT +MNsRqNNvMQDTLWHlffNHLN +qqmtRzRvCRRQDqjqjDmsmRpZwSZbcwbnCcCSBBnSSnnC +TWqlqpRqRptqlRhrmtGGzhbSrSdz +VgsBVMvgVZfZvPsMVNvfZfvVbSPdhFPFhbzLhJdGFJmLhhhL +QZgvZgvHwbwHbMsMRllRjDRDnQRqlRjl +fsPQwnHnHLLfnBBnwwGtjTGRWTWTWwhV +jblbdjZFDMbGllqTGTtVlq +gmdMgZMbjpZDcrrDgdmszsPLpQfpBPPnNQNLLz +HRsPPGMhLPMrnPchPSwStjbSttSvtHSqQw +dfsCfpCJVJCvdFBFwStwjj +gTNWmWfTNVZVJzZWpWJgTpfhnDrMnDclgDlDrDRnRcMLDs +ZQZQJMqdwmZvqfPmwRjpBBjHjnshnjtt +zcTPTLDTFWLGTrTSWPcDSSHjRlhRsDhHslslssBRljjj +TrNFLbTWrGNZvmvVQPQV +htfLgmtSLcTWNLcT +slbHlBBGbqRsblBHvdNJJcjFFNBTVWWWcn +bbQsHMMblHrMsGRqvQhwCTQCwtQCzSpfmS +zmqdphmFmSpTzhdqhFmwjjGbtcvDbcGGjllGQjSP +HJFrMCsVLrHRRMCNrVMVnctvstlGcQlPtGGjQtGlvP +RFLHLVWrNgVJzwzwfgffwdfp +vdMjSmMMpmMWhRpndRmZnhvHqLpGHcJGGGDLHHLGcfcLfc +lPBwwrsCgLFggcqqLW +TWszsWNBTNdmSRvjbZZT +zFlBGpzzzLLNjBwPcwwmcNPfWNQn +VHSHRJTJDSVVnmcVVPpWmpnf +DMZHHrDHHrJrrZrShZsHGbMBbFgGjGCgjpFlBzzb +FVMpsvTqvqMssVsWZSrqWFvwlGDGwQzwfwQQNLzDlwlZwf +hPbgBHhJJcJPwCwDpNllCCHC +pnjbBmjgbgmqtSmsTtsF +DHZHmfTmCfjDZHMZmzffHHnQwwTBdQwbSdBGBQwhBQTQww +cqstRFWNtLrNFwdVShlBSlhBRl +StJWpLptNWLtJcpqPrFHDjZzzvnDDHPCZjPvvz +hzffhGVGGhzRqTBLTqHL +sFFFsMQlwJMsmrBFSNHTHNqrTS +pbdsJMdJMJbwbmJJtbTtgnffGgVVChvD +FvJnFnCpQTddSSmFdFpPPsVhppDjBzjDVhDV +RgZMZbsgzlDPlhjb +cHHHRgRZgfHHZGZfHZcLLHrrCrmJCmddrsvdJsmvFFQG +dpJDdZwLnvdvFmFMmHjslMLH +CGCztgPhWCWhzzzNNPGfrrWfmbbsmmHjFHDMsbHMsjFPjbHm +rNQDGzzhCCfNrzrDzChTcZZvQcTRJpTwdvQpVc +VpvNGhGHGNhHbPsbVbvfFtLCzSCFSBsCFSFCLB +MlqJwTnrRRrRnMlQMHfHzHzWFWtmTzLWFC +ljZDDHqqjqRbpNhjNNgcgc +qrQtDzcQzbrcfdbqrQrthtscSsvpvnsSHpTpLpspmsSs +CVwNNVRNBSHsLSFBTv +CVVVNZjlVlGwlGlljNlWJVrrfqbPQQqHqJhhftbfDJqf +lpmrPDPDjPlmWrVzPztZwFjtFbBnRtZbbcRL +dnqJCCgQdNqbqRbRbBLt +QGhGddGCTdMHNTGgshgJhzvSmWWPSsnprpPzWzsWlr +hCJHTdJJNvTdSSNssjvfwgntwDgtgwDGCtZwtRRB +mbllFmFMFbMVWWLpbpZwwBZTZnnVwnTggtDB +MmzLQpFPTmPzHvfJNNzhNs +dzgBwzlgrrBrVLLlwLBgBlgRScDMMDDswMsHZRGDsZGZmM +HPfPbjCFJjCvfnnsjsDDcccmZsRSMc +hCvHfWPPnvJhPWpqNNhqLqzLqLLd