mediainfo-ruby 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig ADDED
Binary file
data/Manifest ADDED
@@ -0,0 +1,8 @@
1
+ Manifest
2
+ README.rdoc
3
+ Rakefile
4
+ ext/mediainfo_ruby/extconf.rb
5
+ ext/mediainfo_ruby/mediainfo_ruby.cpp
6
+ lib/mediainfo-ruby.rb
7
+ spec/fixtures/README
8
+ spec/mediainfo_spec.rb
data/README.rdoc ADDED
@@ -0,0 +1,40 @@
1
+ = MediaInfo-Ruby
2
+
3
+ == About MediaInfo-Ruby
4
+
5
+ MediaInfo-Ruby is a gem to use the mediainfolib libraries from http://mediainfo.sourceforge.net directly.
6
+
7
+ == Building MediaInfo-Ruby
8
+
9
+ To build, simply make sure you have built mediainfolib and the rice gem (mediainfolib is in c++) and installed them successfully, and also make sure the sources are in a place where the gem can get to them (/usr/local/src/mediainfolib is a good choice), then do:
10
+
11
+ gem install mediainfo-ruby
12
+
13
+ == Running the specs
14
+
15
+ If you do development on this gem, to test that it built correctly, put some videos on spec/fixtures and run the specs.
16
+
17
+ == Using MediaInfo-Ruby
18
+
19
+ Using MediaInfo-Ruby is simple. Just initialize the MediaInfoLib::MediaInfo class and start poking around:
20
+
21
+ # load the library
22
+ require 'mediainfo-ruby'
23
+
24
+ mediainfo = MediaInfoLib::MediaInfo.new
25
+ mediainfo.open("/path/to/my/video.mov")
26
+ begin
27
+ mediainfo.streams # 2
28
+ mediainfo.option_definitions # A giant map with instructions on each option
29
+ mediainfo.introspect # Asks and returns a giant map with all the options
30
+ finally
31
+ mediainfo.close
32
+ end
33
+
34
+ We'll add more rubyisms as we feel they are needed, but so far that's all. You can go lower level and call the MediaInfo library directly by using the methods that have been surfaced (option, state_get, count_get, etc)
35
+
36
+ == Mac OSX notes
37
+
38
+ If you have a pre-snow leopard OSX, you need to remove the x86_64 archflags that the extconf.rb adds. Patches appreciated.
39
+
40
+ Building mediainfolib on OSX is a bit challenging. I went the CMake route and had to do some changes. It worked but it put the libs directly on /usr/local (not on /usr/local/lib) and it didn't put any includes on /usr/local/include. I manually moved the libraries to /usr/local/lib and added code to check for the mediainfolib directory on /usr/local/src. It also listens to the environment variable MEDIAINFO_DIR which it uses to find its header files.
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new("mediainfo-ruby", "0.1.4") do |p|
6
+ p.description = "MediaInfo Ruby Bridge. Call MediaInfo lib directly"
7
+ p.url = "http://github.com/hackerdude/mediainfo-ruby"
8
+ p.author = "David Martinez"
9
+ p.ignore_pattern = ["tmp/*", "script/*", "pkg/*"]
10
+ p.dependencies = ["rice"] # TODO How to do native dependencies?
11
+ p.require_signed = true
12
+ end
13
+
14
+
15
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each{|ext| load ext }
16
+
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'mkmf-rice'
4
+
5
+ #require 'ruby-debug'
6
+ #Debugger.start
7
+
8
+ if RUBY_PLATFORM == "universal-darwin10.0"
9
+ # TODO Set the archflags to -arch x86_64 ONLY if it's a 64-bit snow leopard machine.
10
+ ENV['ARCHFLAGS'] = "-arch x86_64"
11
+ #$CFLAGS.sub!("-arch x86_64", "")
12
+ end
13
+
14
+ MEDIAINFO_HEADER_FILE="MediaInfoDLL/MediaInfoDLL_Static.h"
15
+
16
+ HEADER_DIRS = [
17
+ "#{ENV['MEDIAINFO_DIR']}/Source",
18
+ '/usr/local/src/mediainfolib/Source',
19
+ '/opt/local/include',
20
+ '/usr/local/include',
21
+ '/usr/include'
22
+ ]
23
+ HEADER_DIRS.shift if ENV['MEDIAINFO_DIR'].nil?
24
+
25
+ LIB_DIRS = [
26
+ "#{ENV['MEDIAINFO_DIR']}/Source",
27
+ '/opt/local/lib',
28
+ '/usr/local/lib',
29
+ '/usr/local', # For whatever reason, building mediainfo on Mac OSX put it here.
30
+ '/usr/lib'
31
+ ]
32
+ LIB_DIRS.shift if ENV['MEDIAINFO_DIR'].nil?
33
+ dir_config("mediainfo", HEADER_DIRS, LIB_DIRS)
34
+ have_library("stdc++")
35
+ have_header "MediaInfoDLL/MediaInfoDLL_Static.h"
36
+ have_library("mediainfo", "MediaInfo_New", ['string.h', MEDIAINFO_HEADER_FILE])
37
+
38
+ create_makefile('mediainfo_ruby')
39
+
@@ -0,0 +1,65 @@
1
+
2
+ #include "rice/Class.hpp"
3
+ #include "rice/Data_Type.hpp"
4
+ #include "rice/Constructor.hpp"
5
+ #include "rice/Enum.hpp"
6
+ #include "rice/Module.hpp"
7
+
8
+ #include <string.h>
9
+ #include <MediaInfoDLL/MediaInfoDLL.h>
10
+ #define MediaInfoNameSpace MediaInfoDLL
11
+
12
+ using namespace Rice;
13
+ using namespace MediaInfoNameSpace;
14
+
15
+ extern "C" void Init_mediainfo_ruby()
16
+ {
17
+ //printf( "Dude!\n");
18
+ //define_module("MediaInfoLib").
19
+ define_enum<stream_t>("MediaInfoLib_StreamKind")
20
+ .define_value("General", Stream_General)
21
+ .define_value("Video", Stream_Video)
22
+ .define_value("Audio", Stream_Audio)
23
+ .define_value("Text", Stream_Text)
24
+ .define_value("Chapters", Stream_Chapters)
25
+ .define_value("Image", Stream_Image)
26
+ .define_value("Menu", Stream_Menu)
27
+ .define_value("Max", Stream_Max)
28
+ ;
29
+
30
+ //define_module("MediaInfo").
31
+ define_enum<info_t>("MediaInfoLib_InfoKind")
32
+ .define_value("Name", Info_Name)
33
+ .define_value("Text", Info_Text)
34
+ .define_value("Measure", Info_Measure)
35
+ .define_value("Options", Info_Options)
36
+ .define_value("Name_Text", Info_Name_Text)
37
+ .define_value("Measure_Text", Info_Measure_Text)
38
+ .define_value("Info", Info_Info)
39
+ .define_value("HowTo", Info_HowTo)
40
+ //.define_value("Domain", Info_Domain)
41
+ .define_value("Max", Info_Max)
42
+ ;
43
+ //define_class<File__Analyze>("File__Analyze")
44
+ //;
45
+ typedef std::string(MediaInfo::*get_info)(stream_t,size_t,size_t,info_t);
46
+ typedef std::string(MediaInfo::*get_info_somewhere)(stream_t, size_t,const std::string,info_t,info_t);
47
+ typedef std::string(MediaInfo::*get_info_string)(stream_t StreamKind, size_t StreamNumber, const std::string &Parameter, info_t InfoKind, info_t SearchKind);
48
+
49
+
50
+ define_module("MediaInfoLib").
51
+ define_class<MediaInfo>("MediaInfo")
52
+ .define_constructor(Constructor<MediaInfo>())
53
+ .define_method("_inform", &MediaInfo::Inform)
54
+ .define_method("option", &MediaInfo::Option)
55
+ .define_method("open", &MediaInfo::Open)
56
+ .define_method("close", &MediaInfo::Close)
57
+ .define_method("state_get", &MediaInfo::State_Get)
58
+ .define_method("count_get", &MediaInfo::Count_Get)
59
+ .define_method("get", get_info(&MediaInfo::Get))
60
+ // TODO Enabling this breaks with "address of overloaded function with no contextual type information".. Signature doesn't match
61
+ .define_method("get_value", get_info_string(&MediaInfo::Get))
62
+ //.define_method("_count_get", &MediaInfo::Count_Get)
63
+ ;
64
+ //printf( "OK so at least MediaInfo is initialized now\n");
65
+ }
@@ -0,0 +1,107 @@
1
+ # Load the C++ library.
2
+ $:.unshift "#{File.dirname(__FILE__)}/../ext/mediainfo_ruby/"
3
+
4
+ puts "Loading mediainfo"
5
+ require "mediainfo_ruby"
6
+
7
+ module MediaInfoRubyisms_Streams
8
+ # A symbol map to translate from the Rubyisms we use on mediainfo-ruby
9
+ # to the constants libmediainfo uses.
10
+ StreamKindSymbolsMap = {
11
+ :general=>MediaInfoLib_StreamKind::General,
12
+ :video=>MediaInfoLib_StreamKind::Video,
13
+ :audio=>MediaInfoLib_StreamKind::Audio,
14
+ :text=>MediaInfoLib_StreamKind::Text,
15
+ :chapters=>MediaInfoLib_StreamKind::Chapters,
16
+ :image=>MediaInfoLib_StreamKind::Image,
17
+ :menu=>MediaInfoLib_StreamKind::Menu,
18
+ :max=>MediaInfoLib_StreamKind::Max
19
+ }
20
+
21
+ # Call inform and remove the DOS-linefeeds. Useful for quick printout
22
+ # of a bunch of media information
23
+ def inform
24
+ self._inform.split("\r")
25
+ end
26
+
27
+ # Returns how many streams in total this file has.
28
+ def streams; self.count_get(MediaInfoLib_StreamKind::General, -1) ; end
29
+
30
+ # Returns how many streams are audio streams
31
+ def audio_streams ; self.count_get(MediaInfoLib_StreamKind::Audio, -1) ; end
32
+
33
+ # Returns how many streams are video streams
34
+ def video_streams ; self.count_get(MediaInfoLib_StreamKind::Video, -1); end
35
+
36
+ # Returns how many streams are chapter streams
37
+ def chapter_streams ; self.count_get(MediaInfoLib_StreamKind::Chapters, -1); end
38
+
39
+ # Returns how many streams are image streams
40
+ def image_streams ; self.count_get(MediaInfoLib_StreamKind::Image, -1); end
41
+
42
+ # Returns how many streams are menu streams
43
+ def menu_streams ; self.count_get(MediaInfoLib_StreamKind::Menu, -1); end
44
+
45
+ # Returns a map of all the possible option definitions,
46
+ # where the key is the option we can ask for and the
47
+ # value is the help for that option.
48
+ # By default, anything marked as deprecated in the underlying
49
+ # library is removed.
50
+ def option_definitions(remove_deprecated=true)
51
+ option_map = {}
52
+ current = :general
53
+ switching = true
54
+ current_map = option_map[:general]
55
+ option_defs = self.option("Info_Parameters_CSV", "").split("\r").each{|row|
56
+ if row.strip == ""
57
+ switching = true
58
+ else
59
+ kv = row.split(";")
60
+ if kv.length == 1 && switching
61
+ topic = kv[0].downcase.to_sym
62
+ current_map = option_map[topic]
63
+ if current_map.nil?
64
+ option_map[topic] = current_map = {}
65
+ end
66
+ switching = false
67
+ else
68
+ current_map[kv[0]] = kv[1] unless remove_deprecated && kv[1].nil? ? false : kv[1].include?("Deprecated")
69
+ end
70
+ end
71
+ }
72
+ option_map
73
+ end
74
+
75
+ # It introspects a video. This means returning a map of all the
76
+ # values for a definition. By default empty values are not returned.
77
+ # Send with true to return empty values
78
+ def introspect(empty_values=false,include_inform=false)
79
+ results = {}
80
+ self.option_definitions.each{|topic, topic_parameters|
81
+ kind_constant = StreamKindSymbolsMap[topic]
82
+ if ! kind_constant.nil?
83
+ results[topic] = {}
84
+ topic_parameters.each{|key, value|
85
+ # TODO Do this for multiple streams and whatnot?
86
+ #debugger if topic == :video && self.video_streams > 0
87
+ value = self.get_value(kind_constant, 0, key, MediaInfoLib_InfoKind::Text, MediaInfoLib_InfoKind::Name)
88
+
89
+ if empty_values == true || value.length > 0
90
+ results[topic][key] = value
91
+ end
92
+ if key == "Inform"
93
+ results[topic].delete(key) if ! include_inform
94
+ end
95
+ # self.get(kind_constant, 1,0, key) # Something like this
96
+ }
97
+ end
98
+ }
99
+ results
100
+ end
101
+
102
+ end
103
+
104
+ class MediaInfoLib::MediaInfo
105
+ include(MediaInfoRubyisms_Streams)
106
+ end
107
+
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{mediainfo-ruby}
5
+ s.version = "0.1.4"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["David Martinez"]
9
+ s.cert_chain = ["/Users/david/.ssh/gem-public_cert.pem"]
10
+ s.date = %q{2010-07-15}
11
+ s.description = %q{MediaInfo Ruby Bridge. Call MediaInfo lib directly}
12
+ s.email = %q{}
13
+ s.extensions = ["ext/mediainfo_ruby/extconf.rb"]
14
+ s.extra_rdoc_files = ["README.rdoc", "ext/mediainfo_ruby/extconf.rb", "ext/mediainfo_ruby/mediainfo_ruby.cpp", "lib/mediainfo-ruby.rb"]
15
+ s.files = ["Manifest", "README.rdoc", "Rakefile", "ext/mediainfo_ruby/extconf.rb", "ext/mediainfo_ruby/mediainfo_ruby.cpp", "lib/mediainfo-ruby.rb", "spec/fixtures/README", "spec/mediainfo_spec.rb", "mediainfo-ruby.gemspec"]
16
+ s.homepage = %q{http://github.com/hackerdude/mediainfo-ruby}
17
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Mediainfo-ruby", "--main", "README.rdoc"]
18
+ s.require_paths = ["lib", "ext"]
19
+ s.rubyforge_project = %q{mediainfo-ruby}
20
+ s.rubygems_version = %q{1.3.7}
21
+ s.signing_key = %q{/Users/david/.ssh/gem-private_key.pem}
22
+ s.summary = %q{MediaInfo Ruby Bridge. Call MediaInfo lib directly}
23
+
24
+ if s.respond_to? :specification_version then
25
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
+ s.specification_version = 3
27
+
28
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
29
+ s.add_runtime_dependency(%q<rice>, [">= 0"])
30
+ else
31
+ s.add_dependency(%q<rice>, [">= 0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<rice>, [">= 0"])
35
+ end
36
+ end
@@ -0,0 +1 @@
1
+ Put some videos here, then run the spec to try it out!
@@ -0,0 +1,61 @@
1
+ require "#{File.dirname(__FILE__)}/../lib/mediainfo-ruby"
2
+ describe MediaInfoLib::MediaInfo do
3
+ VIDEO_FIXTURES = "#{File.dirname(__FILE__)}/fixtures"
4
+
5
+ before(:all) do
6
+ @video_files = Dir.new(VIDEO_FIXTURES).collect{|f|
7
+ f unless f[0..0] == "." || f.include?(".swf") || f.include?("flv")
8
+ }.compact
9
+ if @video_files.length == 0
10
+ puts "Please put some video files on spec/fixtures to test"
11
+ end
12
+ end
13
+ context "When getting video files" do
14
+ before(:each) do
15
+ @mediainfo = MediaInfoLib::MediaInfo.new
16
+ end
17
+ after(:each) do
18
+ @mediainfo.close
19
+ end
20
+ it "Can open local files" do
21
+ @video_files.each{|video|
22
+ @mediainfo.open("#{VIDEO_FIXTURES}/#{video}").should > 0
23
+ @mediainfo.inform.length.should > 0
24
+ }
25
+ end
26
+ it "Can get info from files" do
27
+ @video_files.each{|video|
28
+ @mediainfo.open("#{VIDEO_FIXTURES}/#{video}").should > 0
29
+ @mediainfo.streams.should > 0
30
+ @mediainfo.streams.should < 1000
31
+ #@mediainfo.get(MediaInfoLib_StreamKind::General,1,0,MediaInfoLib_InfoKind::Name).should_not be_nil
32
+ }
33
+ end
34
+ it "Can get the option definitions for a file" do
35
+ definitions = @mediainfo.option_definitions
36
+ [:general, :audio, :video, :text, :chapters, :menu, :text, :image].each{|topic|
37
+ # All these topics should be there
38
+ definitions.keys.should include(topic)
39
+ # All these topics should have more than one item
40
+ definitions[topic].keys.length.should > 0
41
+ }
42
+ #pp definitions
43
+ end
44
+ it "Can get the Media Info values for a file" do
45
+ @video_files.each{|video|
46
+ @mediainfo.open("#{VIDEO_FIXTURES}/#{video}").should > 0
47
+ values = @mediainfo.introspect
48
+ #puts "Streams for #{video}: Video:#{@mediainfo.video_streams} Audio:#{@mediainfo.audio_streams} Image:#{@mediainfo.image_streams}"
49
+ if @mediainfo.video_streams > 0
50
+ [:general, :audio, :video, :text, :chapters, :menu, :text, :image].each{|topic| values.should include(topic)}
51
+ # TODO Spot check some topics.
52
+ values[:general].keys.length.should > 0
53
+ values[:general]["CodecID"].should_not be_nil
54
+ values[:general]["CodecID"].should_not include("TODO")
55
+ #pp values
56
+ end
57
+ }
58
+ end
59
+ end
60
+
61
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mediainfo-ruby
3
+ version: !ruby/object:Gem::Version
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 4
10
+ version: 0.1.4
11
+ platform: ruby
12
+ authors:
13
+ - David Martinez
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain:
17
+ - |
18
+ -----BEGIN CERTIFICATE-----
19
+ MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMQ4wDAYDVQQDDAVkYXZp
20
+ ZDEaMBgGCgmSJomT8ixkARkWCmhhY2tlcmR1ZGUxEzARBgoJkiaJk/IsZAEZFgNj
21
+ b20wHhcNMTAwNzE1MTU0OTA4WhcNMTEwNzE1MTU0OTA4WjBBMQ4wDAYDVQQDDAVk
22
+ YXZpZDEaMBgGCgmSJomT8ixkARkWCmhhY2tlcmR1ZGUxEzARBgoJkiaJk/IsZAEZ
23
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZQOBPpc0c8HXH
24
+ shEk6kmOM7oJQMXTEbvaDgPrd4ZOQ2KWWIcrxb7kPlUzZJHXITzFylrNt7NRI3it
25
+ hZbhKaeN4EcRa5Sfeuzy21vXq37An/8DCVTEyNTrtB7eQlflb7DHGuTWx3ePfEnP
26
+ zJmC3CDk2mcbp1BSUQZtVB7p475whLTRFtjT7J0CItLIW8hZ1WAlMKGImcWM8Wst
27
+ 9KZZ9uWFMhvPpfLQMZ4P2MjUqjHItOgprkAKH7JueckMygD93pSxLydPkE7HPXaG
28
+ 5cY9UyW6JNfq0H3jvGYDAnXIKvf6sff5dtsSK/4wqqa8SRykshBvV1V3iMNcEKwo
29
+ aWqYKGppAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
30
+ BBSRlEGvaFh8owplxLanNW/kvZQpIjANBgkqhkiG9w0BAQUFAAOCAQEA022Ytoga
31
+ jUkbKpdZHE7Ri/aUtF7ObVfXIKr/MH/auHlBtb6wn24MThgK1pxI4Nvk17gsnnlg
32
+ Ve5/nH9boX9DRPO59kEi2gHN+TA+bno5VJn7cWJtPe/vB1qg7+GvNw3cooroP+Pd
33
+ 2cGvFdPv4S4oxKYU84zVe32WRQKe+n+MD/wC17q3dMLOBd/6aKk5abXFtZFOndMn
34
+ WhQs04JgrcyE6lu109ilCjee26AbwXtufPEoOTiaGl7Bq5AqcNia9/1lcjRxbxGI
35
+ pMypEfoucyyqyj7Jl/UrpSEQ+kht4wz4MzsaIK/k978G2H1lvPccGxknSiHW5/I/
36
+ Kf0A+tvk/7CpmA==
37
+ -----END CERTIFICATE-----
38
+
39
+ date: 2010-07-15 00:00:00 -07:00
40
+ default_executable:
41
+ dependencies:
42
+ - !ruby/object:Gem::Dependency
43
+ name: rice
44
+ prerelease: false
45
+ requirement: &id001 !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ hash: 3
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :runtime
55
+ version_requirements: *id001
56
+ description: MediaInfo Ruby Bridge. Call MediaInfo lib directly
57
+ email: ""
58
+ executables: []
59
+
60
+ extensions:
61
+ - ext/mediainfo_ruby/extconf.rb
62
+ extra_rdoc_files:
63
+ - README.rdoc
64
+ - ext/mediainfo_ruby/extconf.rb
65
+ - ext/mediainfo_ruby/mediainfo_ruby.cpp
66
+ - lib/mediainfo-ruby.rb
67
+ files:
68
+ - Manifest
69
+ - README.rdoc
70
+ - Rakefile
71
+ - ext/mediainfo_ruby/extconf.rb
72
+ - ext/mediainfo_ruby/mediainfo_ruby.cpp
73
+ - lib/mediainfo-ruby.rb
74
+ - spec/fixtures/README
75
+ - spec/mediainfo_spec.rb
76
+ - mediainfo-ruby.gemspec
77
+ has_rdoc: true
78
+ homepage: http://github.com/hackerdude/mediainfo-ruby
79
+ licenses: []
80
+
81
+ post_install_message:
82
+ rdoc_options:
83
+ - --line-numbers
84
+ - --inline-source
85
+ - --title
86
+ - Mediainfo-ruby
87
+ - --main
88
+ - README.rdoc
89
+ require_paths:
90
+ - lib
91
+ - ext
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ hash: 11
107
+ segments:
108
+ - 1
109
+ - 2
110
+ version: "1.2"
111
+ requirements: []
112
+
113
+ rubyforge_project: mediainfo-ruby
114
+ rubygems_version: 1.3.7
115
+ signing_key:
116
+ specification_version: 3
117
+ summary: MediaInfo Ruby Bridge. Call MediaInfo lib directly
118
+ test_files: []
119
+
metadata.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ �x��Vl�4>��,�.��w:�n�G^���{LI����7l?h���-�H��T�1�1��Έ|
2
+ 2��X������^W�~3NT ���Q:[\)�g��;_��tƖ3��~�t�ey�hb�X�z�_�kH��x� uR��(`+A1Nэ/��@j�P�1�m�ӱ��K����X�&�$_C�jǬ�H.j�TE�Ь<�.~�A�'�-6�]��t�ޚ���9�~���Xs?�FED/�L��|!%E�