[Initial Checkin clinton@unknownlamer.org**20060906030325] { adddir ./code addfile ./code/brew-db.lisp addfile ./code/brew-import.lisp addfile ./code/brew-recipe.fasl addfile ./code/brew-recipe.lisp addfile ./code/qbrew.lisp addfile ./schema.sql addfile ./test.lisp hunk ./code/brew-db.lisp 1 - +(asdf:oos 'asdf:load-op :clsql) +(asdf:operate 'asdf:load-op :clsql-postgresql) + +(defpackage brew-db + (:use common-lisp) + (:use clsql) + (:export style + master-recipe + recipe-revision + hop + grain + yeast + connect-to-brew-db)) + +(in-package brew-db) + +#.(locally-enable-sql-reader-syntax) + +(defun connect-to-brew-db () + "Connects to the homebrew db and returns the connection" + (connect '("" "homebrew" "clinton" "") + :database-type :postgresql + :if-exists :old)) + +;;; Categorization +(def-view-class style () + ((id :type integer :db-kind :key :initarg :id) + (name :type varchar :initarg :name) + (og-low :type float :initarg :og-low) + (og-high :type float :initarg :og-high) + (fg-low :type float :initarg :fg-low) + (fg-high :type float :initarg :fg-high) + (ibu-low :type integer :initarg :ibu-low) + (ibu-high :type integer :initarg :ibu-high) + (srm-low :type integer :initarg :srm-low) + (srm-high :type integer :initarg :srm-high))) + +;;; Ingredients +(def-view-class hop () + ((id :type integer :db-kind :key :initarg :id) + (name :type varchar :initarg :name) + (alpha :type float :initarg :alpha) + (form :type (varchar 32) :initarg :form))) + +(def-view-class grain () + ((id :initarg :id :type integer :db-kind :key) + (name :initarg :name :type varchar) + (color :initarg :color :type float) + (extract :initarg :extract :type float) + (use :initarg :use :type (varchar 64)))) + +(def-view-class yeast () + ((id :type integer :db-kind :key :initarg :id) + (name :type varchar :initarg :name) + (attenuation-min :type real :initarg :attenuation-min) + (attenuation-max :type real :initarg :attenuation-max) + (temp-min :type real :initarg :temp-min) + (temp-max :type real :initarg :temp-max))) + +;;; Recipes +(def-view-class master-recipe () + ((name :type (varchar 64) :db-kind :key :initarg :name) + (description :type varchar :initarg :description) + (style :db-kind :join + :db-info (:join-class style + :home-key style-id + :foreign-key id + :set nil)))) + +(def-view-class recipe-revision () + ((id :type integer :db-kind :key :initarg :id) + (recipe :db-kind :join + :db-info (:join-class master-recipe + :home-key recipe-name + :foreign-key name)) + (revision :type integer :initarg :revision) + (batch-size :type real :initarg :batch-size) + (boil-size :type real :initarg :boil-size) + (og :type real :initarg :og) + (fg :type real :initarg :fg))) + +;;; Add steps and ingredients +(def-view-class recipe-step () + ((recipe :db-kind :join + :db-info (:join-class recipe-revision + :home-key recipe-id + :foreign-key id)) + (step :type integer :initarg :step) + (direction :type varchar :initarg :direction))) + +(def-view-class recipe-hop () + ((recipe :db-kind :join + :db-info (:join-class recipe-revision + :home-key recipe-id + :foreign-key id)) + (hop :db-kind :join + :db-info (:join-class hop + :home-key hop-id + :foreign-key id)) + (quantity :type real :initarg :quantity) + (alpha :type real :initarg :alpha) + (time :type time :initarg :time))) hunk ./code/brew-import.lisp 1 - +(defpackage brew-import + (:use common-lisp brew-db) + (:export brew-import)) + +(in-package brew-import) + +(defgeneric brew-import (obj)) + +(defmethod brew-import ((obj brew-db:yeast)) + (clsql:update-records-from-instance obj)) + +(defmethod brew-import ((obj brew-db:grain)) + (clsql:update-records-from-instance obj)) + +(defmethod brew-import ((obj brew-db:hop)) + (clsql:update-records-from-instance obj)) + +(defmethod brew-import ((obj brew-db:style)) + (clsql:update-records-from-instance obj)) + +(defmethod brew-import ((obj list)) + (mapc #'clsql:update-records-from-instance obj)) binary ./code/brew-recipe.fasl oldhex * newhex *23204641534c0a2020636f6d70696c65642066726f6d20222f686f6d652f636c696e746f6e2f50 *726f6a656374732f696e5f70726f67726573732f686f6d65627265772d64622f636f64652f6272 *65772d7265636970652e6c697370220a202061742054687572736461792c204d61792031312c20 *323030362031313a34303a353020504d204544540a20206f6e206472697a7a6c6568656c6c0a20 *207573696e67205342434c2076657273696f6e20302e392e31310aff0300000058383640000000 *32000000283a47454e434743203a53422d5041434b4147452d4c4f434b53203a53422d54485245 *4144203a53422d554e49434f4445293f3e0000000024584251a204410000005300000044000000 *460000000e52010b00074c0000004f00000041000000440000002d0000004f000000500000004e *05430000004c00000053000000510000004c0000000b00034f0000004f000000530000003c2400 *2458241e04240324274e085300000054000000410000004e000000440000004100000052000000 *440000004e074d000000490000004e000000490000004d000000410000004c0000002400042800 *0103064e08540000004f000000500000004c0000004500000056000000450000004c00000051a2 *0453000000420000002d000000430000000e52010b080e540000004f000000500000002d000000 *4c0000004500000056000000450000004c0000002d000000460000004f000000520000004d0000 *0003034c0551000000550000004f000000540000004500000003011201030b03021301030c1201 *030d510b0812430000004f0000004d00000050000000490000004c00000045000000440000002d *00000044000000450000004200000055000000470000002d00000046000000550000004e000000 *52510552280001030f2400240024002d010310514c105300000054000000520000005500000043 *000000540000005500000052000000450000002d0000004f000000420000004a00000045000000 *430000005400000052031028010103122401240124002d01031351a20653000000420000002d00 *00005300000059000000530000000e010b14105300000054000000520000005500000043000000 *54000000550000005200000045000000210000004f000000420000004a00000045000000430000 *0054000000520310031328020103162402240124002d010317510b080944000000450000004200 *000055000000470000002d00000046000000550000004e00000052031003130317280301031924 *03240124002d01031a280401031b2404240d24002d01031c310d01031d280101031e04260e746f *70206c6576656c20666f726d01031f510b0813430000004f0000004d0000005000000049000000 *4c00000045000000440000002d00000044000000450000004200000055000000470000002d0000 *00490000004e000000460000004f00000052031003130317510b080a4400000045000000420000 *0055000000470000002d000000490000004e000000460000004f00000052031003130317280301 *03222403240324002d01032328040103242404240424002d01032531050103260103273b055800 *2a0a000000000000000000000000000000000000000000008f45f88d65e08bdc83ec0c8b151100 *00008b3d150000008b0519000000b908000000896bfc8bebff500573028be3ba0b0000058d65f8 *f88b6dfcc20400909090514e084100000042000000530000004f0000004c000000550000005400 *000045000000529531000000514e084100000042000000530000004f0000004c00000055000000 *540000004500000052952b000000514e084100000042000000530000004f0000004c0000005500 *000054000000450000005295250000003d013f032b030d044c0846000000550000004e00000043 *00000054000000490000004f0000004e0000008e0000000001032d38003f3e2e00000024584203 *014e10430000004c00000053000000510000004c0000002d000000500000004f00000053000000 *5400000047000000520000004500000053000000510000004c0000000b00074f00000050000000 *45000000520000004100000054000000450000003c24002458241e042403242703040305240104 *280001033003070309032f030b032e1301033112010332031c310d010333280101033404031f03 *2531050103350103363b0558002a0a000000000000000000000000000000000000000000008f45 *f88d65e08bdc83ec0c8b15110000008b3d150000008b0519000000b908000000896bfc8bebff50 *0573028be3ba0b0000058d65f8f88b6dfcc20400909090514e084100000042000000530000004f *0000004c000000550000005400000045000000529531000000514e084100000042000000530000 *004f0000004c00000055000000540000004500000052952b000000514e08410000004200000053 *0000004f0000004c0000005500000054000000450000005295250000003d013f033a033204032c *8e0000000001033b38003f3e3c00000024304224002430241e0424032427030403052402042800 *01033c0307030951a210430000004f0000004d0000004d0000004f0000004e0000002d0000004c *0000004900000053000000500000002d000000550000005300000045000000520000000e52010b *3d01580000001201033f031c310d010340280101034104031f032531050103420103433b023000 *2a06000000000000000000000000000000000000000000008f45f88d65e0ba0b0000058d65f8f8 *8b6dfcc204009090903d013f0344033f04032c8e0000000001034538003f3e4600000023a80000 *0042a207420000005200000045000000570000002d0000004400000042000000010346a20b4300 *00004f0000004d0000004d0000004f0000004e0000002d0000004c000000490000005300000050 *000000010347a205430000004c00000053000000510000004c00000001034812010349a2055300 *000054000000590000004c0000004500000001034aa20d4d000000410000005300000054000000 *45000000520000002d00000052000000450000004300000049000000500000004500000001034b *a20f5200000045000000430000004900000050000000450000002d000000520000004500000056 *0000004900000053000000490000004f0000004e00000001034ca203480000004f000000500000 *0001034da205470000005200000041000000490000004e00000001034ea2055900000045000000 *41000000530000005400000001034f16010350034611010351240004240326442f686f6d652f63 *6c696e746f6e2f50726f6a656374732f696e5f70726f67726573732f686f6d65627265772d6462 *2f636f64652f627265772d7265636970652e6c697370010352510b081a44000000450000004600 *0000490000004e0000004900000054000000490000004f0000004e0000002d000000530000004f *000000550000005200000043000000450000002d0000004c0000004f0000004300000041000000 *54000000490000004f0000004e0000005203100313031728030103542403240424002d01035531 *0501035651a20753000000420000002d000000490000004d000000500000004c0000000e52010b *570b250000004400000045000000460000005000000041000000430000004b0000004100000047 *000000450000003c240023a8000000241e04240324270304030524030428000103590307030903 *580346030a2606233c2e2e2e3e01035a035a1a01035b035a035a1901035c035a035a1d01035d12 *01035e031c310d01035f280101036004031f032531050103610103623b08a8002a0c0000000000 *00000000000000000000000000000000008f45f88d65c08bdc83ec348b1511000000bf0b000005 *be0b000005c743f00b000005c743ec0b0000058b05150000008943e8c743e40b000005c743e00b *0000058b05190000008943dc8b051d0000008943d8c743d40b000005c743d00b0000058b052100 *00008943cc8b0525000000b934000000896bfc8bebff500573028be3ba0b0000058d65f8f88b6d *fcc2040090514e084100000042000000530000004f0000004c0000005500000054000000450000 *00529583000000514e084100000042000000530000004f0000004c000000550000005400000045 *00000052957a000000514e084100000042000000530000004f0000004c00000055000000540000 *0045000000529563000000514e084100000042000000530000004f0000004c0000005500000054 *0000004500000052955a000000514e084100000042000000530000004f0000004c000000550000 *005400000045000000529543000000514e084100000042000000530000004f0000004c00000055 *00000054000000450000005295250000003d013f0369035e04032c8e0000000001036a38003f3e *6b00000023b8000000420b3d07420000005200000045000000570000002d000000440000004200 *000051a20653000000420000002d000000490000004e000000540000000e52010b6c1e46000000 *490000004e000000440000002d000000550000004e00000044000000450000004c000000450000 *005400000045000000440000002d0000005000000041000000430000004b000000410000004700 *0000450000002d0000004f000000520000002d0000004c0000004f00000053000000450000003c *514c075000000041000000430000004b0000004100000047000000450000005203100313031728 *0301036f2403240d24002d0103704c092a0000005000000041000000430000004b000000410000 *0047000000450000002a0000004c075000000041000000430000004b0000004100000047000000 *45000000240023b8000000241e0424032427030403052404042800010373030703094c04530000 *004500000054000000510000000371036d035a035a1a0103751301037612010377031c310d0103 *78280101037904031f0325310501037a01037b3b07b8002a0c0000000000000000000000000000 *00000000000000008f45f88d65e08bdc83ec0c8b15110000008b0515000000b904000000896bfc *8bebff500573028be38bc224073c0175568b42038b482b81f90b00000575543b05190000007416 *8b483383f90c7e388b402f8b400d3b0519000000752a8b0d1d0000008b411109c0740b6483385a *7405648910eb038951fdba0b0000058d65f8f88b6dfcc204008b0521000000cc0a031f8e0e8b05 *19000000cc0a03318e0e9090514e084100000042000000530000004f0000004c00000055000000 *54000000450000005295ac000000514e084100000042000000530000004f0000004c0000005500 *000054000000450000005295a0000000514e084100000042000000530000004f0000004c000000 *550000005400000045000000529576000000514e084100000042000000530000004f0000004c00 *000055000000540000004500000052956e000000514e084100000042000000530000004f000000 *4c000000550000005400000045000000529558000000514e084100000042000000530000004f00 *00004c00000055000000540000004500000052952b000000514e08410000004200000053000000 *4f0000004c0000005500000054000000450000005295250000003d013f0383037704032c8e0000 *000001038438003f3e8500000024504251a207420000005200000045000000570000002d000000 *44000000420000000e52010b8505430000004c00000053000000510000004c0000004c0b550000 *0053000000450000002d0000005000000041000000430000004b00000041000000470000004500 *00003c24002450241e0424032427030403052405042800010388030703090387030a0386120103 *891201038a1201038b031c310d01038c280101038d04031f0325310501038e01038f3b0450002a *08000000000000000000000000000000000000000000008f45f88d65e08bdc83ec0c8b15110000 *008b0515000000b904000000896bfc8bebff500573028be3ba0b0000058d65f8f88b6dfcc20400 *90514e084100000042000000530000004f0000004c00000055000000540000004500000052952b *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *95250000003d013f0392038b04032c8e0000000001039338003f3e94000000238800000042a200 *010394a208680000006f0000006d00000065000000620000007200000065000000770000000103 *95a207630000006c000000690000006e000000740000006f0000006e0000000103960394140103 *974e0d44000000410000005400000041000000420000004100000053000000450000002d000000 *540000005900000050000000450000004e0a500000004f00000053000000540000004700000052 *0000004500000053000000510000004c0000004e0949000000460000002d000000450000005800 *0000490000005300000054000000530000004e034f0000004c0000004400000051a20943000000 *4c00000053000000510000004c0000002d0000005300000059000000530000000e52010b9c0743 *0000004f0000004e0000004e0000004500000043000000540000003c0b850c2a00000043000000 *4f0000004e0000004e000000450000004300000054000000490000004f0000004e0000002a0000 *0024002388000000241e042403242703040305240604280001039f030703090374039e039d035a *035a1a0103a0130103a1120103a2031c310d0103a328010103a404031f032531050103a50103a6 *3b0988002a0e000000000000000000000000000000000000000000008f45f88d65e08bdc83ec14 *8b15110000008b3d150000008b35190000008b051d0000008943f08b05210000008943ec8b0525 *000000b914000000896bfc8bebff500573028be38b0d290000008b411109c0740b6483385a7405 *648910eb038951fdba0b0000058d65f8f88b6dfcc20400514e084100000042000000530000004f *0000004c000000550000005400000045000000529560000000514e084100000042000000530000 *004f0000004c000000550000005400000045000000529549000000514e08410000004200000053 *0000004f0000004c000000550000005400000045000000529540000000514e0841000000420000 *00530000004f0000004c000000550000005400000045000000529537000000514e084100000042 *000000530000004f0000004c000000550000005400000045000000529531000000514e08410000 *0042000000530000004f0000004c00000055000000540000004500000052952b000000514e0841 *00000042000000530000004f0000004c0000005500000054000000450000005295250000003d01 *3f03ae03a204032c8e000000000103af38003f3eb000000023580a0000424e044e000000410000 *004d000000450000000b850249000000440000004e075200000045000000410000004400000045 *00000052000000530000004e075700000052000000490000005400000045000000520000005300 *00004e08490000004e0000004900000054000000410000005200000047000000530000004e0744 *000000420000002d0000004b000000490000004e000000440000004e034b000000450000005900 *00004e04540000005900000050000000450000004c07490000004e000000540000004500000047 *0000004500000052000000140103b90b85044e000000410000004d0000004500000003b70b9c07 *56000000410000005200000043000000480000004100000052000000120103bc0b85064f000000 *470000002d0000004c0000004f0000005700000003b74c05460000004c0000004f000000410000 *0054000000120103bf0b85074f000000470000002d000000480000004900000047000000480000 *0003bf0b850646000000470000002d0000004c0000004f0000005700000003bf0b850746000000 *470000002d0000004800000049000000470000004800000003bf0b850749000000420000005500 *00002d0000004c0000004f0000005700000003b703b8120103c40b850849000000420000005500 *00002d0000004800000049000000470000004800000003c40b850753000000520000004d000000 *2d0000004c0000004f0000005700000003c40b850853000000520000004d0000002d0000004800 *000049000000470000004800000003c40b85055300000054000000590000004c00000045000000 *0b9c115300000054000000410000004e000000440000004100000052000000440000002d000000 *44000000420000002d000000430000004c00000041000000530000005300000003c703c603c503 *c303c203c103c003bd03ba03b10f0a0103ca24000424070352035531050103cb51a20653000000 *420000002d00000050000000430000004c0000000e52010bcc0d4c0000004f0000004100000044 *0000002d000000440000004500000046000000430000004c000000410000005300000053000000 *3c240023580a0000241e04240324270304030524070428000103ce030703094c034c0000004500 *0000540000000403cd035a035a1a0103d0130103d1120103d2031c310d0103d328010103d40403 *1f032531050103d50103d63b1f580a2a2400000000000000000000000000000000000000000000 *8f45f88d65a08b15110000008b3d150000008b3519000000c745f00b0000058b051d0000008945 *ecc745e80b0000058b05210000008945e4c745e00b0000058b05250000008945dc64c605480000 *0004bb4000000064031d20000000643b1d240000007607e800000000eb0a64891d2000000083eb *408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83c0088940f98b4df08948fd *83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940f98b4de48948fd83c008 *8940f98b4de08948fd8b4ddc89480164c605480000000064803d4c000000007402cc09895df48b *15110000008b3d290000008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000 *058b05210000008945e4c745e00b0000058b052d0000008945dc64c6054800000004bb40000000 *64031d20000000643b1d240000007607e800000000eb0a64891d2000000083eb408d5b038bc389 *50fd83c0088940f98978fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b *4dec8948fd83c0088940f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de089 *48fd8b4ddc89480164c605480000000064803d4c000000007402cc09895dd88b15110000008b3d *310000008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000058b0521000000 *8945e4c745e00b0000058b05350000008945dc64c6054800000004bb4000000064031d20000000 *643b1d240000007607e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940 *f98978fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0 *088940f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc8948 *0164c605480000000064803d4c000000007402cc09895dd48b15110000008b3d390000008b3519 *000000c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b *0000058b053d0000008945dc64c6054800000004bb4000000064031d20000000643b1d24000000 *7607e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c008 *8940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de8 *8948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000 *000064803d4c000000007402cc09895dd08b15110000008b3d410000008b3519000000c745f00b *0000058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b0000058b054500 *00008945dc64c6054800000004bb4000000064031d20000000643b1d240000007607e800000000 *eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83 *c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c00889 *40f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064803d4c00 *0000007402cc09895dcc8b15110000008b3d490000008b3519000000c745f00b0000058b051d00 *00008945ecc745e80b0000058b05210000008945e4c745e00b0000058b054d0000008945dc64c6 *054800000004bb4000000064031d20000000643b1d240000007607e800000000eb0a64891d2000 *000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83c0088940f98b4d *f08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940f98b4de48948 *fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064803d4c000000007402cc09 *895dc88b15110000008b3d510000008b3519000000c745f00b0000058b051d0000008945ecc745 *e80b0000058b05210000008945e4c745e00b0000058b05550000008945dc64c6054800000004bb *4000000064031d20000000643b1d240000007607e800000000eb0a64891d2000000083eb408d5b *038bc38950fd83c0088940f98978fd83c0088940f98970fd83c0088940f98b4df08948fd83c008 *8940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940f98b4de48948fd83c0088940f9 *8b4de08948fd8b4ddc89480164c605480000000064803d4c000000007402cc09895dc48b151100 *00008b3d590000008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000058b05 *210000008945e4c745e00b0000058b055d0000008945dc64c6054800000004bb4000000064031d *20000000643b1d240000007607e800000000eb0a64891d2000000083eb408d5b038bc38950fd83 *c0088940f98978fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec89 *48fd83c0088940f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b *4ddc89480164c605480000000064803d4c000000007402cc09895dc08b15110000008b3d610000 *008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4 *c745e00b0000058b05650000008945dc64c6054800000004bb4000000064031d20000000643b1d *240000007607e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978 *fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940 *f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c6 *05480000000064803d4c000000007402cc09895dbc8b15110000008b3d690000008b3519000000 *c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b000005 *8b056d0000008945dc64c6054800000004bb4000000064031d20000000643b1d240000007607e8 *00000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f9 *8970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd *83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064 *803d4c000000007402cc098b55f48b7dd88b75d48b45d08945f08b45cc8945ec8b45c88945e88b *45c48945e48b45c08945e08b45bc8945dc895dd864c6054800000004bb5000000064031d200000 *00643b1d240000007607e800000000eb0a64891d2000000083eb508d5b038bc38950fd83c00889 *40f98978fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83 *c0088940f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd83c00889 *40f98b4ddc8948fd83c0088940f98b4dd88948fdc740010b00000564c605480000000064803d4c *000000007402cc09895df0ba0b0000058955ec8bdc83ec248b15710000008b3d75000000be0b00 *00058b45f08943f08b45ec8943ecc743e80b000005c743e40b0000058b05790000008943e08b05 *7d0000008943dc8b0581000000b924000000896bfc8bebff500573028be3ba0b0000058d65f8f8 *8b6dfcc204009090909090514e084100000042000000530000004f0000004c0000005500000054 *0000004500000052952f0a0000514e084100000042000000530000004f0000004c000000550000 *0054000000450000005295260a0000514e084100000042000000530000004f0000004c00000055 *000000540000004500000052951d0a0000514e084100000042000000530000004f0000004c0000 *005500000054000000450000005295f8090000514e084100000042000000530000004f0000004c *0000005500000054000000450000005295f2090000514e0852000000450000004c000000410000 *0054000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f65627847 *090000514e0852000000450000004c000000410000005400000049000000560000004500000052 *9312616c6c6f635f6f766572666c6f775f65627879080000514e08410000004200000053000000 *4f0000004c000000550000005400000045000000529554080000514e0841000000420000005300 *00004f0000004c000000550000005400000045000000529544080000514e084100000042000000 *530000004f0000004c000000550000005400000045000000529534080000514e08410000004200 *0000530000004f0000004c000000550000005400000045000000529527080000514e0841000000 *42000000530000004f0000004c000000550000005400000045000000529521080000514e084100 *000042000000530000004f0000004c00000055000000540000004500000052951b080000514e08 *52000000450000004c0000004100000054000000490000005600000045000000529312616c6c6f *635f6f766572666c6f775f65627896070000514e084100000042000000530000004f0000004c00 *0000550000005400000045000000529571070000514e084100000042000000530000004f000000 *4c000000550000005400000045000000529561070000514e084100000042000000530000004f00 *00004c000000550000005400000045000000529551070000514e08410000004200000053000000 *4f0000004c000000550000005400000045000000529544070000514e0841000000420000005300 *00004f0000004c00000055000000540000004500000052953e070000514e084100000042000000 *530000004f0000004c000000550000005400000045000000529538070000514e08520000004500 *00004c0000004100000054000000490000005600000045000000529312616c6c6f635f6f766572 *666c6f775f656278b3060000514e084100000042000000530000004f0000004c00000055000000 *540000004500000052958e060000514e084100000042000000530000004f0000004c0000005500 *0000540000004500000052957e060000514e084100000042000000530000004f0000004c000000 *55000000540000004500000052956e060000514e084100000042000000530000004f0000004c00 *0000550000005400000045000000529561060000514e084100000042000000530000004f000000 *4c00000055000000540000004500000052955b060000514e084100000042000000530000004f00 *00004c000000550000005400000045000000529555060000514e0852000000450000004c000000 *4100000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f65 *6278d0050000514e084100000042000000530000004f0000004c00000055000000540000004500 *00005295ab050000514e084100000042000000530000004f0000004c0000005500000054000000 *4500000052959b050000514e084100000042000000530000004f0000004c000000550000005400 *00004500000052958b050000514e084100000042000000530000004f0000004c00000055000000 *540000004500000052957e050000514e084100000042000000530000004f0000004c0000005500 *00005400000045000000529578050000514e084100000042000000530000004f0000004c000000 *550000005400000045000000529572050000514e0852000000450000004c000000410000005400 *0000490000005600000045000000529312616c6c6f635f6f766572666c6f775f656278ed040000 *514e084100000042000000530000004f0000004c0000005500000054000000450000005295c804 *0000514e084100000042000000530000004f0000004c0000005500000054000000450000005295 *b8040000514e084100000042000000530000004f0000004c000000550000005400000045000000 *5295a8040000514e084100000042000000530000004f0000004c00000055000000540000004500 *000052959b040000514e084100000042000000530000004f0000004c0000005500000054000000 *45000000529595040000514e084100000042000000530000004f0000004c000000550000005400 *00004500000052958f040000514e0852000000450000004c000000410000005400000049000000 *5600000045000000529312616c6c6f635f6f766572666c6f775f6562780a040000514e08410000 *0042000000530000004f0000004c0000005500000054000000450000005295e5030000514e0841 *00000042000000530000004f0000004c0000005500000054000000450000005295d5030000514e *084100000042000000530000004f0000004c0000005500000054000000450000005295c5030000 *514e084100000042000000530000004f0000004c0000005500000054000000450000005295b803 *0000514e084100000042000000530000004f0000004c0000005500000054000000450000005295 *b2030000514e084100000042000000530000004f0000004c000000550000005400000045000000 *5295ac030000514e0852000000450000004c000000410000005400000049000000560000004500 *0000529312616c6c6f635f6f766572666c6f775f65627827030000514e08410000004200000053 *0000004f0000004c000000550000005400000045000000529502030000514e0841000000420000 *00530000004f0000004c0000005500000054000000450000005295f2020000514e084100000042 *000000530000004f0000004c0000005500000054000000450000005295e2020000514e08410000 *0042000000530000004f0000004c0000005500000054000000450000005295d5020000514e0841 *00000042000000530000004f0000004c0000005500000054000000450000005295cf020000514e *084100000042000000530000004f0000004c0000005500000054000000450000005295c9020000 *514e0852000000450000004c000000410000005400000049000000560000004500000052931261 *6c6c6f635f6f766572666c6f775f65627844020000514e084100000042000000530000004f0000 *004c00000055000000540000004500000052951f020000514e084100000042000000530000004f *0000004c00000055000000540000004500000052950f020000514e084100000042000000530000 *004f0000004c0000005500000054000000450000005295ff010000514e08410000004200000053 *0000004f0000004c0000005500000054000000450000005295f2010000514e0841000000420000 *00530000004f0000004c0000005500000054000000450000005295ec010000514e084100000042 *000000530000004f0000004c0000005500000054000000450000005295e6010000514e08520000 *00450000004c0000004100000054000000490000005600000045000000529312616c6c6f635f6f *766572666c6f775f65627861010000514e084100000042000000530000004f0000004c00000055 *000000540000004500000052953c010000514e084100000042000000530000004f0000004c0000 *0055000000540000004500000052952c010000514e084100000042000000530000004f0000004c *00000055000000540000004500000052951c010000514e084100000042000000530000004f0000 *004c00000055000000540000004500000052950f010000514e084100000042000000530000004f *0000004c000000550000005400000045000000529509010000514e084100000042000000530000 *004f0000004c000000550000005400000045000000529503010000514e0852000000450000004c *0000004100000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f *775f6562787e000000514e084100000042000000530000004f0000004c00000055000000540000 *0045000000529559000000514e084100000042000000530000004f0000004c0000005500000054 *00000045000000529549000000514e084100000042000000530000004f0000004c000000550000 *005400000045000000529539000000514e084100000042000000530000004f0000004c00000055 *000000540000004500000052952c000000514e084100000042000000530000004f0000004c0000 *00550000005400000045000000529526000000514e084100000042000000530000004f0000004c *0000005500000054000000450000005295200000003d013f022301000003d204032c8e00000000 *01022401000038003f3e2501000023a00000004203c80bcc0f46000000490000004e0000004400 *00002d000000430000004c0000004100000053000000530000002d00000043000000450000004c *0000004c0000003c240023a0000000241e04240324270304030524070428000102260100000307 *030951a20953000000420000002d0000004b00000045000000520000004e000000450000004c00 *00000e520109270100000f4d000000410000004b000000450000002d0000005600000041000000 *4c00000055000000450000002d00000043000000450000004c0000004c0000000225010000035c *120102290100001201022a0100001201022b010000031c310d01022c010000280101022d010000 *04040325310501022e010000022b010000cc2e0100000100000001022f0100003b04a0002a0800 *0000000000000000000000000000000000000000008f45f88d65e08bdc83ec0c8b15110000008b *0515000000b904000000896bfc8bebff500573028be364c6054800000004b80800000064030520 *000000643b05240000007607e800000000eb0a6489052000000083e8088d4007c740f93a010000 *64c605480000000064803d4c000000007402cc098950fd8bd08d65f8f88b6dfcc2040090909090 *90514e0852000000450000004c0000004100000054000000490000005600000045000000529312 *616c6c6f635f6f766572666c6f775f6561785e000000514e084100000042000000530000004f00 *00004c00000055000000540000004500000052952b000000514e08410000004200000053000000 *4f0000004c0000005500000054000000450000005295250000003d013f0233010000022b010000 *04032c8e000000000102340100003700013f3e36010000239d00000042023501000051a2065300 *0000420000002d0000004d0000004f000000500000000e52010936010000144600000049000000 *4e000000410000004c000000490000005a000000450000002d000000490000004e000000480000 *0045000000520000004900000054000000410000004e00000043000000450000003c03c80bcc14 *46000000490000004e000000440000002d000000430000004c0000004100000053000000530000 *002d00000046000000520000004f0000004d0000002d00000043000000450000004c0000004c00 *00003c24002398000000241e042403242703040305240704280001023901000003070309023701 *00004c0a46000000490000004e000000440000002d000000430000004c00000041000000530000 *0053000000035c1201023b0100001201023c0100001201023d010000031c310d01023e01000028 *0101023f01000004031f032531050102400100000102410100003b069d002a0a00000000000000 *0000000000000000000000000000008f45f88d65e08b05110000008b48fd8bc124073c0375698b *c18b40fd3d0b000005742d8bd08bdc83ec0c8b0515000000b904000000896bfc8bebff50057302 *8be3ba0b0000058d65f8f88b6dfcc204008bdc83ec0c8b15190000008bf9be270000058b051d00 *0000b90c000000896bfc8bebff500573028be3ebaa9090909090cc0a02024e514e084100000042 *000000530000004f0000004c00000055000000540000004500000052957c000000514e08410000 *0042000000530000004f0000004c00000055000000540000004500000052956f000000514e0841 *00000042000000530000004f0000004c000000550000005400000045000000529544000000514e *084100000042000000530000004f0000004c000000550000005400000045000000529520000000 *3d013f0246010000023d01000004032c8e0000000001024701000038003f3e4801000023a00000 *004203c802250100003c240023a0000000241e0424032427030403052407042800010248010000 *0307022b010000031c310d010249010000280101024a01000004022b0100000325310501024b01 *000001024c0100003b04a0002a08000000000000000000000000000000000000000000008f45f8 *8d65e08bdc83ec0c8b15110000008b0515000000b904000000896bfc8bebff500573028be364c6 *054800000004b80800000064030520000000643b05240000007607e800000000eb0a6489052000 *000083e8088d4007c740f93a01000064c605480000000064803d4c000000007402cc098950fd8b *d08d65f8f88b6dfcc204009090909090514e0852000000450000004c0000004100000054000000 *490000005600000045000000529312616c6c6f635f6f766572666c6f775f6561785e000000514e *084100000042000000530000004f0000004c00000055000000540000004500000052952b000000 *514e084100000042000000530000004f0000004c00000055000000540000004500000052952500 *00003d013f0250010000022b01000004032c8e000000000102510100003700013f3e5301000024 *7d42025201000003c802380100003c24002478241e042403242703040305240704280001025301 *000003070309023a010000030a03c8120102540100001201025501000012010256010000031c31 *0d010257010000280101025801000004031f0325310501025901000001025a0100003b057d002a *0a000000000000000000000000000000000000000000008f45f88d65e08b05110000008b48fd8b *c124073c0375498bc18b40fd3d0b00000575298bdc83ec0c8b15150000008bf9be270000058b05 *19000000b90c000000896bfc8bebff500573028be3ba0b0000058d65f8f88b6dfcc20400909090 *9090cc0a02024e514e084100000042000000530000004f0000004c000000550000005400000045 *00000052954f000000514e084100000042000000530000004f0000004c00000055000000540000 *0045000000529542000000514e084100000042000000530000004f0000004c0000005500000054 *000000450000005295200000003d013f025e010000025601000004032c8e0000000001025f0100 *0038003f3e6001000023a80300004203b003ba03b203b303b403b503b603b703bb244012010260 *010000140102610100000b850b4400000045000000530000004300000052000000490000005000 *000054000000490000004f0000004e00000003bc03c84e0744000000420000002d000000490000 *004e000000460000004f0000004e0a4a0000004f000000490000004e0000002d00000043000000 *4c00000041000000530000005300000003c84e08480000004f0000004d000000450000002d0000 *004b00000045000000590000000b85085300000054000000590000004c000000450000002d0000 *0049000000440000004e0b460000004f000000520000004500000049000000470000004e000000 *2d0000004b000000450000005900000003b14e0353000000450000005400000004180102690100 *0003b54e044a0000004f000000490000004e0000001401026b0100000b850d4d00000041000000 *530000005400000045000000520000002d00000052000000450000004300000049000000500000 *004500000003c903c8026201000003ba1301026d010000240004240803520355310501026e0100 *0003cd3c240023a8030000241e042403242703040305240804280001026f010000030703d2031c *310d010270010000280101027101000004031f032531050102720100000102730100003b11a803 *2a16000000000000000000000000000000000000000000008f45f88d65c08b15110000008b3d15 *0000008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000058b052100000089 *45e4c745e00b0000058b05250000008945dc64c6054800000004bb4000000064031d2000000064 *3b1d240000007607e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f9 *8978fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c008 *8940f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc894801 *64c605480000000064803d4c000000007402cc09895df48b15110000008b3d290000008b351900 *0000c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b00 *00058b052d0000008945dc64c6054800000004bb4000000064031d20000000643b1d2400000076 *07e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c00889 *40f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de889 *48fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c60548000000 *0064803d4c000000007402cc09895dd88b15110000008b3d310000008b3519000000c745f00b00 *00058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b0000058b05350000 *008945dc64c6054800000004bb4000000064031d20000000643b1d240000007607e800000000eb *0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83c0 *088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940 *f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064803d4c0000 *00007402cc098bf38b55f48b7dd864c6054800000004bb1800000064031d20000000643b1d2400 *00007607e800000000eb0a64891d2000000083eb188d5b038bc38950fd83c0088940f98978fd83 *c0088940f98970fdc740010b00000564c605480000000064803d4c000000007402cc09895df0ba *0b0000058955ec8bdc83ec248b15390000008b3d3d000000be0b0000058b45f08943f08b45ec89 *43ecc743e80b000005c743e40b0000058b05410000008943e08b05450000008943dc8b05490000 *00b924000000896bfc8bebff500573028be3ba0b0000058d65f8f88b6dfcc20400909090909090 *514e084100000042000000530000004f0000004c00000055000000540000004500000052957e03 *0000514e084100000042000000530000004f0000004c0000005500000054000000450000005295 *75030000514e084100000042000000530000004f0000004c000000550000005400000045000000 *52956c030000514e084100000042000000530000004f0000004c00000055000000540000004500 *0000529547030000514e084100000042000000530000004f0000004c0000005500000054000000 *45000000529541030000514e0852000000450000004c0000004100000054000000490000005600 *000045000000529312616c6c6f635f6f766572666c6f775f656278ea020000514e085200000045 *0000004c0000004100000054000000490000005600000045000000529312616c6c6f635f6f7665 *72666c6f775f65627844020000514e084100000042000000530000004f0000004c000000550000 *00540000004500000052951f020000514e084100000042000000530000004f0000004c00000055 *000000540000004500000052950f020000514e084100000042000000530000004f0000004c0000 *005500000054000000450000005295ff010000514e084100000042000000530000004f0000004c *0000005500000054000000450000005295f2010000514e084100000042000000530000004f0000 *004c0000005500000054000000450000005295ec010000514e084100000042000000530000004f *0000004c0000005500000054000000450000005295e6010000514e0852000000450000004c0000 *004100000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f *65627861010000514e084100000042000000530000004f0000004c000000550000005400000045 *00000052953c010000514e084100000042000000530000004f0000004c00000055000000540000 *004500000052952c010000514e084100000042000000530000004f0000004c0000005500000054 *0000004500000052951c010000514e084100000042000000530000004f0000004c000000550000 *00540000004500000052950f010000514e084100000042000000530000004f0000004c00000055 *0000005400000045000000529509010000514e084100000042000000530000004f0000004c0000 *00550000005400000045000000529503010000514e0852000000450000004c0000004100000054 *000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f6562787e0000 *00514e084100000042000000530000004f0000004c000000550000005400000045000000529559 *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *9549000000514e084100000042000000530000004f0000004c0000005500000054000000450000 *00529539000000514e084100000042000000530000004f0000004c000000550000005400000045 *00000052952c000000514e084100000042000000530000004f0000004c00000055000000540000 *0045000000529526000000514e084100000042000000530000004f0000004c0000005500000054 *000000450000005295200000003d013f028f01000003d204032c8e000000000102900100003800 *3f3e9101000023a000000042026c01000002250100003c240023a0000000241e04240324270304 *030524080428000102910100000307022b010000031c310d010292010000280101029301000004 *022b010000032531050102940100000102950100003b04a0002a08000000000000000000000000 *000000000000000000008f45f88d65e08bdc83ec0c8b15110000008b0515000000b90400000089 *6bfc8bebff500573028be364c6054800000004b80800000064030520000000643b052400000076 *07e800000000eb0a6489052000000083e8088d4007c740f93a01000064c605480000000064803d *4c000000007402cc098950fd8bd08d65f8f88b6dfcc204009090909090514e0852000000450000 *004c0000004100000054000000490000005600000045000000529312616c6c6f635f6f76657266 *6c6f775f6561785e000000514e084100000042000000530000004f0000004c0000005500000054 *0000004500000052952b000000514e084100000042000000530000004f0000004c000000550000 *0054000000450000005295250000003d013f0299010000022b01000004032c8e0000000001029a *0100003700013f3e9c010000239d00000042029b01000002370100003c026c0100000238010000 *3c24002398000000241e042403242703040305240804280001029c0100000307023d010000031c *310d01029d010000280101029e01000004031f0325310501029f0100000102a00100003b069d00 *2a0a000000000000000000000000000000000000000000008f45f88d65e08b05110000008b48fd *8bc124073c0375698bc18b40fd3d0b000005742d8bd08bdc83ec0c8b0515000000b90400000089 *6bfc8bebff500573028be3ba0b0000058d65f8f88b6dfcc204008bdc83ec0c8b15190000008bf9 *be270000058b051d000000b90c000000896bfc8bebff500573028be3ebaa9090909090cc0a0202 *4e514e084100000042000000530000004f0000004c00000055000000540000004500000052957c *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *956f000000514e084100000042000000530000004f0000004c0000005500000054000000450000 *00529544000000514e084100000042000000530000004f0000004c000000550000005400000045 *0000005295200000003d013f02a5010000023d01000004032c8e000000000102a601000038003f *3ea701000023a000000042026c01000002250100003c240023a0000000241e0424032427030403 *0524080428000102a70100000307022b010000031c310d0102a801000028010102a90100000402 *2b010000032531050102aa0100000102ab0100003b04a0002a0800000000000000000000000000 *0000000000000000008f45f88d65e08bdc83ec0c8b15110000008b0515000000b904000000896b *fc8bebff500573028be364c6054800000004b80800000064030520000000643b05240000007607 *e800000000eb0a6489052000000083e8088d4007c740f93a01000064c605480000000064803d4c *000000007402cc098950fd8bd08d65f8f88b6dfcc204009090909090514e085200000045000000 *4c0000004100000054000000490000005600000045000000529312616c6c6f635f6f766572666c *6f775f6561785e000000514e084100000042000000530000004f0000004c000000550000005400 *00004500000052952b000000514e084100000042000000530000004f0000004c00000055000000 *54000000450000005295250000003d013f02af010000022b01000004032c8e000000000102b001 *00003700013f3eb2010000247d4202b1010000026c01000002380100003c24002478241e042403 *24270304030524080428000102b201000003070309023a010000030a026c010000120102b30100 *00120102b4010000120102b5010000031c310d0102b601000028010102b701000004031f032531 *050102b80100000102b90100003b057d002a0a0000000000000000000000000000000000000000 *00008f45f88d65e08b05110000008b48fd8bc124073c0375498bc18b40fd3d0b00000575298bdc *83ec0c8b15150000008bf9be270000058b0519000000b90c000000896bfc8bebff500573028be3 *ba0b0000058d65f8f88b6dfcc204009090909090cc0a02024e514e084100000042000000530000 *004f0000004c00000055000000540000004500000052954f000000514e08410000004200000053 *0000004f0000004c000000550000005400000045000000529542000000514e0841000000420000 *00530000004f0000004c0000005500000054000000450000005295200000003d013f02bd010000 *02b501000004032c8e000000000102be01000038003f3ebf01000023a80300004203b003b103b2 *03b303b403b90b8506520000004500000043000000490000005000000045000000026301000002 *64010000026c01000002650100000b850b52000000450000004300000049000000500000004500 *00002d0000004e000000410000004d00000045000000026701000003ba160102c101000003b502 *6a010000140102c20100000b85085200000045000000560000004900000053000000490000004f *0000004e00000003c40b850f5200000045000000430000004900000050000000450000002d0000 *005200000045000000560000004900000053000000490000004f0000004e00000003c902c30100 *0002bf01000003b1130102c501000024000424090352035531050102c601000003cd3c240023a8 *030000241e04240324270304030524090428000102c7010000030703d2031c310d0102c8010000 *28010102c901000004031f032531050102ca0100000102cb0100003b11a8032a16000000000000 *000000000000000000000000000000008f45f88d65c08b15110000008b3d150000008b35190000 *00c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b0000 *058b05250000008945dc64c6054800000004bb4000000064031d20000000643b1d240000007607 *e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940 *f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948 *fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c6054800000000 *64803d4c000000007402cc09895df48b15110000008b3d290000008b3519000000c745f00b0000 *058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b0000058b052d000000 *8945dc64c6054800000004bb4000000064031d20000000643b1d240000007607e800000000eb0a *64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83c008 *8940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940f9 *8b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064803d4c000000 *007402cc09895dd88b15110000008b3d310000008b3519000000c745f00b0000058b051d000000 *8945ecc745e80b0000058b05210000008945e4c745e00b0000058b05350000008945dc64c60548 *00000004bb4000000064031d20000000643b1d240000007607e800000000eb0a64891d20000000 *83eb408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83c0088940f98b4df089 *48fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940f98b4de48948fd83 *c0088940f98b4de08948fd8b4ddc89480164c605480000000064803d4c000000007402cc098bf3 *8b55f48b7dd864c6054800000004bb1800000064031d20000000643b1d240000007607e8000000 *00eb0a64891d2000000083eb188d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd *c740010b00000564c605480000000064803d4c000000007402cc09895df0ba0b0000058955ec8b *dc83ec248b15390000008b3d3d000000be0b0000058b45f08943f08b45ec8943ecc743e80b0000 *05c743e40b0000058b05410000008943e08b05450000008943dc8b0549000000b924000000896b *fc8bebff500573028be3ba0b0000058d65f8f88b6dfcc20400909090909090514e084100000042 *000000530000004f0000004c00000055000000540000004500000052957e030000514e08410000 *0042000000530000004f0000004c000000550000005400000045000000529575030000514e0841 *00000042000000530000004f0000004c00000055000000540000004500000052956c030000514e *084100000042000000530000004f0000004c000000550000005400000045000000529547030000 *514e084100000042000000530000004f0000004c00000055000000540000004500000052954103 *0000514e0852000000450000004c00000041000000540000004900000056000000450000005293 *12616c6c6f635f6f766572666c6f775f656278ea020000514e0852000000450000004c00000041 *00000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f6562 *7844020000514e084100000042000000530000004f0000004c0000005500000054000000450000 *0052951f020000514e084100000042000000530000004f0000004c000000550000005400000045 *00000052950f020000514e084100000042000000530000004f0000004c00000055000000540000 *00450000005295ff010000514e084100000042000000530000004f0000004c0000005500000054 *000000450000005295f2010000514e084100000042000000530000004f0000004c000000550000 *0054000000450000005295ec010000514e084100000042000000530000004f0000004c00000055 *00000054000000450000005295e6010000514e0852000000450000004c00000041000000540000 *00490000005600000045000000529312616c6c6f635f6f766572666c6f775f6562786101000051 *4e084100000042000000530000004f0000004c00000055000000540000004500000052953c0100 *00514e084100000042000000530000004f0000004c00000055000000540000004500000052952c *010000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *951c010000514e084100000042000000530000004f0000004c0000005500000054000000450000 *0052950f010000514e084100000042000000530000004f0000004c000000550000005400000045 *000000529509010000514e084100000042000000530000004f0000004c00000055000000540000 *0045000000529503010000514e0852000000450000004c00000041000000540000004900000056 *00000045000000529312616c6c6f635f6f766572666c6f775f6562787e000000514e0841000000 *42000000530000004f0000004c000000550000005400000045000000529559000000514e084100 *000042000000530000004f0000004c000000550000005400000045000000529549000000514e08 *4100000042000000530000004f0000004c00000055000000540000004500000052953900000051 *4e084100000042000000530000004f0000004c00000055000000540000004500000052952c0000 *00514e084100000042000000530000004f0000004c000000550000005400000045000000529526 *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *95200000003d013f02e701000003d204032c8e000000000102e801000038003f3ee901000023a0 *0000004202c401000002250100003c240023a0000000241e042403242703040305240904280001 *02e90100000307022b010000031c310d0102ea01000028010102eb01000004022b010000032531 *050102ec0100000102ed0100003b04a0002a080000000000000000000000000000000000000000 *00008f45f88d65e08bdc83ec0c8b15110000008b0515000000b904000000896bfc8bebff500573 *028be364c6054800000004b80800000064030520000000643b05240000007607e800000000eb0a *6489052000000083e8088d4007c740f93a01000064c605480000000064803d4c000000007402cc *098950fd8bd08d65f8f88b6dfcc204009090909090514e0852000000450000004c000000410000 *0054000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f6561785e *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *952b000000514e084100000042000000530000004f0000004c0000005500000054000000450000 *005295250000003d013f02f1010000022b01000004032c8e000000000102f20100003700013f3e *f4010000239d0000004202f301000002370100003c02c401000002380100003c24002398000000 *241e04240324270304030524090428000102f40100000307023d010000031c310d0102f5010000 *28010102f601000004031f032531050102f70100000102f80100003b069d002a0a000000000000 *000000000000000000000000000000008f45f88d65e08b05110000008b48fd8bc124073c037569 *8bc18b40fd3d0b000005742d8bd08bdc83ec0c8b0515000000b904000000896bfc8bebff500573 *028be3ba0b0000058d65f8f88b6dfcc204008bdc83ec0c8b15190000008bf9be270000058b051d *000000b90c000000896bfc8bebff500573028be3ebaa9090909090cc0a02024e514e0841000000 *42000000530000004f0000004c00000055000000540000004500000052957c000000514e084100 *000042000000530000004f0000004c00000055000000540000004500000052956f000000514e08 *4100000042000000530000004f0000004c00000055000000540000004500000052954400000051 *4e084100000042000000530000004f0000004c0000005500000054000000450000005295200000 *003d013f02fd010000023d01000004032c8e000000000102fe01000038003f3eff01000023a000 *00004202c401000002250100003c240023a0000000241e04240324270304030524090428000102 *ff0100000307022b010000031c310d010200020000280101020102000004022b01000003253105 *0102020200000102030200003b04a0002a08000000000000000000000000000000000000000000 *008f45f88d65e08bdc83ec0c8b15110000008b0515000000b904000000896bfc8bebff50057302 *8be364c6054800000004b80800000064030520000000643b05240000007607e800000000eb0a64 *89052000000083e8088d4007c740f93a01000064c605480000000064803d4c000000007402cc09 *8950fd8bd08d65f8f88b6dfcc204009090909090514e0852000000450000004c00000041000000 *54000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f6561785e00 *0000514e084100000042000000530000004f0000004c0000005500000054000000450000005295 *2b000000514e084100000042000000530000004f0000004c000000550000005400000045000000 *5295250000003d013f0207020000022b01000004032c8e000000000102080200003700013f3e0a *020000247d42020902000002c401000002380100003c24002478241e0424032427030403052409 *04280001020a02000003070309023a010000030a02c40100001201020b0200001201020c020000 *1201020d020000031c310d01020e020000280101020f02000004031f0325310501021002000001 *02110200003b057d002a0a000000000000000000000000000000000000000000008f45f88d65e0 *8b05110000008b48fd8bc124073c0375498bc18b40fd3d0b00000575298bdc83ec0c8b15150000 *008bf9be270000058b0519000000b90c000000896bfc8bebff500573028be3ba0b0000058d65f8 *f88b6dfcc204009090909090cc0a02024e514e084100000042000000530000004f0000004c0000 *0055000000540000004500000052954f000000514e084100000042000000530000004f0000004c *000000550000005400000045000000529542000000514e084100000042000000530000004f0000 *004c0000005500000054000000450000005295200000003d013f0215020000020d02000004032c *8e0000000001021602000038003f3e1702000023a80300004203b003b103b203b303b403b903ba *03bc0b8505410000004c00000050000000480000004100000003bf0b8503480000004f00000050 *00000003c9021702000003ba03b113010219020000240004240a03520355310501021a02000003 *cd3c240023a8030000241e042403242703040305240a04280001021b020000030703d2031c310d *01021c020000280101021d02000004031f0325310501021e02000001021f0200003b11a8032a16 *000000000000000000000000000000000000000000008f45f88d65c08b15110000008b3d150000 *008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4 *c745e00b0000058b05250000008945dc64c6054800000004bb4000000064031d20000000643b1d *240000007607e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978 *fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940 *f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c6 *05480000000064803d4c000000007402cc09895df48b15110000008b3d290000008b3519000000 *c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b000005 *8b052d0000008945dc64c6054800000004bb4000000064031d20000000643b1d240000007607e8 *00000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f9 *8970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd *83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064 *803d4c000000007402cc09895dd88b15110000008b3d310000008b3519000000c745f00b000005 *8b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b0000058b053500000089 *45dc64c6054800000004bb4000000064031d20000000643b1d240000007607e800000000eb0a64 *891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83c00889 *40f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940f98b *4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064803d4c00000000 *7402cc098bf38b55f48b7dd864c6054800000004bb1800000064031d20000000643b1d24000000 *7607e800000000eb0a64891d2000000083eb188d5b038bc38950fd83c0088940f98978fd83c008 *8940f98970fdc740010b00000564c605480000000064803d4c000000007402cc09895df0ba0b00 *00058955ec8bdc83ec248b15390000008b3d3d000000be0b0000058b45f08943f08b45ec8943ec *c743e80b000005c743e40b0000058b05410000008943e08b05450000008943dc8b0549000000b9 *24000000896bfc8bebff500573028be3ba0b0000058d65f8f88b6dfcc20400909090909090514e *084100000042000000530000004f0000004c00000055000000540000004500000052957e030000 *514e084100000042000000530000004f0000004c00000055000000540000004500000052957503 *0000514e084100000042000000530000004f0000004c0000005500000054000000450000005295 *6c030000514e084100000042000000530000004f0000004c000000550000005400000045000000 *529547030000514e084100000042000000530000004f0000004c00000055000000540000004500 *0000529541030000514e0852000000450000004c00000041000000540000004900000056000000 *45000000529312616c6c6f635f6f766572666c6f775f656278ea020000514e0852000000450000 *004c0000004100000054000000490000005600000045000000529312616c6c6f635f6f76657266 *6c6f775f65627844020000514e084100000042000000530000004f0000004c0000005500000054 *0000004500000052951f020000514e084100000042000000530000004f0000004c000000550000 *00540000004500000052950f020000514e084100000042000000530000004f0000004c00000055 *00000054000000450000005295ff010000514e084100000042000000530000004f0000004c0000 *005500000054000000450000005295f2010000514e084100000042000000530000004f0000004c *0000005500000054000000450000005295ec010000514e084100000042000000530000004f0000 *004c0000005500000054000000450000005295e6010000514e0852000000450000004c00000041 *00000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f6562 *7861010000514e084100000042000000530000004f0000004c0000005500000054000000450000 *0052953c010000514e084100000042000000530000004f0000004c000000550000005400000045 *00000052952c010000514e084100000042000000530000004f0000004c00000055000000540000 *004500000052951c010000514e084100000042000000530000004f0000004c0000005500000054 *0000004500000052950f010000514e084100000042000000530000004f0000004c000000550000 *005400000045000000529509010000514e084100000042000000530000004f0000004c00000055 *0000005400000045000000529503010000514e0852000000450000004c00000041000000540000 *00490000005600000045000000529312616c6c6f635f6f766572666c6f775f6562787e00000051 *4e084100000042000000530000004f0000004c0000005500000054000000450000005295590000 *00514e084100000042000000530000004f0000004c000000550000005400000045000000529549 *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *9539000000514e084100000042000000530000004f0000004c0000005500000054000000450000 *0052952c000000514e084100000042000000530000004f0000004c000000550000005400000045 *000000529526000000514e084100000042000000530000004f0000004c00000055000000540000 *00450000005295200000003d013f023b02000003d204032c8e0000000001023c02000038003f3e *3d02000023a000000042021802000002250100003c240023a0000000241e042403242703040305 *240a04280001023d0200000307022b010000031c310d01023e020000280101023f02000004022b *010000032531050102400200000102410200003b04a0002a080000000000000000000000000000 *00000000000000008f45f88d65e08bdc83ec0c8b15110000008b0515000000b904000000896bfc *8bebff500573028be364c6054800000004b80800000064030520000000643b05240000007607e8 *00000000eb0a6489052000000083e8088d4007c740f93a01000064c605480000000064803d4c00 *0000007402cc098950fd8bd08d65f8f88b6dfcc204009090909090514e0852000000450000004c *0000004100000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f *775f6561785e000000514e084100000042000000530000004f0000004c00000055000000540000 *004500000052952b000000514e084100000042000000530000004f0000004c0000005500000054 *000000450000005295250000003d013f0245020000022b01000004032c8e000000000102460200 *003700013f3e48020000239d00000042024702000002370100003c021802000002380100003c24 *002398000000241e042403242703040305240a0428000102480200000307023d010000031c310d *010249020000280101024a02000004031f0325310501024b02000001024c0200003b069d002a0a *000000000000000000000000000000000000000000008f45f88d65e08b05110000008b48fd8bc1 *24073c0375698bc18b40fd3d0b000005742d8bd08bdc83ec0c8b0515000000b904000000896bfc *8bebff500573028be3ba0b0000058d65f8f88b6dfcc204008bdc83ec0c8b15190000008bf9be27 *0000058b051d000000b90c000000896bfc8bebff500573028be3ebaa9090909090cc0a02024e51 *4e084100000042000000530000004f0000004c00000055000000540000004500000052957c0000 *00514e084100000042000000530000004f0000004c00000055000000540000004500000052956f *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *9544000000514e084100000042000000530000004f0000004c0000005500000054000000450000 *005295200000003d013f0251020000023d01000004032c8e0000000001025202000038003f3e53 *02000023a000000042021802000002250100003c240023a0000000241e04240324270304030524 *0a0428000102530200000307022b010000031c310d010254020000280101025502000004022b01 *0000032531050102560200000102570200003b04a0002a08000000000000000000000000000000 *000000000000008f45f88d65e08bdc83ec0c8b15110000008b0515000000b904000000896bfc8b *ebff500573028be364c6054800000004b80800000064030520000000643b05240000007607e800 *000000eb0a6489052000000083e8088d4007c740f93a01000064c605480000000064803d4c0000 *00007402cc098950fd8bd08d65f8f88b6dfcc204009090909090514e0852000000450000004c00 *00004100000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f77 *5f6561785e000000514e084100000042000000530000004f0000004c0000005500000054000000 *4500000052952b000000514e084100000042000000530000004f0000004c000000550000005400 *0000450000005295250000003d013f025b020000022b01000004032c8e0000000001025c020000 *3700013f3e5e020000247d42025d020000021802000002380100003c24002478241e0424032427 *03040305240a04280001025e02000003070309023a010000030a02180200001201025f02000012 *01026002000012010261020000031c310d010262020000280101026302000004031f0325310501 *02640200000102650200003b057d002a0a00000000000000000000000000000000000000000000 *8f45f88d65e08b05110000008b48fd8bc124073c0375498bc18b40fd3d0b00000575298bdc83ec *0c8b15150000008bf9be270000058b0519000000b90c000000896bfc8bebff500573028be3ba0b *0000058d65f8f88b6dfcc204009090909090cc0a02024e514e084100000042000000530000004f *0000004c00000055000000540000004500000052954f000000514e084100000042000000530000 *004f0000004c000000550000005400000045000000529542000000514e08410000004200000053 *0000004f0000004c0000005500000054000000450000005295200000003d013f02690200000261 *02000004032c8e0000000001026a02000038003f3e6b02000023900500004203b003b103b203b3 *03b403b903ba03bc0b8505430000004f0000004c0000004f0000005200000003c40b8507450000 *0058000000540000005200000041000000430000005400000003bf0b8503550000005300000045 *00000003b702600100001201026e0200000b8505470000005200000041000000490000004e0000 *0003c9026d020000026c020000026b02000003ba03b115010270020000240004240b0352035531 *0501027102000003cd3c24002390050000241e042403242703040305240b042800010272020000 *030703d2031c310d010273020000280101027402000004031f0325310501027502000001027602 *00003b1590052a1a000000000000000000000000000000000000000000008f45f88d65c08b1511 *0000008b3d150000008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000058b *05210000008945e4c745e00b0000058b05250000008945dc64c6054800000004bb400000006403 *1d20000000643b1d240000007607e800000000eb0a64891d2000000083eb408d5b038bc38950fd *83c0088940f98978fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec *8948fd83c0088940f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd *8b4ddc89480164c605480000000064803d4c000000007402cc09895df48b15110000008b3d2900 *00008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945 *e4c745e00b0000058b052d0000008945dc64c6054800000004bb4000000064031d20000000643b *1d240000007607e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f989 *78fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c00889 *40f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164 *c605480000000064803d4c000000007402cc09895dd88b15110000008b3d310000008b35190000 *00c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b0000 *058b05350000008945dc64c6054800000004bb4000000064031d20000000643b1d240000007607 *e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940 *f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948 *fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c6054800000000 *64803d4c000000007402cc09895dd48b15110000008b3d390000008b3519000000c745f00b0000 *058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b0000058b053d000000 *8945dc64c6054800000004bb4000000064031d20000000643b1d240000007607e800000000eb0a *64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83c008 *8940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940f9 *8b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064803d4c000000 *007402cc09895dd08b15110000008b3d410000008b3519000000c745f00b0000058b051d000000 *8945ecc745e80b0000058b05210000008945e4c745e00b0000058b05450000008945dc64c60548 *00000004bb4000000064031d20000000643b1d240000007607e800000000eb0a64891d20000000 *83eb408d5b038bc38950fd83c0088940f98978fd83c0088940f98970fd83c0088940f98b4df089 *48fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd83c0088940f98b4de48948fd83 *c0088940f98b4de08948fd8b4ddc89480164c605480000000064803d4c000000007402cc098b55 *f48b7dd88b75d48b45d08945f0895dec64c6054800000004bb2800000064031d20000000643b1d *240000007607e800000000eb0a64891d2000000083eb288d5b038bc38950fd83c0088940f98978 *fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fdc740010b00 *000564c605480000000064803d4c000000007402cc09895df0ba0b0000058955ec8bdc83ec248b *15490000008b3d4d000000be0b0000058b45f08943f08b45ec8943ecc743e80b000005c743e40b *0000058b05510000008943e08b05550000008943dc8b0559000000b924000000896bfc8bebff50 *0573028be3ba0b0000058d65f8f88b6dfcc20400909090909090514e0841000000420000005300 *00004f0000004c000000550000005400000045000000529566050000514e084100000042000000 *530000004f0000004c00000055000000540000004500000052955d050000514e08410000004200 *0000530000004f0000004c000000550000005400000045000000529554050000514e0841000000 *42000000530000004f0000004c00000055000000540000004500000052952f050000514e084100 *000042000000530000004f0000004c000000550000005400000045000000529529050000514e08 *52000000450000004c0000004100000054000000490000005600000045000000529312616c6c6f *635f6f766572666c6f775f656278ba040000514e0852000000450000004c000000410000005400 *0000490000005600000045000000529312616c6c6f635f6f766572666c6f775f6562780a040000 *514e084100000042000000530000004f0000004c0000005500000054000000450000005295e503 *0000514e084100000042000000530000004f0000004c0000005500000054000000450000005295 *d5030000514e084100000042000000530000004f0000004c000000550000005400000045000000 *5295c5030000514e084100000042000000530000004f0000004c00000055000000540000004500 *00005295b8030000514e084100000042000000530000004f0000004c0000005500000054000000 *450000005295b2030000514e084100000042000000530000004f0000004c000000550000005400 *0000450000005295ac030000514e0852000000450000004c000000410000005400000049000000 *5600000045000000529312616c6c6f635f6f766572666c6f775f65627827030000514e08410000 *0042000000530000004f0000004c000000550000005400000045000000529502030000514e0841 *00000042000000530000004f0000004c0000005500000054000000450000005295f2020000514e *084100000042000000530000004f0000004c0000005500000054000000450000005295e2020000 *514e084100000042000000530000004f0000004c0000005500000054000000450000005295d502 *0000514e084100000042000000530000004f0000004c0000005500000054000000450000005295 *cf020000514e084100000042000000530000004f0000004c000000550000005400000045000000 *5295c9020000514e0852000000450000004c000000410000005400000049000000560000004500 *0000529312616c6c6f635f6f766572666c6f775f65627844020000514e08410000004200000053 *0000004f0000004c00000055000000540000004500000052951f020000514e0841000000420000 *00530000004f0000004c00000055000000540000004500000052950f020000514e084100000042 *000000530000004f0000004c0000005500000054000000450000005295ff010000514e08410000 *0042000000530000004f0000004c0000005500000054000000450000005295f2010000514e0841 *00000042000000530000004f0000004c0000005500000054000000450000005295ec010000514e *084100000042000000530000004f0000004c0000005500000054000000450000005295e6010000 *514e0852000000450000004c000000410000005400000049000000560000004500000052931261 *6c6c6f635f6f766572666c6f775f65627861010000514e084100000042000000530000004f0000 *004c00000055000000540000004500000052953c010000514e084100000042000000530000004f *0000004c00000055000000540000004500000052952c010000514e084100000042000000530000 *004f0000004c00000055000000540000004500000052951c010000514e08410000004200000053 *0000004f0000004c00000055000000540000004500000052950f010000514e0841000000420000 *00530000004f0000004c000000550000005400000045000000529509010000514e084100000042 *000000530000004f0000004c000000550000005400000045000000529503010000514e08520000 *00450000004c0000004100000054000000490000005600000045000000529312616c6c6f635f6f *766572666c6f775f6562787e000000514e084100000042000000530000004f0000004c00000055 *0000005400000045000000529559000000514e084100000042000000530000004f0000004c0000 *00550000005400000045000000529549000000514e084100000042000000530000004f0000004c *000000550000005400000045000000529539000000514e084100000042000000530000004f0000 *004c00000055000000540000004500000052952c000000514e084100000042000000530000004f *0000004c000000550000005400000045000000529526000000514e084100000042000000530000 *004f0000004c0000005500000054000000450000005295200000003d013f02a002000003d20403 *2c8e000000000102a102000038003f3ea202000023a000000042026f02000002250100003c2400 *23a0000000241e042403242703040305240b0428000102a20200000307022b010000031c310d01 *02a302000028010102a402000004022b010000032531050102a50200000102a60200003b04a000 *2a08000000000000000000000000000000000000000000008f45f88d65e08bdc83ec0c8b151100 *00008b0515000000b904000000896bfc8bebff500573028be364c6054800000004b80800000064 *030520000000643b05240000007607e800000000eb0a6489052000000083e8088d4007c740f93a *01000064c605480000000064803d4c000000007402cc098950fd8bd08d65f8f88b6dfcc2040090 *90909090514e0852000000450000004c0000004100000054000000490000005600000045000000 *529312616c6c6f635f6f766572666c6f775f6561785e000000514e084100000042000000530000 *004f0000004c00000055000000540000004500000052952b000000514e08410000004200000053 *0000004f0000004c0000005500000054000000450000005295250000003d013f02aa020000022b *01000004032c8e000000000102ab0200003700013f3ead020000239d0000004202ac0200000237 *0100003c026f02000002380100003c24002398000000241e042403242703040305240b04280001 *02ad0200000307023d010000031c310d0102ae02000028010102af02000004031f032531050102 *b00200000102b10200003b069d002a0a000000000000000000000000000000000000000000008f *45f88d65e08b05110000008b48fd8bc124073c0375698bc18b40fd3d0b000005742d8bd08bdc83 *ec0c8b0515000000b904000000896bfc8bebff500573028be3ba0b0000058d65f8f88b6dfcc204 *008bdc83ec0c8b15190000008bf9be270000058b051d000000b90c000000896bfc8bebff500573 *028be3ebaa9090909090cc0a02024e514e084100000042000000530000004f0000004c00000055 *000000540000004500000052957c000000514e084100000042000000530000004f0000004c0000 *0055000000540000004500000052956f000000514e084100000042000000530000004f0000004c *000000550000005400000045000000529544000000514e084100000042000000530000004f0000 *004c0000005500000054000000450000005295200000003d013f02b6020000023d01000004032c *8e000000000102b702000038003f3eb802000023a000000042026f02000002250100003c240023 *a0000000241e042403242703040305240b0428000102b80200000307022b010000031c310d0102 *b902000028010102ba02000004022b010000032531050102bb0200000102bc0200003b04a0002a *08000000000000000000000000000000000000000000008f45f88d65e08bdc83ec0c8b15110000 *008b0515000000b904000000896bfc8bebff500573028be364c6054800000004b8080000006403 *0520000000643b05240000007607e800000000eb0a6489052000000083e8088d4007c740f93a01 *000064c605480000000064803d4c000000007402cc098950fd8bd08d65f8f88b6dfcc204009090 *909090514e0852000000450000004c000000410000005400000049000000560000004500000052 *9312616c6c6f635f6f766572666c6f775f6561785e000000514e08410000004200000053000000 *4f0000004c00000055000000540000004500000052952b000000514e0841000000420000005300 *00004f0000004c0000005500000054000000450000005295250000003d013f02c0020000022b01 *000004032c8e000000000102c10200003700013f3ec3020000247d4202c2020000026f02000002 *380100003c24002478241e042403242703040305240b0428000102c302000003070309023a0100 *00030a026f020000120102c4020000120102c5020000120102c6020000031c310d0102c7020000 *28010102c802000004031f032531050102c90200000102ca0200003b057d002a0a000000000000 *000000000000000000000000000000008f45f88d65e08b05110000008b48fd8bc124073c037549 *8bc18b40fd3d0b00000575298bdc83ec0c8b15150000008bf9be270000058b0519000000b90c00 *0000896bfc8bebff500573028be3ba0b0000058d65f8f88b6dfcc204009090909090cc0a02024e *514e084100000042000000530000004f0000004c00000055000000540000004500000052954f00 *0000514e084100000042000000530000004f0000004c0000005500000054000000450000005295 *42000000514e084100000042000000530000004f0000004c000000550000005400000045000000 *5295200000003d013f02ce02000002c602000004032c8e000000000102cf02000038003f3ed002 *000023b80200004203b003b103b203b303b403b903ba03bc0b8505590000004500000041000000 *530000005400000003c903ba03b1120102d1020000240004240c0352035531050102d202000003 *cd3c240023b8020000241e042403242703040305240c0428000102d3020000030703d2031c310d *0102d402000028010102d502000004031f032531050102d60200000102d70200003b0fb8022a14 *000000000000000000000000000000000000000000008f45f88d65c08b15110000008b3d150000 *008b3519000000c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4 *c745e00b0000058b05250000008945dc64c6054800000004bb4000000064031d20000000643b1d *240000007607e800000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978 *fd83c0088940f98970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940 *f98b4de88948fd83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c6 *05480000000064803d4c000000007402cc09895df48b15110000008b3d290000008b3519000000 *c745f00b0000058b051d0000008945ecc745e80b0000058b05210000008945e4c745e00b000005 *8b052d0000008945dc64c6054800000004bb4000000064031d20000000643b1d240000007607e8 *00000000eb0a64891d2000000083eb408d5b038bc38950fd83c0088940f98978fd83c0088940f9 *8970fd83c0088940f98b4df08948fd83c0088940f98b4dec8948fd83c0088940f98b4de88948fd *83c0088940f98b4de48948fd83c0088940f98b4de08948fd8b4ddc89480164c605480000000064 *803d4c000000007402cc098bfb8b55f464c6054800000004bb1000000064031d20000000643b1d *240000007607e800000000eb0a64891d2000000083eb108d5b038bc38950fd83c0088940f98978 *fdc740010b00000564c605480000000064803d4c000000007402cc09895df0ba0b0000058955ec *8bdc83ec248b15310000008b3d35000000be0b0000058b45f08943f08b45ec8943ecc743e80b00 *0005c743e40b0000058b05390000008943e08b053d0000008943dc8b0541000000b92400000089 *6bfc8bebff500573028be3ba0b0000058d65f8f88b6dfcc204009090909090514e084100000042 *000000530000004f0000004c00000055000000540000004500000052958f020000514e08410000 *0042000000530000004f0000004c000000550000005400000045000000529586020000514e0841 *00000042000000530000004f0000004c00000055000000540000004500000052957d020000514e *084100000042000000530000004f0000004c000000550000005400000045000000529558020000 *514e084100000042000000530000004f0000004c00000055000000540000004500000052955202 *0000514e0852000000450000004c00000041000000540000004900000056000000450000005293 *12616c6c6f635f6f766572666c6f775f65627804020000514e0852000000450000004c00000041 *00000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f775f6562 *7861010000514e084100000042000000530000004f0000004c0000005500000054000000450000 *0052953c010000514e084100000042000000530000004f0000004c000000550000005400000045 *00000052952c010000514e084100000042000000530000004f0000004c00000055000000540000 *004500000052951c010000514e084100000042000000530000004f0000004c0000005500000054 *0000004500000052950f010000514e084100000042000000530000004f0000004c000000550000 *005400000045000000529509010000514e084100000042000000530000004f0000004c00000055 *0000005400000045000000529503010000514e0852000000450000004c00000041000000540000 *00490000005600000045000000529312616c6c6f635f6f766572666c6f775f6562787e00000051 *4e084100000042000000530000004f0000004c0000005500000054000000450000005295590000 *00514e084100000042000000530000004f0000004c000000550000005400000045000000529549 *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *9539000000514e084100000042000000530000004f0000004c0000005500000054000000450000 *0052952c000000514e084100000042000000530000004f0000004c000000550000005400000045 *000000529526000000514e084100000042000000530000004f0000004c00000055000000540000 *00450000005295200000003d013f02ec02000003d204032c8e000000000102ed02000038003f3e *ee02000023a00000004202d002000002250100003c240023a0000000241e042403242703040305 *240c0428000102ee0200000307022b010000031c310d0102ef02000028010102f002000004022b *010000032531050102f10200000102f20200003b04a0002a080000000000000000000000000000 *00000000000000008f45f88d65e08bdc83ec0c8b15110000008b0515000000b904000000896bfc *8bebff500573028be364c6054800000004b80800000064030520000000643b05240000007607e8 *00000000eb0a6489052000000083e8088d4007c740f93a01000064c605480000000064803d4c00 *0000007402cc098950fd8bd08d65f8f88b6dfcc204009090909090514e0852000000450000004c *0000004100000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f *775f6561785e000000514e084100000042000000530000004f0000004c00000055000000540000 *004500000052952b000000514e084100000042000000530000004f0000004c0000005500000054 *000000450000005295250000003d013f02f6020000022b01000004032c8e000000000102f70200 *003700013f3ef9020000239d0000004202f802000002370100003c02d002000002380100003c24 *002398000000241e042403242703040305240c0428000102f90200000307023d010000031c310d *0102fa02000028010102fb02000004031f032531050102fc0200000102fd0200003b069d002a0a *000000000000000000000000000000000000000000008f45f88d65e08b05110000008b48fd8bc1 *24073c0375698bc18b40fd3d0b000005742d8bd08bdc83ec0c8b0515000000b904000000896bfc *8bebff500573028be3ba0b0000058d65f8f88b6dfcc204008bdc83ec0c8b15190000008bf9be27 *0000058b051d000000b90c000000896bfc8bebff500573028be3ebaa9090909090cc0a02024e51 *4e084100000042000000530000004f0000004c00000055000000540000004500000052957c0000 *00514e084100000042000000530000004f0000004c00000055000000540000004500000052956f *000000514e084100000042000000530000004f0000004c00000055000000540000004500000052 *9544000000514e084100000042000000530000004f0000004c0000005500000054000000450000 *005295200000003d013f0202030000023d01000004032c8e0000000001020303000038003f3e04 *03000023a00000004202d002000002250100003c240023a0000000241e04240324270304030524 *0c0428000102040300000307022b010000031c310d010205030000280101020603000004022b01 *0000032531050102070300000102080300003b04a0002a08000000000000000000000000000000 *000000000000008f45f88d65e08bdc83ec0c8b15110000008b0515000000b904000000896bfc8b *ebff500573028be364c6054800000004b80800000064030520000000643b05240000007607e800 *000000eb0a6489052000000083e8088d4007c740f93a01000064c605480000000064803d4c0000 *00007402cc098950fd8bd08d65f8f88b6dfcc204009090909090514e0852000000450000004c00 *00004100000054000000490000005600000045000000529312616c6c6f635f6f766572666c6f77 *5f6561785e000000514e084100000042000000530000004f0000004c0000005500000054000000 *4500000052952b000000514e084100000042000000530000004f0000004c000000550000005400 *0000450000005295250000003d013f020c030000022b01000004032c8e0000000001020d030000 *3700013f3e0f030000247d42020e03000002d002000002380100003c24002478241e0424032427 *03040305240c04280001020f03000003070309023a010000030a02d00200001201021003000012 *01021103000012010212030000031c310d010213030000280101021403000004031f0325310501 *02150300000102160300003b057d002a0a00000000000000000000000000000000000000000000 *8f45f88d65e08b05110000008b48fd8bc124073c0375498bc18b40fd3d0b00000575298bdc83ec *0c8b15150000008bf9be270000058b0519000000b90c000000896bfc8bebff500573028be3ba0b *0000058d65f8f88b6dfcc204009090909090cc0a02024e514e084100000042000000530000004f *0000004c00000055000000540000004500000052954f000000514e084100000042000000530000 *004f0000004c000000550000005400000045000000529542000000514e08410000004200000053 *0000004f0000004c0000005500000054000000450000005295200000003d013f021a0300000212 *03000004032c8e0000000001021b030000380004042b0d00000010000020004e005000ce00e400 *fa009701bf029f037b04e8048e0501021c0300002400220542820ec80001021d03000022052481 *0ec80001021e03000003524e0446000000490000004c00000045000000510b080c440000004500 *00004200000055000000470000002d000000530000004f00000055000000520000004300000045 *0000005203100313031728030102210300002403240924002d0102220300003109010223030000 *010224030000cc16030000020000000224030000cc08030000020000000224030000ccfd020000 *020000000224030000ccf2020000020000000224030000ccd7020000020000000224030000ccca *020000020000000224030000ccbc020000020000000224030000ccb10200000200000002240300 *00cca6020000020000000224030000cc76020000020000000224030000cc650200000200000002 *24030000cc57020000020000000224030000cc4c020000020000000224030000cc410200000200 *00000224030000cc1f020000020000000224030000cc11020000020000000224030000cc030200 *00020000000224030000ccf8010000020000000224030000cced010000020000000224030000cc *cb010000020000000224030000ccb9010000020000000224030000ccab01000002000000022403 *0000cca0010000020000000224030000cc95010000020000000224030000cc7301000002000000 *0224030000cc5a010000020000000224030000cc4c010000020000000224030000cc4101000002 *0000000224030000cc2f010000020000000224030000ccd6000000020000000224030000cca600 *0000020000000224030000cc8f000000020000000224030000cc7b000000020000000224030000 *cc62000000020000000224030000cc43000000020000000224030000cc36000000020000000224 *030000cc27000000020000003f3e2503000040 hunk ./code/brew-recipe.lisp 1 - +(asdf:oos 'asdf:load-op :clsql) +(asdf:operate 'asdf:load-op :clsql-postgresql) + +(defpackage brew-db + (:use common-lisp) + (:use clsql) + (:export style master-recipe recipe-revision + hop grain yeast)) + +(in-package brew-db) + +(use-package 'clsql) + +#.(locally-enable-sql-reader-syntax) + +(defvar *connection* (connect '("" "homebrew" "clinton" "") + :database-type :postgresql + :if-exists :old)) + +(def-view-class style () + ((id :type integer :db-kind :key :initarg :id) + (name :type varchar :initarg :name) + (og-low :type float :initarg :og-low) + (og-high :type float :initarg :og-high) + (fg-low :type float :initarg :fg-low) + (fg-high :type float :initarg :fg-high) + (ibu-low :type integer :initarg :ibu-low) + (ibu-high :type integer :initarg :ibu-high) + (srm-low :type integer :initarg :srm-low) + (srm-high :type integer :initarg :srm-high))) + +(def-view-class master-recipe () + ((name :type (varchar 64) :db-kind :key) + (description :type varchar) + (style :db-kind :join + :db-info (:join-class style + :home-key style-id + :foreign-key id + :set nil)))) + +(def-view-class recipe-revision () + ((id :type integer :db-kind :key) + (recipe :db-kind :join + :db-info (:join-class master-recipe + :home-key recipe-name + :foreign-key name)) + (revision :type integer))) + +(def-view-class hop () + ((id :type integer :db-kind :key) + (name :type varchar) + (alpha :type float))) + +(def-view-class grain () + ((id :initarg :id :type integer :db-kind :key) + (name :initarg :name :type varchar) + (color :initarg :color :type integer) + (extract :initarg :extract :type float) + (use :initarg :use :type (varchar 64)))) + +(def-view-class yeast () + ((id :type integer :db-kind :key) + (name :type varchar))) hunk ./code/qbrew.lisp 1 +;;; TODO: +;;; - Error Checking + +(asdf:oos 'asdf:load-op :cxml) +(asdf:oos 'asdf:load-op :xmls) +(asdf:oos 'asdf:load-op :xmls-tools) +(asdf:oos 'asdf:load-op :parse-number) + +(defpackage qbrew + (:use common-lisp) + (:use brew-db) + (:use xmls-tools) + (:use parse-number) + (:export qbrewdata->brew-db)) + +(in-package qbrew) + +(defun read-recipe (file-path) + (cxml:parse-file file-path + (cxml:make-whitespace-normalizer + (cxml-xmls:make-xmls-builder)) + :validate nil)) + +(defun read-data (file-path) + (cxml:parse-file file-path + (cxml:make-whitespace-normalizer + (cxml-xmls:make-xmls-builder)) + :validate nil)) + +(defun parse-data (data) + "Parse data read by read-data. Returns a list of brew-db: view objects" + (let ((styles + (mapcar + #'(€ô¦¦†ëlambda (style) + (make-instance 'style + :name (car (last style)) ; this works but is evil + :og-low (parse-number + (get-attr-value "oglow" style)) + :og-high (parse-number + (get-attr-value "oghigh" style)) + :fg-low (parse-number + (get-attr-value "fglow" style)) + :fg-high (parse-number + (get-attr-value "fghigh" style)) + :srm-low (parse-number + (get-attr-value "srmlow" style)) + :srm-high (parse-number + (get-attr-value "srmhigh" style)) + :ibu-low (parse-number + (get-attr-value "ibulow" style)) + :ibu-high (parse-number + (get-attr-value "ibuhigh" style)))) + (find-all-children (find-subtree data '("styles")) "style"))) + (hops + (mapcar #'(€ô¦¦†ëlambda (hop) + (make-instance 'hop + :alpha (float (parse-real-number + (get-attr-value "alpha" hop))) + :name (car (last hop)))) + (find-all-children (find-subtree data '("hops")) "hop"))) + (grains + (mapcar #'(€ô¦¦†ëlambda (grain) + (make-instance 'grain + :extract (parse-number + (get-attr-value "extract" grain)) + :color (float (parse-real-number + (get-attr-value "color" grain))) + :use (string-downcase + (get-attr-value "use" grain)) + :name (car (last grain)))) + (find-all-children (find-subtree data '("grains")) "grain"))) + (yeast + (delete-if #'not + (mapcar #'(€ô¦¦†ëlambda (misc) + (let ((notes (get-attr-value "notes" misc))) + (cond ((or (string= notes "package") + (string= notes "smack pack")) + (make-instance 'yeast + :name (car (last misc)))) + (t nil)))) + (find-all-children (find-subtree data '("miscingredients")) + "miscingredient"))))) + (list (cons :styles styles) + (cons :hops hops) + (cons :grains grains) + (cons :yeast yeast)))) + +(defun qbrewdata->brew-db (file-path) + "Parse qbrewdata and return a list of lists of styles, hops, grains, + and yeast as brew-db: view objects" + (parse-data (read-data file-path))) hunk ./schema.sql 1 - +-- Homebrew recipe log database +-- TODO +-- - Separate recipe revisions and brew days +-- - Clean up the database structure +-- - More fields (basically everything that beerxml does) + +CREATE TABLE style +( + id SERIAL, + name text, + og_low real, + og_high real, + fg_low real, + fg_high real, + ibu_low integer, + ibu_high integer, + srm_low integer, -- °L/SRM + srm_high integer, + PRIMARY KEY (id) +); + +-- A master recipe just stores the name and basic description of the +-- recipe, and serves as the top level for recipe revisions which +-- contain the actual steps. All recipe_ids in the other tables refer +-- to the revision. + +CREATE TABLE master_recipe +( + name VARCHAR (64) UNIQUE NOT NULL, + description TEXT, + style_id integer, + PRIMARY KEY (name), + FOREIGN KEY (style_id) REFERENCES style (id) +); + +-- A recipe steps consists of a revision, a set of steps (e.g. "Steep +-- grain at 160F for 30 Minutes"), ingredients (split into +-- hops/grains/yeast/misc), and notes (split into recipe/batch [brew +-- day, during fermentation, bottle day], and tasting with timestamps +-- added to each [e.g. to note how the fermentation is going two or +-- three times, or to add tasting notes for a large beer when it is +-- fresh and after it has aged]). + +CREATE TABLE recipe_revision +( + id SERIAL, + recipe_name VARCHAR (64) NOT NULL, + revision INTEGER, + batch_size real, -- liters + boil_size real, -- liters (for the boil) + og real, -- actual original gravity + fg real, -- actual final gravity + PRIMARY KEY (id), + UNIQUE (recipe_name, revision), + FOREIGN KEY (recipe_name) REFERENCES master_recipe (name) +); + +CREATE TABLE recipe_step +( + recipe_id integer, + step integer, + direction text, + UNIQUE (recipe_id, step), + FOREIGN KEY (recipe_id) REFERENCES recipe_revision (id) +); + +CREATE TABLE recipe_hop +( + recipe_id integer, + hop_id integer, + quantity real, -- kg + alpha real, -- actual AA% of hop used + time time, -- addition time + FOREIGN KEY (recipe_id) REFERENCES recipe_revision (id), + FOREIGN KEY (hop_id) REFERENCES hop (id) +); + +CREATE TABLE recipe_grain +( + recipe_id integer, + grain_id integer, + quantity real, -- kg + yield real, -- % actual yield (if steeped or mashed, nil if extract) + FOREIGN KEY (recipe_id) REFERENCES recipe_revision (id), + FOREIGN KEY (grain_id) REFERENCES grain (id) +); + +CREATE TABLE recipe_yeast +( + recipe_id integer, + yeast_id integer, + attenuation real, -- % actual attenuation + FOREIGN KEY (recipe_id) REFERENCES recipe_revision (id), + FOREIGN KEY (yeast_id) REFERENCES yeast (id) +); + +CREATE TABLE recipe_note +( + recipe_id integer, + type varchar (32), -- recipe, batch, fermentation, bottling, + -- tasting + note text, + when timestamp, + FOREIGN KEY (recipe_id) REFERENCES recipe_revision (id) +); + +CREATE TABLE hop +( + id SERIAL, + name text, + alpha real, -- AA% + form varchar (32), -- pellet/plug/whole + PRIMARY KEY (id) +); + +CREATE TABLE grain +( + id SERIAL, + name text, + color real, -- °L + extract real, -- max gravity of 1kg/1L water + use varchar (64), -- TODO: use_id + uses table + PRIMARY KEY (id) +); + +CREATE TABLE yeast +( + id SERIAL, + name text, + attenuation_min real, -- % attenuation + attenuation_max real, -- % attenuation + temp_min real, -- ° C + temp_max real, -- ° C + PRIMARY KEY (id) +); hunk ./test.lisp 1 - +(load "code/brew-db.lisp") +(load "code/qbrew.lisp") +(load "code/brew-import.lisp") }