noodnik 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.md +52 -0
- data/Rakefile +39 -0
- data/app/assets/javascripts/noodnik/application.js +9 -0
- data/app/assets/javascripts/noodnik/nags.erb.coffee +12 -0
- data/app/assets/stylesheets/noodnik/application.css +7 -0
- data/app/assets/stylesheets/noodnik/nags.css +4 -0
- data/app/controllers/noodnik/application_controller.rb +4 -0
- data/app/controllers/noodnik/nags_controller.rb +47 -0
- data/app/helpers/noodnik/application_helper.rb +4 -0
- data/app/helpers/noodnik/nags_helper.rb +51 -0
- data/app/models/noodnik/nag.rb +4 -0
- data/app/views/layouts/application.html.erb +14 -0
- data/app/views/layouts/noodnik/application.html.erb +14 -0
- data/config/routes.rb +6 -0
- data/db/migrate/20110813042447_create_noodnik_nags.rb +11 -0
- data/db/migrate/20110813065655_add_user_id_to_nags.rb +5 -0
- data/db/migrate/20110813072011_add_topic_to_nags.rb +5 -0
- data/lib/noodnik.rb +10 -0
- data/lib/noodnik/engine.rb +5 -0
- data/lib/noodnik/railtie.rb +7 -0
- data/lib/tasks/noodnik_tasks.rake +4 -0
- data/test/dummy/Guardfile +29 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +9 -0
- data/test/dummy/app/assets/javascripts/home.js +2 -0
- data/test/dummy/app/assets/stylesheets/application.css +7 -0
- data/test/dummy/app/assets/stylesheets/home.css +4 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/home_controller.rb +4 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/home_helper.rb +2 -0
- data/test/dummy/app/views/home/index.html.erb +10 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +47 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +27 -0
- data/test/dummy/config/environments/production.rb +51 -0
- data/test/dummy/config/environments/test.rb +39 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/noodnik.rb +3 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +6 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20110813070108_create_noodnik_nags.rb +11 -0
- data/test/dummy/db/migrate/20110813070109_add_user_id_to_nags.rb +5 -0
- data/test/dummy/db/migrate/20110813072040_add_topic_to_nags.rb +5 -0
- data/test/dummy/db/schema.rb +24 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +10612 -0
- data/test/dummy/log/test.log +26879 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/spec/controllers/noodnik_nags_controller_spec.rb +121 -0
- data/test/dummy/spec/helpers/nags_helper_spec.rb +130 -0
- data/test/dummy/spec/spec_helper.rb +74 -0
- data/test/dummy/tmp/cache/assets/C7E/8B0/sprockets%2F1a26023e8a9ac4a7477d84b980511817 +0 -0
- data/test/dummy/tmp/cache/assets/C9B/0A0/sprockets%2Fc184c48971885500d230701da1c1b0fb +0 -0
- data/test/dummy/tmp/cache/assets/CC7/610/sprockets%2Fd85d521b5f5052344563eef989889de0 +0 -0
- data/test/dummy/tmp/cache/assets/CDF/870/sprockets%2Fb878faf942403e313a5b103e5d80488e +0 -0
- data/test/dummy/tmp/cache/assets/CF8/F90/sprockets%2F7c5977cba909e2f75909ced513698d03 +0 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -0
- data/test/dummy/tmp/cache/assets/D72/AD0/sprockets%2Fc4434fe69351b83a77ebaca291931fee +0 -0
- data/test/dummy/tmp/cache/assets/D7E/3B0/sprockets%2F942cff9f3e4e8a45ae06090e3d883e7b +0 -0
- data/test/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
- data/test/dummy/tmp/cache/assets/D98/8B0/sprockets%2Fedbef6e0d0a4742346cf479f2c522eb0 +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/E38/C70/sprockets%2F7e7577dbecc6d06993be00b9daabcd9f +0 -0
- data/test/dummy/tmp/pids/server.pid +1 -0
- metadata +184 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/404.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
23
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/422.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>The change you wanted was rejected.</h1>
|
23
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/500.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>We're sorry, but something went wrong.</h1>
|
23
|
+
<p>We've been notified about this issue and we'll take a look at it shortly.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
File without changes
|
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
+
require File.expand_path('../../config/boot', __FILE__)
|
6
|
+
require 'rails/commands'
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Noodnik::NagsController do
|
4
|
+
before :each do
|
5
|
+
@topic = :complete_your_registration
|
6
|
+
@attr = {use_route: :noodnik, topic: @topic}
|
7
|
+
|
8
|
+
Noodnik.setup do |config|
|
9
|
+
config.current_user_id = lambda { nil }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "when not signed in" do
|
14
|
+
before :each do
|
15
|
+
@cookies = mock('cookies')
|
16
|
+
controller.stub!(:cookies).and_return(@cookies)
|
17
|
+
set_current_user_id(nil)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "GET 'postpone'" do
|
21
|
+
before :each do
|
22
|
+
@attr.merge! period: 2.weeks
|
23
|
+
end
|
24
|
+
|
25
|
+
after :each do
|
26
|
+
cookies.clear
|
27
|
+
end
|
28
|
+
|
29
|
+
it "creates a cookie" do
|
30
|
+
@cookies.should_receive(:[]=)
|
31
|
+
get :postpone, @attr
|
32
|
+
end
|
33
|
+
|
34
|
+
it "sets the provided topic as the cookie name" do
|
35
|
+
@cookies.should_receive(:[]=).with(@topic.to_s, anything)
|
36
|
+
get :postpone, @attr
|
37
|
+
end
|
38
|
+
|
39
|
+
it "sets the next nag time correctly" do
|
40
|
+
@cookies.should_receive(:[]=).with(anything, 2.weeks.from_now.to_s)
|
41
|
+
get :postpone, @attr
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "GET 'complete'" do
|
46
|
+
it "removes the nag cookie" do
|
47
|
+
@cookies.should_receive(:delete).with(@topic.to_s)
|
48
|
+
get :complete, @attr
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "when signed in" do
|
54
|
+
before :each do
|
55
|
+
@user_id = 1
|
56
|
+
set_current_user_id(@user_id)
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "GET 'postpone'" do
|
60
|
+
before :each do
|
61
|
+
@attr.merge! period: 2.weeks
|
62
|
+
end
|
63
|
+
|
64
|
+
after :each do
|
65
|
+
Noodnik::Nag.delete_all
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "for the first time" do
|
69
|
+
before :each do
|
70
|
+
stub_time
|
71
|
+
get :postpone, @attr
|
72
|
+
end
|
73
|
+
|
74
|
+
it "creates a nag instance" do
|
75
|
+
Noodnik::Nag.count.should == 1
|
76
|
+
end
|
77
|
+
|
78
|
+
it "sets the correct user id" do
|
79
|
+
Noodnik::Nag.last.user_id.should == @user_id
|
80
|
+
end
|
81
|
+
|
82
|
+
it "sets the provided topic" do
|
83
|
+
Noodnik::Nag.last.topic.should == @topic.to_s
|
84
|
+
end
|
85
|
+
|
86
|
+
it "sets the next nag time correctly" do
|
87
|
+
Noodnik::Nag.last.next_nag.should == 2.weeks.from_now
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "not for the first time" do
|
92
|
+
it "modifies the next nag time correctly" do
|
93
|
+
nag = Noodnik::Nag.create! user_id: 1, topic: @topic
|
94
|
+
|
95
|
+
stub_time
|
96
|
+
get :postpone, @attr
|
97
|
+
nag.reload.next_nag.should == 2.weeks.from_now
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "GET 'complete'" do
|
103
|
+
it "marks the nag as complete" do
|
104
|
+
nag = Noodnik::Nag.create! user_id: 1, topic: @topic
|
105
|
+
get :complete, @attr
|
106
|
+
nag.reload.completed.should be_true
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def set_current_user_id(user_id)
|
112
|
+
Noodnik.setup do |config|
|
113
|
+
config.current_user_id = lambda { user_id }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def stub_time
|
118
|
+
t = Time.parse("01/01/2010 10:00")
|
119
|
+
Time.stub!(:now).and_return(t)
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Noodnik::NagsHelper do
|
4
|
+
|
5
|
+
describe "nag_user_to" do
|
6
|
+
before :each do
|
7
|
+
@topic = :register
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "when signed in" do
|
11
|
+
before :each do
|
12
|
+
@user_id = 1
|
13
|
+
Noodnik.setup do |config|
|
14
|
+
config.current_user_id = lambda { @user_id }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
after :each do
|
19
|
+
Noodnik::Nag.delete_all
|
20
|
+
end
|
21
|
+
|
22
|
+
it "yields the block in a div with class 'noodnik-nag'" do
|
23
|
+
helper.nag_user_to :register do |nag|
|
24
|
+
"I should be in a <div>!"
|
25
|
+
end.should match(%r[<div class="noodnik-nag">.*</div>])
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should yield the block for a new topic" do
|
29
|
+
helper.nag_user_to :register do |nag|
|
30
|
+
"Register!"
|
31
|
+
end.should include("Register!")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should not yield the block if postponed" do
|
35
|
+
Noodnik::Nag.create! user_id: @user_id, topic: @topic, next_nag: 2.weeks.from_now
|
36
|
+
|
37
|
+
helper.nag_user_to :register do |nag|
|
38
|
+
"I should not be returned!"
|
39
|
+
end.should be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should yield the block if postpone expired" do
|
43
|
+
Noodnik::Nag.create! user_id: @user_id, topic: @topic, next_nag: 1.week.ago
|
44
|
+
|
45
|
+
helper.nag_user_to :register do |nag|
|
46
|
+
"Register!"
|
47
|
+
end.should include("Register!")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should not yield the block if completed" do
|
51
|
+
Noodnik::Nag.create! user_id: @user_id, topic: @topic, next_nag: 10.weeks.ago, completed: true
|
52
|
+
|
53
|
+
helper.nag_user_to :register do |nag|
|
54
|
+
"I should not be returned!"
|
55
|
+
end.should be_nil
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "link_to" do
|
62
|
+
describe "with html_options provided" do
|
63
|
+
before :each do
|
64
|
+
@link = nag_user_to :register do
|
65
|
+
link_to 'google.com', 'www.google.com', class: 'foo'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it "adds 'data-noodnik-topic' with the correct topic" do
|
70
|
+
@link.should include('data-noodnik-topic="register"')
|
71
|
+
end
|
72
|
+
|
73
|
+
it "adds class 'noodnik-complete'" do
|
74
|
+
@link.should include("class=\"foo noodnik-complete\"")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "with no html_options provided" do
|
79
|
+
before :each do
|
80
|
+
@link = nag_user_to :register do
|
81
|
+
link_to 'google.com', 'www.google.com'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it "adds 'data-noodnik-topic' with the correct topic when no html_options provided" do
|
86
|
+
@link.should include('data-noodnik-topic="register"')
|
87
|
+
end
|
88
|
+
|
89
|
+
it "adds class 'noodnik-complete'" do
|
90
|
+
@link.should include("class=\"noodnik-complete\"")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "postpone_for" do
|
96
|
+
before :each do
|
97
|
+
@link = nag_user_to :register do
|
98
|
+
postpone_for 14.days
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
it "prompts a default message of 'Remind me in 14 days'" do
|
103
|
+
@link.should include('Remind me in 14 days')
|
104
|
+
end
|
105
|
+
|
106
|
+
it "links to /noodnik/postpone" do
|
107
|
+
@link.should include('/noodnik/postpone')
|
108
|
+
end
|
109
|
+
|
110
|
+
it "specifies the correct period in the link" do
|
111
|
+
@link.should include("period=#{14.days}")
|
112
|
+
end
|
113
|
+
|
114
|
+
it "specifies the correct topic" do
|
115
|
+
@link.should include("topic=register")
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should have class 'noodnik-postpone'" do
|
119
|
+
@link.should include("noodnik-postpone")
|
120
|
+
end
|
121
|
+
|
122
|
+
it "does not add class 'noodnik-complete'" do
|
123
|
+
@link.should_not include("noodnik-complete")
|
124
|
+
end
|
125
|
+
|
126
|
+
it "does not mark postpone links with 'data_noodnik_complete-path'" do
|
127
|
+
@link.should_not include("data-noodnik-complete-path=\"/noodnik/complete/register\"")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spork'
|
3
|
+
|
4
|
+
Spork.prefork do
|
5
|
+
# Loading more in this block will cause your tests to run faster. However,
|
6
|
+
# if you change any configuration or code from libraries loaded here, you'll
|
7
|
+
# need to restart spork for it take effect.
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
Spork.each_run do
|
12
|
+
# This code will be run each time you run your specs.
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
# --- Instructions ---
|
17
|
+
# Sort the contents of this file into a Spork.prefork and a Spork.each_run
|
18
|
+
# block.
|
19
|
+
#
|
20
|
+
# The Spork.prefork block is run only once when the spork server is started.
|
21
|
+
# You typically want to place most of your (slow) initializer code in here, in
|
22
|
+
# particular, require'ing any 3rd-party gems that you don't normally modify
|
23
|
+
# during development.
|
24
|
+
#
|
25
|
+
# The Spork.each_run block is run each time you run your specs. In case you
|
26
|
+
# need to load files that tend to change during development, require them here.
|
27
|
+
# With Rails, your application modules are loaded automatically, so sometimes
|
28
|
+
# this block can remain empty.
|
29
|
+
#
|
30
|
+
# Note: You can modify files loaded *from* the Spork.each_run block without
|
31
|
+
# restarting the spork server. However, this file itself will not be reloaded,
|
32
|
+
# so if you change any of the code inside the each_run block, you still need to
|
33
|
+
# restart the server. In general, if you have non-trivial code in this file,
|
34
|
+
# it's advisable to move it into a separate file so you can easily edit it
|
35
|
+
# without restarting spork. (For example, with RSpec, you could move
|
36
|
+
# non-trivial code into a file spec/support/my_helper.rb, making sure that the
|
37
|
+
# spec/support/* files are require'd from inside the each_run block.)
|
38
|
+
#
|
39
|
+
# Any code that is left outside the two blocks will be run during preforking
|
40
|
+
# *and* during each_run -- that's probably not what you want.
|
41
|
+
#
|
42
|
+
# These instructions should self-destruct in 10 seconds. If they don't, feel
|
43
|
+
# free to delete them.
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
49
|
+
ENV["RAILS_ENV"] ||= 'test'
|
50
|
+
require File.expand_path("../../config/environment", __FILE__)
|
51
|
+
require 'rspec/rails'
|
52
|
+
|
53
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
54
|
+
# in spec/support/ and its subdirectories.
|
55
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
56
|
+
|
57
|
+
RSpec.configure do |config|
|
58
|
+
# == Mock Framework
|
59
|
+
#
|
60
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
61
|
+
#
|
62
|
+
# config.mock_with :mocha
|
63
|
+
# config.mock_with :flexmock
|
64
|
+
# config.mock_with :rr
|
65
|
+
config.mock_with :rspec
|
66
|
+
|
67
|
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
68
|
+
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
69
|
+
|
70
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
71
|
+
# examples within a transaction, remove the following line or assign false
|
72
|
+
# instead of true.
|
73
|
+
#config.use_transactional_fixtures = true
|
74
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
11712
|