2013-10-28 14:22:06 +00:00
|
|
|
require 'spec_helper'
|
|
|
|
|
|
2013-11-23 08:18:12 +00:00
|
|
|
describe 'Musician search' do
|
2013-10-28 14:22:06 +00:00
|
|
|
|
|
|
|
|
before(:each) do
|
2014-05-20 14:46:45 +00:00
|
|
|
# @geocode1 = FactoryGirl.create(:geocoder)
|
|
|
|
|
# @geocode2 = FactoryGirl.create(:geocoder)
|
2014-05-26 19:16:01 +00:00
|
|
|
t = Time.now - 10.minute
|
|
|
|
|
|
|
|
|
|
@user1 = FactoryGirl.create(:user, created_at: t+1.minute, last_jam_locidispid: 1)
|
|
|
|
|
@user2 = FactoryGirl.create(:user, created_at: t+2.minute, last_jam_locidispid: 2)
|
|
|
|
|
@user3 = FactoryGirl.create(:user, created_at: t+3.minute, last_jam_locidispid: 3)
|
|
|
|
|
@user4 = FactoryGirl.create(:user, created_at: t+4.minute, last_jam_locidispid: 4)
|
|
|
|
|
@user5 = FactoryGirl.create(:user, created_at: t+5.minute, last_jam_locidispid: 5)
|
|
|
|
|
@user6 = FactoryGirl.create(:user, created_at: t+6.minute) # not geocoded
|
|
|
|
|
@user7 = FactoryGirl.create(:user, created_at: t+7.minute, musician: false) # not musician
|
|
|
|
|
|
|
|
|
|
@musicians = []
|
|
|
|
|
@musicians << @user1
|
|
|
|
|
@musicians << @user2
|
|
|
|
|
@musicians << @user3
|
|
|
|
|
@musicians << @user4
|
|
|
|
|
@musicians << @user5
|
|
|
|
|
@musicians << @user6
|
|
|
|
|
|
|
|
|
|
@geomusicians = []
|
|
|
|
|
@geomusicians << @user1
|
|
|
|
|
@geomusicians << @user2
|
|
|
|
|
@geomusicians << @user3
|
|
|
|
|
@geomusicians << @user4
|
|
|
|
|
@geomusicians << @user5
|
|
|
|
|
|
2014-07-29 04:04:56 +00:00
|
|
|
# from these scores:
|
|
|
|
|
# user1 has scores other users in user1 location, and with user2, user3, user4
|
|
|
|
|
# user2 has scores with users in user3 and user4 location
|
|
|
|
|
# Score.delete_all
|
2014-05-26 19:16:01 +00:00
|
|
|
Score.createx(1, 'a', 1, 1, 'a', 1, 10)
|
|
|
|
|
Score.createx(1, 'a', 1, 2, 'b', 2, 20)
|
|
|
|
|
Score.createx(1, 'a', 1, 3, 'c', 3, 30)
|
|
|
|
|
Score.createx(1, 'a', 1, 4, 'd', 4, 40)
|
|
|
|
|
Score.createx(2, 'b', 2, 3, 'c', 3, 15)
|
|
|
|
|
Score.createx(2, 'b', 2, 4, 'd', 4, 70)
|
2013-10-28 14:22:06 +00:00
|
|
|
end
|
|
|
|
|
|
2014-05-26 19:16:01 +00:00
|
|
|
context 'default filter settings' do
|
2013-10-28 17:03:58 +00:00
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
it "finds all musicians" do
|
2014-05-27 16:52:18 +00:00
|
|
|
# expects all the musicians (geocoded)
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({score_limit: Search::TEST_SCORE})
|
2014-05-26 19:16:01 +00:00
|
|
|
results.search_type.should == :musicians_filter
|
2014-07-29 04:04:56 +00:00
|
|
|
results.results.count.should == @musicians.length
|
|
|
|
|
results.results.should eq @musicians.reverse
|
2014-05-26 19:16:01 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "finds all musicians page 1" do
|
|
|
|
|
# expects all the musicians
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({page: 1, score_limit: Search::TEST_SCORE})
|
2014-05-26 19:16:01 +00:00
|
|
|
results.search_type.should == :musicians_filter
|
2014-07-29 04:04:56 +00:00
|
|
|
results.results.count.should == @musicians.length
|
|
|
|
|
results.results.should eq @musicians.reverse
|
2014-05-26 19:16:01 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "finds all musicians page 2" do
|
|
|
|
|
# expects no musicians (all fit on page 1)
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({page: 2, score_limit: Search::TEST_SCORE})
|
2014-05-26 19:16:01 +00:00
|
|
|
results.search_type.should == :musicians_filter
|
|
|
|
|
results.results.count.should == 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "finds all musicians page 1 per_page 3" do
|
|
|
|
|
# expects three of the musicians
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({per_page: 3, score_limit: Search::TEST_SCORE})
|
2014-05-26 19:16:01 +00:00
|
|
|
results.search_type.should == :musicians_filter
|
|
|
|
|
results.results.count.should == 3
|
2014-07-29 04:04:56 +00:00
|
|
|
results.results.should eq @musicians.reverse.slice(0, 3)
|
2014-05-26 19:16:01 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "finds all musicians page 2 per_page 3" do
|
|
|
|
|
# expects two of the musicians
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({page: 2, per_page: 3, score_limit: Search::TEST_SCORE})
|
2014-05-26 19:16:01 +00:00
|
|
|
results.search_type.should == :musicians_filter
|
2014-07-29 04:04:56 +00:00
|
|
|
results.results.count.should == 3
|
|
|
|
|
results.results.should eq @musicians.reverse.slice(3, 3)
|
2014-05-26 19:16:01 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "finds all musicians page 3 per_page 3" do
|
|
|
|
|
# expects two of the musicians
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({page: 3, per_page: 3, score_limit: Search::TEST_SCORE})
|
2014-05-26 19:16:01 +00:00
|
|
|
results.search_type.should == :musicians_filter
|
|
|
|
|
results.results.count.should == 0
|
2013-10-28 17:03:58 +00:00
|
|
|
end
|
|
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
it "sorts musicians by followers" do
|
|
|
|
|
# establish sorting order
|
2014-02-16 07:28:35 +00:00
|
|
|
|
|
|
|
|
# @user4
|
|
|
|
|
f1 = Follow.new
|
|
|
|
|
f1.user = @user2
|
|
|
|
|
f1.followable = @user4
|
|
|
|
|
f1.save
|
|
|
|
|
|
|
|
|
|
f2 = Follow.new
|
|
|
|
|
f2.user = @user3
|
|
|
|
|
f2.followable = @user4
|
|
|
|
|
f2.save
|
|
|
|
|
|
|
|
|
|
f3 = Follow.new
|
|
|
|
|
f3.user = @user4
|
|
|
|
|
f3.followable = @user4
|
|
|
|
|
f3.save
|
|
|
|
|
|
|
|
|
|
# @user3
|
|
|
|
|
f4 = Follow.new
|
|
|
|
|
f4.user = @user3
|
|
|
|
|
f4.followable = @user3
|
|
|
|
|
f4.save
|
|
|
|
|
|
|
|
|
|
f5 = Follow.new
|
|
|
|
|
f5.user = @user4
|
|
|
|
|
f5.followable = @user3
|
|
|
|
|
f5.save
|
|
|
|
|
|
2014-02-16 13:40:03 +00:00
|
|
|
# @user2
|
2014-02-16 07:28:35 +00:00
|
|
|
f6 = Follow.new
|
|
|
|
|
f6.user = @user1
|
|
|
|
|
f6.followable = @user2
|
|
|
|
|
f6.save
|
|
|
|
|
|
|
|
|
|
# @user4.followers.concat([@user2, @user3, @user4])
|
|
|
|
|
# @user3.followers.concat([@user3, @user4])
|
|
|
|
|
# @user2.followers.concat([@user1])
|
2013-11-23 06:04:33 +00:00
|
|
|
expect(@user4.followers.count).to be 3
|
2014-02-16 07:28:35 +00:00
|
|
|
expect(Follow.count).to be 6
|
2013-11-05 14:49:31 +00:00
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
# refresh the order to ensure it works right
|
2014-02-16 07:28:35 +00:00
|
|
|
f1 = Follow.new
|
|
|
|
|
f1.user = @user3
|
|
|
|
|
f1.followable = @user2
|
|
|
|
|
f1.save
|
|
|
|
|
|
|
|
|
|
f2 = Follow.new
|
|
|
|
|
f2.user = @user4
|
|
|
|
|
f2.followable = @user2
|
|
|
|
|
f2.save
|
|
|
|
|
|
|
|
|
|
f3 = Follow.new
|
|
|
|
|
f3.user = @user2
|
|
|
|
|
f3.followable = @user2
|
|
|
|
|
f3.save
|
|
|
|
|
|
|
|
|
|
# @user2.followers.concat([@user3, @user4, @user2])
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({ :per_page => @musicians.size, score_limit: Search::TEST_SCORE, orderby: 'followed'}, @user3)
|
2014-01-12 07:48:15 +00:00
|
|
|
expect(results.results[0].id).to eq(@user2.id)
|
2013-11-23 06:04:33 +00:00
|
|
|
|
|
|
|
|
# check the follower count for given entry
|
2014-01-12 07:48:15 +00:00
|
|
|
expect(results.results[0].search_follow_count.to_i).not_to eq(0)
|
2013-11-23 06:04:33 +00:00
|
|
|
# check the follow relationship between current_user and result
|
|
|
|
|
expect(results.is_follower?(@user2)).to be true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'paginates properly' do
|
|
|
|
|
# make sure pagination works right
|
2014-07-29 04:04:56 +00:00
|
|
|
params = { :per_page => 2, :page => 1 , score_limit: Search::TEST_SCORE}
|
2014-01-11 12:26:40 +00:00
|
|
|
results = Search.musician_filter(params)
|
2014-01-12 07:48:15 +00:00
|
|
|
expect(results.results.count).to be 2
|
2013-11-23 06:04:33 +00:00
|
|
|
end
|
2013-11-05 10:14:34 +00:00
|
|
|
|
2013-11-05 12:25:36 +00:00
|
|
|
end
|
|
|
|
|
|
2013-11-23 08:18:12 +00:00
|
|
|
def make_recording(usr)
|
2014-05-29 02:19:50 +00:00
|
|
|
connection = FactoryGirl.create(:connection, :user => usr, locidispid: usr.last_jam_locidispid)
|
2013-11-05 12:25:36 +00:00
|
|
|
instrument = FactoryGirl.create(:instrument, :description => 'a great instrument')
|
|
|
|
|
track = FactoryGirl.create(:track, :connection => connection, :instrument => instrument)
|
2014-05-06 13:34:38 +00:00
|
|
|
music_session = FactoryGirl.create(:active_music_session, :creator => usr, :musician_access => true)
|
2014-04-29 03:38:30 +00:00
|
|
|
# music_session.connections << connection
|
2014-05-29 02:19:50 +00:00
|
|
|
# music_session.save
|
2014-06-09 20:43:16 +00:00
|
|
|
connection.join_the_session(music_session, true, nil, usr, 10)
|
2013-11-23 08:18:12 +00:00
|
|
|
recording = Recording.start(music_session, usr)
|
2013-11-05 12:25:36 +00:00
|
|
|
recording.stop
|
|
|
|
|
recording.reload
|
|
|
|
|
genre = FactoryGirl.create(:genre)
|
2014-02-22 05:09:39 +00:00
|
|
|
recording.claim(usr, "name", "description", genre, true)
|
2013-11-05 12:25:36 +00:00
|
|
|
recording.reload
|
2013-11-15 22:35:55 +00:00
|
|
|
recording
|
|
|
|
|
end
|
|
|
|
|
|
2013-11-23 08:18:12 +00:00
|
|
|
def make_session(usr)
|
2014-05-29 02:19:50 +00:00
|
|
|
connection = FactoryGirl.create(:connection, :user => usr, locidispid: usr.last_jam_locidispid)
|
2014-05-06 13:34:38 +00:00
|
|
|
music_session = FactoryGirl.create(:active_music_session, :creator => usr, :musician_access => true)
|
2014-04-29 03:38:30 +00:00
|
|
|
# music_session.connections << connection
|
2014-05-29 02:19:50 +00:00
|
|
|
# music_session.save
|
2014-06-09 20:43:16 +00:00
|
|
|
connection.join_the_session(music_session, true, nil, usr, 10)
|
2013-11-23 08:18:12 +00:00
|
|
|
end
|
|
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
context 'musician stat counters' do
|
|
|
|
|
|
2013-11-23 08:18:12 +00:00
|
|
|
it "displays musicians top followings" do
|
2014-02-16 07:28:35 +00:00
|
|
|
f1 = Follow.new
|
|
|
|
|
f1.user = @user4
|
|
|
|
|
f1.followable = @user4
|
|
|
|
|
f1.save
|
|
|
|
|
|
|
|
|
|
f2 = Follow.new
|
|
|
|
|
f2.user = @user4
|
|
|
|
|
f2.followable = @user3
|
|
|
|
|
f2.save
|
|
|
|
|
|
|
|
|
|
f3 = Follow.new
|
|
|
|
|
f3.user = @user4
|
|
|
|
|
f3.followable = @user2
|
|
|
|
|
f3.save
|
|
|
|
|
|
|
|
|
|
# @user4.followers.concat([@user4])
|
|
|
|
|
# @user3.followers.concat([@user4])
|
|
|
|
|
# @user2.followers.concat([@user4])
|
2014-05-26 19:16:01 +00:00
|
|
|
expect(@user4.top_followings.count).to eq 3
|
|
|
|
|
expect(@user4.top_followings.map(&:id)).to match_array((@musicians - [@user1, @user5, @user6]).map(&:id))
|
2013-11-23 08:18:12 +00:00
|
|
|
end
|
|
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
it "friends stat shows friend count" do
|
|
|
|
|
# create friendship record
|
|
|
|
|
Friendship.save(@user1.id, @user2.id)
|
|
|
|
|
# search on user2
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({score_limit: Search::TEST_SCORE}, @user2)
|
2014-01-12 07:48:15 +00:00
|
|
|
friend = results.results.detect { |mm| mm.id == @user1.id }
|
2013-11-23 06:04:33 +00:00
|
|
|
expect(friend).to_not be_nil
|
|
|
|
|
expect(results.friend_count(friend)).to be 1
|
|
|
|
|
@user1.reload
|
|
|
|
|
expect(friend.friends?(@user2)).to be true
|
|
|
|
|
expect(results.is_friend?(@user1)).to be true
|
|
|
|
|
end
|
2013-10-28 14:22:06 +00:00
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
it "recording stat shows recording count" do
|
2014-05-29 02:19:50 +00:00
|
|
|
Recording.delete_all
|
|
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
recording = make_recording(@user1)
|
|
|
|
|
expect(recording.users.length).to be 1
|
|
|
|
|
expect(recording.users.first).to eq(@user1)
|
|
|
|
|
@user1.reload
|
|
|
|
|
expect(@user1.recordings.length).to be 1
|
|
|
|
|
expect(@user1.recordings.first).to eq(recording)
|
|
|
|
|
expect(recording.claimed_recordings.length).to be 1
|
|
|
|
|
expect(@user1.recordings.detect { |rr| rr == recording }).to_not be_nil
|
|
|
|
|
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({score_limit: Search::TEST_SCORE},@user1)
|
2014-05-29 02:19:50 +00:00
|
|
|
# puts "====================== results #{results.inspect}"
|
2014-01-12 07:48:15 +00:00
|
|
|
uu = results.results.detect { |mm| mm.id == @user1.id }
|
2013-11-23 06:04:33 +00:00
|
|
|
expect(uu).to_not be_nil
|
|
|
|
|
|
|
|
|
|
expect(results.record_count(uu)).to be 1
|
|
|
|
|
expect(results.session_count(uu)).to be 1
|
|
|
|
|
end
|
2013-10-28 14:22:06 +00:00
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
context 'musician sorting' do
|
|
|
|
|
|
|
|
|
|
it "by plays" do
|
2014-05-29 02:19:50 +00:00
|
|
|
Recording.delete_all
|
|
|
|
|
|
2013-11-23 06:04:33 +00:00
|
|
|
make_recording(@user1)
|
|
|
|
|
# order results by num recordings
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({ orderby: 'plays', score_limit: Search::TEST_SCORE}, @user2)
|
2014-05-29 02:19:50 +00:00
|
|
|
# puts "========= results #{results.inspect}"
|
|
|
|
|
expect(results.results.length).to eq(2)
|
2014-01-12 07:48:15 +00:00
|
|
|
expect(results.results[0].id).to eq(@user1.id)
|
2014-05-29 02:19:50 +00:00
|
|
|
expect(results.results[1].id).to eq(@user3.id)
|
2013-11-23 06:04:33 +00:00
|
|
|
|
|
|
|
|
# add more data and make sure order still correct
|
2014-05-29 02:19:50 +00:00
|
|
|
make_recording(@user3)
|
|
|
|
|
make_recording(@user3)
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({ :orderby => 'plays', score_limit: Search::TEST_SCORE }, @user2)
|
2014-05-29 02:19:50 +00:00
|
|
|
expect(results.results.length).to eq(2)
|
|
|
|
|
expect(results.results[0].id).to eq(@user3.id)
|
|
|
|
|
expect(results.results[1].id).to eq(@user1.id)
|
2013-11-23 06:04:33 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "by now playing" do
|
2014-07-29 04:04:56 +00:00
|
|
|
pending "these tests worked, so leaving them in, but we don't currently have 'Now Playing' in the find musicians screen"
|
2013-11-23 08:18:12 +00:00
|
|
|
# should get 1 result with 1 active session
|
2014-05-29 02:19:50 +00:00
|
|
|
make_session(@user1)
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({ :orderby => 'playing', score_limit: Search::TEST_SCORE}, @user2)
|
2014-01-12 07:48:15 +00:00
|
|
|
expect(results.results.count).to be 1
|
2014-05-29 02:19:50 +00:00
|
|
|
expect(results.results.first.id).to eq(@user1.id)
|
2013-11-23 08:18:12 +00:00
|
|
|
|
|
|
|
|
# should get 2 results with 2 active sessions
|
|
|
|
|
# sort order should be created_at DESC
|
2014-05-29 02:19:50 +00:00
|
|
|
make_session(@user3)
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({ :orderby => 'playing', score_limit: Search::TEST_SCORE}, @user2)
|
2014-01-12 07:48:15 +00:00
|
|
|
expect(results.results.count).to be 2
|
2014-05-29 02:19:50 +00:00
|
|
|
expect(results.results[0].id).to eq(@user3.id)
|
|
|
|
|
expect(results.results[1].id).to eq(@user1.id)
|
2013-11-23 06:04:33 +00:00
|
|
|
end
|
|
|
|
|
|
2013-11-23 08:18:12 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
context 'filter settings' do
|
|
|
|
|
it "searches musicisns for an instrument" do
|
2013-11-23 06:04:33 +00:00
|
|
|
minst = FactoryGirl.create(:musician_instrument, {
|
|
|
|
|
:user => @user1,
|
|
|
|
|
:instrument => Instrument.find('tuba') })
|
|
|
|
|
@user1.musician_instruments << minst
|
|
|
|
|
@user1.reload
|
|
|
|
|
ii = @user1.instruments.detect { |inst| inst.id == 'tuba' }
|
2013-11-23 08:18:12 +00:00
|
|
|
expect(ii).to_not be_nil
|
2014-07-29 04:04:56 +00:00
|
|
|
results = Search.musician_filter({ :instrument => ii.id, score_limit: Search::TEST_SCORE })
|
2014-01-12 07:48:15 +00:00
|
|
|
results.results.each do |rr|
|
2013-11-23 08:18:12 +00:00
|
|
|
expect(rr.instruments.detect { |inst| inst.id=='tuba' }.id).to eq(ii.id)
|
2013-11-23 06:04:33 +00:00
|
|
|
end
|
2014-01-12 07:48:15 +00:00
|
|
|
expect(results.results.count).to be 1
|
2013-11-23 08:18:12 +00:00
|
|
|
end
|
2013-10-28 14:22:06 +00:00
|
|
|
end
|
2013-11-05 15:07:02 +00:00
|
|
|
|
2013-11-23 08:18:12 +00:00
|
|
|
context 'new users' do
|
2013-11-26 06:03:42 +00:00
|
|
|
|
2014-05-26 19:16:01 +00:00
|
|
|
it "find three for user1" do
|
|
|
|
|
# user2..4 are scored against user1
|
|
|
|
|
ms = Search.new_musicians(@user1, Time.now - 1.week)
|
|
|
|
|
ms.should_not be_nil
|
|
|
|
|
ms.length.should == 3
|
|
|
|
|
ms.should eq [@user2, @user3, @user4]
|
2013-11-17 23:29:23 +00:00
|
|
|
end
|
2013-11-26 06:03:42 +00:00
|
|
|
|
2014-05-26 19:16:01 +00:00
|
|
|
it "find two for user2" do
|
|
|
|
|
# user1,3,4 are scored against user1, but user4 is bad
|
|
|
|
|
ms = Search.new_musicians(@user2, Time.now - 1.week)
|
|
|
|
|
ms.should_not be_nil
|
|
|
|
|
ms.length.should == 2
|
|
|
|
|
ms.should eq [@user3, @user1]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "find two for user3" do
|
|
|
|
|
# user1..2 are scored against user3
|
|
|
|
|
ms = Search.new_musicians(@user3, Time.now - 1.week)
|
|
|
|
|
ms.should_not be_nil
|
|
|
|
|
ms.length.should == 2
|
|
|
|
|
ms.should eq [@user2, @user1]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "find one for user4" do
|
|
|
|
|
# user1..2 are scored against user4, but user2 is bad
|
|
|
|
|
ms = Search.new_musicians(@user4, Time.now - 1.week)
|
|
|
|
|
ms.should_not be_nil
|
|
|
|
|
ms.length.should == 1
|
|
|
|
|
ms.should eq [@user1]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "find none for user5" do
|
|
|
|
|
# user1..4 are not scored against user5
|
|
|
|
|
ms = Search.new_musicians(@user5, Time.now - 1.week)
|
|
|
|
|
ms.should_not be_nil
|
|
|
|
|
ms.length.should == 0
|
2013-11-26 06:03:42 +00:00
|
|
|
end
|
|
|
|
|
|
2013-11-17 23:29:23 +00:00
|
|
|
end
|
|
|
|
|
|
2013-10-28 14:22:06 +00:00
|
|
|
end
|